Merge branch 'langgenius:main' into deploy

pull/18407/head
lska367 1 year ago committed by GitHub
commit b094d40879
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -163,7 +163,7 @@ const SettingBuiltInTool: FC<Props> = ({
footer={null} footer={null}
mask={false} mask={false}
positionCenter={false} positionCenter={false}
panelClassname={cn('mb-2 mr-2 mt-[64px] !w-[420px] !max-w-[420px] justify-start rounded-2xl border-[0.5px] border-components-panel-border !bg-components-panel-bg !p-0 shadow-xl')} panelClassName={cn('mb-2 mr-2 mt-[64px] !w-[420px] !max-w-[420px] justify-start rounded-2xl border-[0.5px] border-components-panel-border !bg-components-panel-bg !p-0 shadow-xl')}
> >
<> <>
{isLoading && <Loading type='app' />} {isLoading && <Loading type='app' />}

@ -97,7 +97,7 @@ const Item: FC<ItemProps> = ({
<RiDeleteBinLine className='h-4 w-4' /> <RiDeleteBinLine className='h-4 w-4' />
</div> </div>
</div> </div>
<Drawer isOpen={showSettingsModal} onClose={() => setShowSettingsModal(false)} footer={null} mask={isMobile} panelClassname='mt-16 mx-2 sm:mr-2 mb-3 !p-0 !max-w-[640px] rounded-xl'> <Drawer isOpen={showSettingsModal} onClose={() => setShowSettingsModal(false)} footer={null} mask={isMobile} panelClassName='mt-16 mx-2 sm:mr-2 mb-3 !p-0 !max-w-[640px] rounded-xl'>
<SettingsModal <SettingsModal
currentDataset={config} currentDataset={config}
onCancel={() => setShowSettingsModal(false)} onCancel={() => setShowSettingsModal(false)}

@ -62,13 +62,13 @@ const SettingsModal: FC<SettingsModalProps> = ({
const { notify } = useToastContext() const { notify } = useToastContext()
const ref = useRef(null) const ref = useRef(null)
const isExternal = currentDataset.provider === 'external' const isExternal = currentDataset.provider === 'external'
const [topK, setTopK] = useState(currentDataset?.external_retrieval_model.top_k ?? 2)
const [scoreThreshold, setScoreThreshold] = useState(currentDataset?.external_retrieval_model.score_threshold ?? 0.5)
const [scoreThresholdEnabled, setScoreThresholdEnabled] = useState(currentDataset?.external_retrieval_model.score_threshold_enabled ?? false)
const { setShowAccountSettingModal } = useModalContext() const { setShowAccountSettingModal } = useModalContext()
const [loading, setLoading] = useState(false) const [loading, setLoading] = useState(false)
const { isCurrentWorkspaceDatasetOperator } = useAppContext() const { isCurrentWorkspaceDatasetOperator } = useAppContext()
const [localeCurrentDataset, setLocaleCurrentDataset] = useState({ ...currentDataset }) const [localeCurrentDataset, setLocaleCurrentDataset] = useState({ ...currentDataset })
const [topK, setTopK] = useState(localeCurrentDataset?.external_retrieval_model.top_k ?? 2)
const [scoreThreshold, setScoreThreshold] = useState(localeCurrentDataset?.external_retrieval_model.score_threshold ?? 0.5)
const [scoreThresholdEnabled, setScoreThresholdEnabled] = useState(localeCurrentDataset?.external_retrieval_model.score_threshold_enabled ?? false)
const [selectedMemberIDs, setSelectedMemberIDs] = useState<string[]>(currentDataset.partial_member_list || []) const [selectedMemberIDs, setSelectedMemberIDs] = useState<string[]>(currentDataset.partial_member_list || [])
const [memberList, setMemberList] = useState<Member[]>([]) const [memberList, setMemberList] = useState<Member[]>([])
@ -88,6 +88,14 @@ const SettingsModal: FC<SettingsModalProps> = ({
setScoreThreshold(data.score_threshold) setScoreThreshold(data.score_threshold)
if (data.score_threshold_enabled !== undefined) if (data.score_threshold_enabled !== undefined)
setScoreThresholdEnabled(data.score_threshold_enabled) setScoreThresholdEnabled(data.score_threshold_enabled)
setLocaleCurrentDataset({
...localeCurrentDataset,
external_retrieval_model: {
...localeCurrentDataset?.external_retrieval_model,
...data,
},
})
} }
const handleSave = async () => { const handleSave = async () => {

@ -743,7 +743,7 @@ const ConversationList: FC<IConversationList> = ({ logs, appDetail, onRefresh })
onClose={onCloseDrawer} onClose={onCloseDrawer}
mask={isMobile} mask={isMobile}
footer={null} footer={null}
panelClassname='mt-16 mx-2 sm:mr-2 mb-4 !p-0 !max-w-[640px] rounded-xl bg-components-panel-bg' panelClassName='mt-16 mx-2 sm:mr-2 mb-4 !p-0 !max-w-[640px] rounded-xl bg-components-panel-bg'
> >
<DrawerContext.Provider value={{ <DrawerContext.Provider value={{
onClose: onCloseDrawer, onClose: onCloseDrawer,

@ -134,7 +134,7 @@ const WorkflowAppLogList: FC<ILogs> = ({ logs, appDetail, onRefresh }) => {
onClose={onCloseDrawer} onClose={onCloseDrawer}
mask={isMobile} mask={isMobile}
footer={null} footer={null}
panelClassname='mt-16 mx-2 sm:mr-2 mb-3 !p-0 !max-w-[600px] rounded-xl border border-components-panel-border' panelClassName='mt-16 mx-2 sm:mr-2 mb-3 !p-0 !max-w-[600px] rounded-xl border border-components-panel-border'
> >
<DetailPanel onClose={onCloseDrawer} runID={currentLog?.workflow_run.id || ''} /> <DetailPanel onClose={onCloseDrawer} runID={currentLog?.workflow_run.id || ''} />
</Drawer> </Drawer>

@ -80,8 +80,30 @@ export const useEmbeddedChatbot = () => {
}, []) }, [])
useEffect(() => { useEffect(() => {
if (appInfo?.site.default_language) const setLanguageFromParams = async () => {
changeLanguage(appInfo.site.default_language) // Check URL parameters for language override
const urlParams = new URLSearchParams(window.location.search)
const localeParam = urlParams.get('locale')
// Check for encoded system variables
const systemVariables = await getProcessedSystemVariablesFromUrlParams()
const localeFromSysVar = systemVariables.locale
if (localeParam) {
// If locale parameter exists in URL, use it instead of default
changeLanguage(localeParam)
}
else if (localeFromSysVar) {
// If locale is set as a system variable, use that
changeLanguage(localeFromSysVar)
}
else if (appInfo?.site.default_language) {
// Otherwise use the default from app config
changeLanguage(appInfo.site.default_language)
}
}
setLanguageFromParams()
}, [appInfo]) }, [appInfo])
const [conversationIdInfo, setConversationIdInfo] = useLocalStorageState<Record<string, Record<string, string>>>(CONVERSATION_ID_INFO, { const [conversationIdInfo, setConversationIdInfo] = useLocalStorageState<Record<string, Record<string, string>>>(CONVERSATION_ID_INFO, {

@ -9,6 +9,8 @@ import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
type Props = { type Props = {
isShow: boolean isShow: boolean
onHide: () => void onHide: () => void
dialogClassName?: string
dialogBackdropClassName?: string
panelClassName?: string panelClassName?: string
maxWidthClassName?: string maxWidthClassName?: string
contentClassName?: string contentClassName?: string
@ -26,6 +28,8 @@ type Props = {
const DrawerPlus: FC<Props> = ({ const DrawerPlus: FC<Props> = ({
isShow, isShow,
onHide, onHide,
dialogClassName = '',
dialogBackdropClassName = '',
panelClassName = '', panelClassName = '',
maxWidthClassName = '!max-w-[640px]', maxWidthClassName = '!max-w-[640px]',
height = 'calc(100vh - 72px)', height = 'calc(100vh - 72px)',
@ -55,7 +59,9 @@ const DrawerPlus: FC<Props> = ({
footer={null} footer={null}
mask={isMobile || isShowMask} mask={isMobile || isShowMask}
positionCenter={positionCenter} positionCenter={positionCenter}
panelClassname={cn('mx-2 mb-3 mt-16 rounded-xl !p-0 sm:mr-2', panelClassName, maxWidthClassName)} dialogClassName={dialogClassName}
dialogBackdropClassName={dialogBackdropClassName}
panelClassName={cn('mx-2 mb-3 mt-16 rounded-xl !p-0 sm:mr-2', panelClassName, maxWidthClassName)}
> >
<div <div
className={cn(contentClassName, 'flex w-full flex-col rounded-xl border-[0.5px] border-divider-subtle bg-components-panel-bg shadow-xl')} className={cn(contentClassName, 'flex w-full flex-col rounded-xl border-[0.5px] border-divider-subtle bg-components-panel-bg shadow-xl')}

@ -8,7 +8,9 @@ import cn from '@/utils/classnames'
export type IDrawerProps = { export type IDrawerProps = {
title?: string title?: string
description?: string description?: string
panelClassname?: string dialogClassName?: string
dialogBackdropClassName?: string
panelClassName?: string
children: React.ReactNode children: React.ReactNode
footer?: React.ReactNode footer?: React.ReactNode
mask?: boolean mask?: boolean
@ -25,7 +27,9 @@ export type IDrawerProps = {
export default function Drawer({ export default function Drawer({
title = '', title = '',
description = '', description = '',
panelClassname = '', dialogClassName = '',
dialogBackdropClassName = '',
panelClassName = '',
children, children,
footer, footer,
mask = true, mask = true,
@ -44,17 +48,17 @@ export default function Drawer({
unmount={unmount} unmount={unmount}
open={isOpen} open={isOpen}
onClose={() => !clickOutsideNotOpen && onClose()} onClose={() => !clickOutsideNotOpen && onClose()}
className="fixed inset-0 z-[80] overflow-y-auto" className={cn('fixed inset-0 z-[30] overflow-y-auto', dialogClassName)}
> >
<div className={cn('flex h-screen w-screen justify-end', positionCenter && '!justify-center')}> <div className={cn('flex h-screen w-screen justify-end', positionCenter && '!justify-center')}>
{/* mask */} {/* mask */}
<DialogBackdrop <DialogBackdrop
className={cn('fixed inset-0 z-[90]', mask && 'bg-black bg-opacity-30')} className={cn('fixed inset-0 z-[40]', mask && 'bg-black/30', dialogBackdropClassName)}
onClick={() => { onClick={() => {
!clickOutsideNotOpen && onClose() !clickOutsideNotOpen && onClose()
}} }}
/> />
<div className={cn('relative z-[100] flex w-full max-w-sm flex-col justify-between overflow-hidden bg-components-panel-bg p-6 text-left align-middle shadow-xl', panelClassname)}> <div className={cn('relative z-[50] flex w-full max-w-sm flex-col justify-between overflow-hidden bg-components-panel-bg p-6 text-left align-middle shadow-xl', panelClassName)}>
<> <>
<div className='flex justify-between'> <div className='flex justify-between'>
{title && <DialogTitle {title && <DialogTitle

@ -252,7 +252,7 @@ const Img = ({ src }: any) => {
return <div className="markdown-img-wrapper"><ImageGallery srcs={[src]} /></div> return <div className="markdown-img-wrapper"><ImageGallery srcs={[src]} /></div>
} }
const Link = ({ node, ...props }: any) => { const Link = ({ node, children, ...props }: any) => {
if (node.properties?.href && node.properties.href?.toString().startsWith('abbr')) { if (node.properties?.href && node.properties.href?.toString().startsWith('abbr')) {
// eslint-disable-next-line react-hooks/rules-of-hooks // eslint-disable-next-line react-hooks/rules-of-hooks
const { onSend } = useChatContext() const { onSend } = useChatContext()
@ -261,7 +261,7 @@ const Link = ({ node, ...props }: any) => {
return <abbr className="cursor-pointer underline !decoration-primary-700 decoration-dashed" onClick={() => onSend?.(hidden_text)} title={node.children[0]?.value}>{node.children[0]?.value}</abbr> return <abbr className="cursor-pointer underline !decoration-primary-700 decoration-dashed" onClick={() => onSend?.(hidden_text)} title={node.children[0]?.value}>{node.children[0]?.value}</abbr>
} }
else { else {
return <a {...props} target="_blank" className="cursor-pointer underline !decoration-primary-700 decoration-dashed">{node.children[0] ? node.children[0]?.value : 'Download'}</a> return <a {...props} target="_blank" className="cursor-pointer underline !decoration-primary-700 decoration-dashed">{children || 'Download'}</a>
} }
} }

@ -31,6 +31,7 @@ import { useOptions } from './hooks'
import type { PickerBlockMenuOption } from './menu' import type { PickerBlockMenuOption } from './menu'
import VarReferenceVars from '@/app/components/workflow/nodes/_base/components/variable/var-reference-vars' import VarReferenceVars from '@/app/components/workflow/nodes/_base/components/variable/var-reference-vars'
import { useEventEmitterContextContext } from '@/context/event-emitter' import { useEventEmitterContextContext } from '@/context/event-emitter'
import { KEY_ESCAPE_COMMAND } from 'lexical'
type ComponentPickerProps = { type ComponentPickerProps = {
triggerString: string triggerString: string
@ -118,6 +119,13 @@ const ComponentPicker = ({
editor.dispatchCommand(INSERT_WORKFLOW_VARIABLE_BLOCK_COMMAND, variables) editor.dispatchCommand(INSERT_WORKFLOW_VARIABLE_BLOCK_COMMAND, variables)
}, [editor, checkForTriggerMatch, triggerString]) }, [editor, checkForTriggerMatch, triggerString])
const handleClose = useCallback(() => {
ReactDOM.flushSync(() => {
const escapeEvent = new KeyboardEvent('keydown', { key: 'Escape' })
editor.dispatchCommand(KEY_ESCAPE_COMMAND, escapeEvent)
})
}, [editor])
const renderMenu = useCallback<MenuRenderFn<PickerBlockMenuOption>>(( const renderMenu = useCallback<MenuRenderFn<PickerBlockMenuOption>>((
anchorElementRef, anchorElementRef,
{ options, selectedIndex, selectOptionAndCleanUp, setHighlightedIndex }, { options, selectedIndex, selectOptionAndCleanUp, setHighlightedIndex },
@ -141,51 +149,54 @@ const ComponentPicker = ({
visibility: isPositioned ? 'visible' : 'hidden', visibility: isPositioned ? 'visible' : 'hidden',
}} }}
ref={refs.setFloating} ref={refs.setFloating}
data-testid="component-picker-container"
> >
{ {
options.map((option, index) => ( workflowVariableBlock?.show && (
<Fragment key={option.key}> <div className='p-1'>
{ <VarReferenceVars
// Divider searchBoxClassName='mt-1'
index !== 0 && options.at(index - 1)?.group !== option.group && ( vars={workflowVariableOptions}
<div className='my-1 h-px w-full -translate-x-1 bg-divider-subtle'></div> onChange={(variables: string[]) => {
) handleSelectWorkflowVariable(variables)
} }}
{option.renderMenuOption({ maxHeightClass='max-h-[34vh]'
queryString, isSupportFileVar={isSupportFileVar}
isSelected: selectedIndex === index, onClose={handleClose}
onSelect: () => { onBlur={handleClose}
selectOptionAndCleanUp(option) />
}, </div>
onSetHighlight: () => { )
setHighlightedIndex(index)
},
})}
</Fragment>
))
} }
{ {
workflowVariableBlock?.show && ( workflowVariableBlock?.show && !!options.length && (
<> <div className='my-1 h-px w-full -translate-x-1 bg-divider-subtle'></div>
{
(!!options.length) && (
<div className='my-1 h-px w-full -translate-x-1 bg-divider-subtle'></div>
)
}
<div className='p-1'>
<VarReferenceVars
hideSearch
vars={workflowVariableOptions}
onChange={(variables: string[]) => {
handleSelectWorkflowVariable(variables)
}}
maxHeightClass='max-h-[34vh]'
isSupportFileVar={isSupportFileVar}
/>
</div>
</>
) )
} }
<div data-testid="options-list">
{
options.map((option, index) => (
<Fragment key={option.key}>
{
// Divider
index !== 0 && options.at(index - 1)?.group !== option.group && (
<div className='my-1 h-px w-full -translate-x-1 bg-divider-subtle'></div>
)
}
{option.renderMenuOption({
queryString,
isSelected: selectedIndex === index,
onSelect: () => {
selectOptionAndCleanUp(option)
},
onSetHighlight: () => {
setHighlightedIndex(index)
},
})}
</Fragment>
))
}
</div>
</div> </div>
</div>, </div>,
anchorElementRef.current, anchorElementRef.current,
@ -193,7 +204,7 @@ const ComponentPicker = ({
} }
</> </>
) )
}, [allFlattenOptions.length, workflowVariableBlock?.show, refs, isPositioned, floatingStyles, queryString, workflowVariableOptions, handleSelectWorkflowVariable]) }, [allFlattenOptions.length, workflowVariableBlock?.show, refs, isPositioned, floatingStyles, queryString, workflowVariableOptions, handleSelectWorkflowVariable, handleClose, isSupportFileVar])
return ( return (
<LexicalTypeaheadMenuPlugin <LexicalTypeaheadMenuPlugin

@ -37,14 +37,16 @@ const OnBlurBlock: FC<OnBlurBlockProps> = ({
), ),
editor.registerCommand( editor.registerCommand(
BLUR_COMMAND, BLUR_COMMAND,
() => { (event) => {
ref.current = setTimeout(() => { // Check if the clicked target element is var-search-input
editor.dispatchCommand(KEY_ESCAPE_COMMAND, new KeyboardEvent('keydown', { key: 'Escape' })) const target = event?.relatedTarget as HTMLElement
}, 200) if (!target?.classList?.contains('var-search-input')) {
ref.current = setTimeout(() => {
if (onBlur) editor.dispatchCommand(KEY_ESCAPE_COMMAND, new KeyboardEvent('keydown', { key: 'Escape' }))
onBlur() }, 200)
if (onBlur)
onBlur()
}
return true return true
}, },
COMMAND_PRIORITY_EDITOR, COMMAND_PRIORITY_EDITOR,

@ -20,7 +20,7 @@ const FullScreenDrawer: FC<IFullScreenDrawerProps> = ({
<Drawer <Drawer
isOpen={isOpen} isOpen={isOpen}
onClose={onClose} onClose={onClose}
panelClassname={classNames('!p-0 bg-components-panel-bg', panelClassName={classNames('!p-0 bg-components-panel-bg',
fullScreen fullScreen
? '!max-w-full !w-full' ? '!max-w-full !w-full'
: 'mt-16 mr-2 mb-2 !max-w-[560px] !w-[560px] border-[0.5px] border-components-panel-border rounded-xl', : 'mt-16 mr-2 mb-2 !max-w-[560px] !w-[560px] border-[0.5px] border-components-panel-border rounded-xl',

@ -277,7 +277,7 @@ const DocumentDetail: FC<Props> = ({ datasetId, documentId }) => {
} }
</div> </div>
} }
<FloatRightContainer showClose isOpen={showMetadata} onClose={() => setShowMetadata(false)} isMobile={isMobile} panelClassname='!justify-start' footer={null}> <FloatRightContainer showClose isOpen={showMetadata} onClose={() => setShowMetadata(false)} isMobile={isMobile} panelClassName='!justify-start' footer={null}>
<Metadata <Metadata
className='mr-2 mt-3' className='mr-2 mt-3'
datasetId={datasetId} datasetId={datasetId}

@ -176,7 +176,7 @@ const HitTestingPage: FC<Props> = ({ datasetId }: Props) => {
<RecordsEmpty /> <RecordsEmpty />
)} )}
</div> </div>
<FloatRightContainer panelClassname='!justify-start !overflow-y-auto' showClose isMobile={isMobile} isOpen={isShowRightPanel} onClose={hideRightPanel} footer={null}> <FloatRightContainer panelClassName='!justify-start !overflow-y-auto' showClose isMobile={isMobile} isOpen={isShowRightPanel} onClose={hideRightPanel} footer={null}>
<div className='flex flex-col pt-3'> <div className='flex flex-col pt-3'>
{/* {renderHitResults(generalResultData)} */} {/* {renderHitResults(generalResultData)} */}
{submitLoading {submitLoading
@ -197,7 +197,7 @@ const HitTestingPage: FC<Props> = ({ datasetId }: Props) => {
} }
</div> </div>
</FloatRightContainer> </FloatRightContainer>
<Drawer unmount={true} isOpen={isShowModifyRetrievalModal} onClose={() => setIsShowModifyRetrievalModal(false)} footer={null} mask={isMobile} panelClassname='mt-16 mx-2 sm:mr-2 mb-3 !p-0 !max-w-[640px] rounded-xl'> <Drawer unmount={true} isOpen={isShowModifyRetrievalModal} onClose={() => setIsShowModifyRetrievalModal(false)} footer={null} mask={isMobile} panelClassName='mt-16 mx-2 sm:mr-2 mb-3 !p-0 !max-w-[640px] rounded-xl'>
<ModifyRetrievalModal <ModifyRetrievalModal
indexMethod={currentDataset?.indexing_technique || ''} indexMethod={currentDataset?.indexing_technique || ''}
value={retrievalConfig} value={retrievalConfig}

@ -173,7 +173,7 @@ const DatasetMetadataDrawer: FC<Props> = ({
showClose showClose
title={t('dataset.metadata.metadata')} title={t('dataset.metadata.metadata')}
footer={null} footer={null}
panelClassname='px-4 block !max-w-[420px] my-2 rounded-l-2xl' panelClassName='px-4 block !max-w-[420px] my-2 rounded-l-2xl'
> >
<div className='h-full overflow-y-auto'> <div className='h-full overflow-y-auto'>
<div className='system-sm-regular text-text-tertiary'>{t(`${i18nPrefix}.description`)}</div> <div className='system-sm-regular text-text-tertiary'>{t(`${i18nPrefix}.description`)}</div>

@ -150,8 +150,8 @@ const PermissionSelector = ({ disabled, permission, value, memberList, onChange,
</div> </div>
</div> </div>
{isPartialMembers && ( {isPartialMembers && (
<div className='max-h-[360px] overflow-y-auto border-t-[1px] border-divider-regular p-1'> <div className='max-h-[360px] overflow-y-auto border-t-[1px] border-divider-regular pb-1 pl-1 pr-1'>
<div className='sticky left-0 top-0 p-2 pb-1'> <div className='sticky left-0 top-0 z-10 bg-white p-2 pb-1'>
<Input <Input
showLeftIcon showLeftIcon
showClearIcon showClearIcon

@ -74,7 +74,7 @@ const Popup: FC<PopupProps> = ({
/> />
<input <input
className='block h-[18px] grow appearance-none bg-transparent text-[13px] text-text-primary outline-none' className='block h-[18px] grow appearance-none bg-transparent text-[13px] text-text-primary outline-none'
placeholder='Search model' placeholder={t('datasetSettings.form.searchModel') || ''}
value={searchText} value={searchText}
onChange={e => setSearchText(e.target.value)} onChange={e => setSearchText(e.target.value)}
/> />

@ -32,7 +32,9 @@ const ListWithCollection = ({
return ( return (
<> <>
{ {
marketplaceCollections.map(collection => ( marketplaceCollections.filter((collection) => {
return marketplaceCollectionPluginsMap[collection.name]?.length
}).map(collection => (
<div <div
key={collection.name} key={collection.name}
className='py-3' className='py-3'

@ -46,7 +46,7 @@ const EndpointModal: FC<Props> = ({
footer={null} footer={null}
mask mask
positionCenter={false} positionCenter={false}
panelClassname={cn('mb-2 mr-2 mt-[64px] !w-[420px] !max-w-[420px] justify-start rounded-2xl border-[0.5px] border-components-panel-border !bg-components-panel-bg !p-0 shadow-xl')} panelClassName={cn('mb-2 mr-2 mt-[64px] !w-[420px] !max-w-[420px] justify-start rounded-2xl border-[0.5px] border-components-panel-border !bg-components-panel-bg !p-0 shadow-xl')}
> >
<> <>
<div className='p-4 pb-2'> <div className='p-4 pb-2'>

@ -38,7 +38,7 @@ const PluginDetailPanel: FC<Props> = ({
footer={null} footer={null}
mask={false} mask={false}
positionCenter={false} positionCenter={false}
panelClassname={cn('mb-2 mr-2 mt-[64px] !w-[420px] !max-w-[420px] justify-start rounded-2xl border-[0.5px] border-components-panel-border !bg-components-panel-bg !p-0 shadow-xl')} panelClassName={cn('mb-2 mr-2 mt-[64px] !w-[420px] !max-w-[420px] justify-start rounded-2xl border-[0.5px] border-components-panel-border !bg-components-panel-bg !p-0 shadow-xl')}
> >
{detail && ( {detail && (
<> <>

@ -78,7 +78,7 @@ const StrategyDetail: FC<Props> = ({
footer={null} footer={null}
mask={false} mask={false}
positionCenter={false} positionCenter={false}
panelClassname={cn('mb-2 mr-2 mt-[64px] !w-[420px] !max-w-[420px] justify-start rounded-2xl border-[0.5px] border-components-panel-border !bg-components-panel-bg !p-0 shadow-xl')} panelClassName={cn('mb-2 mr-2 mt-[64px] !w-[420px] !max-w-[420px] justify-start rounded-2xl border-[0.5px] border-components-panel-border !bg-components-panel-bg !p-0 shadow-xl')}
> >
<> <>
{/* header */} {/* header */}

@ -178,7 +178,7 @@ const AddToolModal: FC<Props> = ({
clickOutsideNotOpen clickOutsideNotOpen
onClose={onHide} onClose={onHide}
footer={null} footer={null}
panelClassname={cn('mx-2 mb-3 mt-16 rounded-xl !p-0 sm:mr-2', 'mt-2 !w-[640px]', '!max-w-[640px]')} panelClassName={cn('mx-2 mb-3 mt-16 rounded-xl !p-0 sm:mr-2', 'mt-2 !w-[640px]', '!max-w-[640px]')}
> >
<div <div
className='flex w-full rounded-xl border-[0.5px] border-gray-200 bg-white shadow-xl' className='flex w-full rounded-xl border-[0.5px] border-gray-200 bg-white shadow-xl'

@ -52,7 +52,9 @@ const ConfigCredential: FC<Props> = ({
positionCenter={positionCenter} positionCenter={positionCenter}
onHide={onHide} onHide={onHide}
title={t('tools.createTool.authMethod.title')!} title={t('tools.createTool.authMethod.title')!}
panelClassName='mt-2 !w-[520px] h-fit' dialogClassName='z-[60]'
dialogBackdropClassName='z-[70]'
panelClassName='mt-2 !w-[520px] h-fit z-[80]'
maxWidthClassName='!max-w-[520px]' maxWidthClassName='!max-w-[520px]'
height={'fit-content'} height={'fit-content'}
headerClassName='!border-b-divider-regular' headerClassName='!border-b-divider-regular'

@ -234,7 +234,7 @@ const ProviderDetail = ({
footer={null} footer={null}
mask={false} mask={false}
positionCenter={false} positionCenter={false}
panelClassname={cn('mb-2 mr-2 mt-[64px] !w-[420px] !max-w-[420px] justify-start rounded-2xl border-[0.5px] border-components-panel-border !bg-components-panel-bg !p-0 shadow-xl')} panelClassName={cn('mb-2 mr-2 mt-[64px] !w-[420px] !max-w-[420px] justify-start rounded-2xl border-[0.5px] border-components-panel-border !bg-components-panel-bg !p-0 shadow-xl')}
> >
<div className='p-4'> <div className='p-4'>
<div className='mb-3 flex'> <div className='mb-3 flex'>

@ -258,6 +258,8 @@ type Props = {
onChange: (value: ValueSelector, item: Var) => void onChange: (value: ValueSelector, item: Var) => void
itemWidth?: number itemWidth?: number
maxHeightClass?: string maxHeightClass?: string
onClose?: () => void
onBlur?: () => void
} }
const VarReferenceVars: FC<Props> = ({ const VarReferenceVars: FC<Props> = ({
hideSearch, hideSearch,
@ -267,10 +269,19 @@ const VarReferenceVars: FC<Props> = ({
onChange, onChange,
itemWidth, itemWidth,
maxHeightClass, maxHeightClass,
onClose,
onBlur,
}) => { }) => {
const { t } = useTranslation() const { t } = useTranslation()
const [searchText, setSearchText] = useState('') const [searchText, setSearchText] = useState('')
const handleKeyDown = (e: React.KeyboardEvent) => {
if (e.key === 'Escape') {
e.preventDefault()
onClose?.()
}
}
const filteredVars = vars.filter((v) => { const filteredVars = vars.filter((v) => {
const children = v.vars.filter(v => checkKeys([v.variable], false).isValid || v.variable.startsWith('sys.') || v.variable.startsWith('env.') || v.variable.startsWith('conversation.')) const children = v.vars.filter(v => checkKeys([v.variable], false).isValid || v.variable.startsWith('sys.') || v.variable.startsWith('env.') || v.variable.startsWith('conversation.'))
return children.length > 0 return children.length > 0
@ -301,14 +312,17 @@ const VarReferenceVars: FC<Props> = ({
{ {
!hideSearch && ( !hideSearch && (
<> <>
<div className={cn('mx-2 mb-1 mt-2', searchBoxClassName)} onClick={e => e.stopPropagation()}> <div className={cn('var-search-input-wrapper mx-2 mb-1 mt-2', searchBoxClassName)} onClick={e => e.stopPropagation()}>
<Input <Input
className='var-search-input'
showLeftIcon showLeftIcon
showClearIcon showClearIcon
value={searchText} value={searchText}
placeholder={t('workflow.common.searchVar') || ''} placeholder={t('workflow.common.searchVar') || ''}
onChange={e => setSearchText(e.target.value)} onChange={e => setSearchText(e.target.value)}
onKeyDown={handleKeyDown}
onClear={() => setSearchText('')} onClear={() => setSearchText('')}
onBlur={onBlur}
autoFocus autoFocus
/> />
</div> </div>

@ -111,7 +111,7 @@ const DatasetItem: FC<Props> = ({
} }
{isShowSettingsModal && ( {isShowSettingsModal && (
<Drawer isOpen={isShowSettingsModal} onClose={hideSettingsModal} footer={null} mask={isMobile} panelClassname='mt-16 mx-2 sm:mr-2 mb-3 !p-0 !max-w-[640px] rounded-xl'> <Drawer isOpen={isShowSettingsModal} onClose={hideSettingsModal} footer={null} mask={isMobile} panelClassName='mt-16 mx-2 sm:mr-2 mb-3 !p-0 !max-w-[640px] rounded-xl'>
<SettingsModal <SettingsModal
currentDataset={payload} currentDataset={payload}
onCancel={hideSettingsModal} onCancel={hideSettingsModal}

@ -35,6 +35,7 @@ const translation = {
upgradeHighQualityTip: 'Nach dem Upgrade auf den Modus "Hohe Qualität" ist das Zurücksetzen auf den Modus "Wirtschaftlich" nicht mehr möglich', upgradeHighQualityTip: 'Nach dem Upgrade auf den Modus "Hohe Qualität" ist das Zurücksetzen auf den Modus "Wirtschaftlich" nicht mehr möglich',
helpText: 'Erfahren Sie, wie Sie eine gute Datensatzbeschreibung schreiben.', helpText: 'Erfahren Sie, wie Sie eine gute Datensatzbeschreibung schreiben.',
indexMethodChangeToEconomyDisabledTip: 'Nicht verfügbar für ein Downgrade von HQ auf ECO', indexMethodChangeToEconomyDisabledTip: 'Nicht verfügbar für ein Downgrade von HQ auf ECO',
searchModel: 'Modell suchen',
}, },
} }

@ -36,6 +36,7 @@ const translation = {
retrievalSettings: 'Retrieval Settings', retrievalSettings: 'Retrieval Settings',
save: 'Save', save: 'Save',
indexMethodChangeToEconomyDisabledTip: 'Not available for downgrading from HQ to ECO', indexMethodChangeToEconomyDisabledTip: 'Not available for downgrading from HQ to ECO',
searchModel: 'Search model',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
indexMethodChangeToEconomyDisabledTip: 'No disponible para degradar de HQ a ECO', indexMethodChangeToEconomyDisabledTip: 'No disponible para degradar de HQ a ECO',
helpText: 'Aprenda a escribir una buena descripción del conjunto de datos.', helpText: 'Aprenda a escribir una buena descripción del conjunto de datos.',
upgradeHighQualityTip: 'Una vez que se actualiza al modo de alta calidad, no está disponible volver al modo económico', upgradeHighQualityTip: 'Una vez que se actualiza al modo de alta calidad, no está disponible volver al modo económico',
searchModel: 'Buscar modelo',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
indexMethodChangeToEconomyDisabledTip: 'برای تنزل رتبه از HQ به ECO در دسترس نیست', indexMethodChangeToEconomyDisabledTip: 'برای تنزل رتبه از HQ به ECO در دسترس نیست',
helpText: 'یاد بگیرید که چگونه یک توضیحات مجموعه داده خوب بنویسید.', helpText: 'یاد بگیرید که چگونه یک توضیحات مجموعه داده خوب بنویسید.',
upgradeHighQualityTip: 'پس از ارتقاء به حالت کیفیت بالا، بازگشت به حالت اقتصادی در دسترس نیست', upgradeHighQualityTip: 'پس از ارتقاء به حالت کیفیت بالا، بازگشت به حالت اقتصادی در دسترس نیست',
searchModel: 'جستجوی مدل',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
indexMethodChangeToEconomyDisabledTip: 'Non disponible pour le déclassement de HQ à ECO', indexMethodChangeToEconomyDisabledTip: 'Non disponible pour le déclassement de HQ à ECO',
upgradeHighQualityTip: 'Une fois la mise à niveau vers le mode Haute Qualité, il nest pas possible de revenir au mode Économique', upgradeHighQualityTip: 'Une fois la mise à niveau vers le mode Haute Qualité, il nest pas possible de revenir au mode Économique',
helpText: 'Apprenez à rédiger une bonne description de jeu de données.', helpText: 'Apprenez à rédiger une bonne description de jeu de données.',
searchModel: 'Rechercher un modèle',
}, },
} }

@ -40,6 +40,7 @@ const translation = {
indexMethodChangeToEconomyDisabledTip: 'मुख्यालय से ईसीओ में डाउनग्रेड करने के लिए उपलब्ध नहीं है', indexMethodChangeToEconomyDisabledTip: 'मुख्यालय से ईसीओ में डाउनग्रेड करने के लिए उपलब्ध नहीं है',
helpText: 'एक अच्छा डेटासेट विवरण लिखना सीखें।', helpText: 'एक अच्छा डेटासेट विवरण लिखना सीखें।',
upgradeHighQualityTip: 'एक बार उच्च गुणवत्ता मोड में अपग्रेड करने के बाद, किफायती मोड में वापस जाना उपलब्ध नहीं है', upgradeHighQualityTip: 'एक बार उच्च गुणवत्ता मोड में अपग्रेड करने के बाद, किफायती मोड में वापस जाना उपलब्ध नहीं है',
searchModel: 'मॉडल खोजें',
}, },
} }

@ -40,6 +40,7 @@ const translation = {
helpText: 'Scopri come scrivere una buona descrizione del set di dati.', helpText: 'Scopri come scrivere una buona descrizione del set di dati.',
upgradeHighQualityTip: 'Una volta effettuato l\'aggiornamento alla modalità Alta qualità, il ripristino della modalità Risparmio non è disponibile', upgradeHighQualityTip: 'Una volta effettuato l\'aggiornamento alla modalità Alta qualità, il ripristino della modalità Risparmio non è disponibile',
indexMethodChangeToEconomyDisabledTip: 'Non disponibile per il downgrade da HQ a ECO', indexMethodChangeToEconomyDisabledTip: 'Non disponibile per il downgrade da HQ a ECO',
searchModel: 'Cerca modello',
}, },
} }

@ -36,6 +36,7 @@ const translation = {
retrievalSettings: '取得設定', retrievalSettings: '取得設定',
externalKnowledgeAPI: '外部ナレッジベースAPI', externalKnowledgeAPI: '外部ナレッジベースAPI',
indexMethodChangeToEconomyDisabledTip: 'HQからECOへのダウングレードはできません。', indexMethodChangeToEconomyDisabledTip: 'HQからECOへのダウングレードはできません。',
searchModel: 'モデル検索',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
upgradeHighQualityTip: '고품질 모드로 업그레이드한 후에는 경제적 모드로 되돌릴 수 없습니다.', upgradeHighQualityTip: '고품질 모드로 업그레이드한 후에는 경제적 모드로 되돌릴 수 없습니다.',
indexMethodChangeToEconomyDisabledTip: 'HQ에서 ECO로 다운그레이드할 수 없습니다.', indexMethodChangeToEconomyDisabledTip: 'HQ에서 ECO로 다운그레이드할 수 없습니다.',
helpText: '좋은 데이터 세트 설명을 작성하는 방법을 알아보세요.', helpText: '좋은 데이터 세트 설명을 작성하는 방법을 알아보세요.',
searchModel: '모델 검색',
}, },
} }

@ -40,6 +40,7 @@ const translation = {
helpText: 'Dowiedz się, jak napisać dobry opis zestawu danych.', helpText: 'Dowiedz się, jak napisać dobry opis zestawu danych.',
upgradeHighQualityTip: 'Po uaktualnieniu do trybu wysokiej jakości powrót do trybu ekonomicznego nie jest dostępny', upgradeHighQualityTip: 'Po uaktualnieniu do trybu wysokiej jakości powrót do trybu ekonomicznego nie jest dostępny',
indexMethodChangeToEconomyDisabledTip: 'Niedostępne w przypadku zmiany z HQ na ECO', indexMethodChangeToEconomyDisabledTip: 'Niedostępne w przypadku zmiany z HQ na ECO',
searchModel: 'Szukaj modelu',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
indexMethodChangeToEconomyDisabledTip: 'Não disponível para rebaixamento de HQ para ECO', indexMethodChangeToEconomyDisabledTip: 'Não disponível para rebaixamento de HQ para ECO',
helpText: 'Aprenda a escrever uma boa descrição do conjunto de dados.', helpText: 'Aprenda a escrever uma boa descrição do conjunto de dados.',
upgradeHighQualityTip: 'Depois de atualizar para o modo de alta qualidade, reverter para o modo econômico não está disponível', upgradeHighQualityTip: 'Depois de atualizar para o modo de alta qualidade, reverter para o modo econômico não está disponível',
searchModel: 'Pesquisar modelo',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
indexMethodChangeToEconomyDisabledTip: 'Nu este disponibil pentru retrogradarea de la HQ la ECO', indexMethodChangeToEconomyDisabledTip: 'Nu este disponibil pentru retrogradarea de la HQ la ECO',
upgradeHighQualityTip: 'După ce faceți upgrade la modul Înaltă calitate, revenirea la modul Economic nu este disponibilă', upgradeHighQualityTip: 'După ce faceți upgrade la modul Înaltă calitate, revenirea la modul Economic nu este disponibilă',
helpText: 'Aflați cum să scrieți o descriere bună a setului de date.', helpText: 'Aflați cum să scrieți o descriere bună a setului de date.',
searchModel: 'Căutare model',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
helpText: 'Узнайте, как написать хорошее описание набора данных.', helpText: 'Узнайте, как написать хорошее описание набора данных.',
upgradeHighQualityTip: 'После обновления до режима «Высокое качество» возврат к экономичному режиму невозможен', upgradeHighQualityTip: 'После обновления до режима «Высокое качество» возврат к экономичному режиму невозможен',
indexMethodChangeToEconomyDisabledTip: 'Недоступно для понижения уровня с HQ до ECO', indexMethodChangeToEconomyDisabledTip: 'Недоступно для понижения уровня с HQ до ECO',
searchModel: 'Поиск модели',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
indexMethodChangeToEconomyDisabledTip: 'Ni na voljo za pregradnjo iz HQ v ECO', indexMethodChangeToEconomyDisabledTip: 'Ni na voljo za pregradnjo iz HQ v ECO',
upgradeHighQualityTip: 'Ko nadgradite na način visoke kakovosti, vrnitev v ekonomični način ni na voljo', upgradeHighQualityTip: 'Ko nadgradite na način visoke kakovosti, vrnitev v ekonomični način ni na voljo',
helpText: 'Naučite se napisati dober opis nabora podatkov.', helpText: 'Naučite se napisati dober opis nabora podatkov.',
searchModel: 'Išči model',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
indexMethodChangeToEconomyDisabledTip: 'ไม่สามารถดาวน์เกรดจาก HQ เป็น ECO ได้', indexMethodChangeToEconomyDisabledTip: 'ไม่สามารถดาวน์เกรดจาก HQ เป็น ECO ได้',
helpText: 'เรียนรู้วิธีเขียนคําอธิบายชุดข้อมูลที่ดี', helpText: 'เรียนรู้วิธีเขียนคําอธิบายชุดข้อมูลที่ดี',
upgradeHighQualityTip: 'เมื่ออัปเกรดเป็นโหมดคุณภาพสูงแล้ว จะไม่สามารถเปลี่ยนกลับเป็นโหมดประหยัดได้', upgradeHighQualityTip: 'เมื่ออัปเกรดเป็นโหมดคุณภาพสูงแล้ว จะไม่สามารถเปลี่ยนกลับเป็นโหมดประหยัดได้',
searchModel: 'ค้นหารุ่น',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
upgradeHighQualityTip: 'Yüksek Kalite moduna yükselttikten sonra Ekonomik moda geri dönülemez', upgradeHighQualityTip: 'Yüksek Kalite moduna yükselttikten sonra Ekonomik moda geri dönülemez',
indexMethodChangeToEconomyDisabledTip: 'Genel Merkezden ECO\'ya düşürme için mevcut değil', indexMethodChangeToEconomyDisabledTip: 'Genel Merkezden ECO\'ya düşürme için mevcut değil',
helpText: 'İyi bir veri kümesi açıklamasının nasıl yazılacağını öğrenin.', helpText: 'İyi bir veri kümesi açıklamasının nasıl yazılacağını öğrenin.',
searchModel: 'Model Ara',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
helpText: 'Дізнайтеся, як написати хороший опис набору даних.', helpText: 'Дізнайтеся, як написати хороший опис набору даних.',
indexMethodChangeToEconomyDisabledTip: 'Недоступно для пониження з HQ до ECO', indexMethodChangeToEconomyDisabledTip: 'Недоступно для пониження з HQ до ECO',
upgradeHighQualityTip: 'Після оновлення до режиму високої якості повернення до економного режиму недоступне', upgradeHighQualityTip: 'Після оновлення до режиму високої якості повернення до економного режиму недоступне',
searchModel: 'Пошук моделі',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
helpText: 'Tìm hiểu cách viết mô tả tập dữ liệu tốt.', helpText: 'Tìm hiểu cách viết mô tả tập dữ liệu tốt.',
indexMethodChangeToEconomyDisabledTip: 'Không khả dụng để hạ cấp từ HQ xuống ECO', indexMethodChangeToEconomyDisabledTip: 'Không khả dụng để hạ cấp từ HQ xuống ECO',
upgradeHighQualityTip: 'Sau khi nâng cấp lên chế độ Chất lượng cao, không thể hoàn nguyên về chế độ Tiết kiệm', upgradeHighQualityTip: 'Sau khi nâng cấp lên chế độ Chất lượng cao, không thể hoàn nguyên về chế độ Tiết kiệm',
searchModel: 'Tìm kiếm mô hình',
}, },
} }

@ -36,6 +36,7 @@ const translation = {
save: '保存', save: '保存',
retrievalSettings: '检索设置', retrievalSettings: '检索设置',
indexMethodChangeToEconomyDisabledTip: '无法从高质量降级为经济', indexMethodChangeToEconomyDisabledTip: '无法从高质量降级为经济',
searchModel: '搜索模型',
}, },
} }

@ -35,6 +35,7 @@ const translation = {
indexMethodChangeToEconomyDisabledTip: '不適用於從 HQ 降級到 ECO', indexMethodChangeToEconomyDisabledTip: '不適用於從 HQ 降級到 ECO',
upgradeHighQualityTip: '升級到高品質模式后,無法恢復到經濟模式', upgradeHighQualityTip: '升級到高品質模式后,無法恢復到經濟模式',
helpText: '瞭解如何編寫良好的數據集描述。', helpText: '瞭解如何編寫良好的數據集描述。',
searchModel: '搜索模型',
}, },
} }

Loading…
Cancel
Save