- {
- isMultipleChoice ? (
-
- ) : (
-
- )
- }
+
void
onPreview: (payload: CrawlResultItem) => void
usedTime: number
- isMultipleChoice: boolean
}
const CrawledResult: FC
= ({
@@ -26,7 +25,6 @@ const CrawledResult: FC = ({
onSelectedChange,
onPreview,
usedTime,
- isMultipleChoice,
}) => {
const { t } = useTranslation()
@@ -42,17 +40,13 @@ const CrawledResult: FC = ({
const handleItemCheckChange = useCallback((item: CrawlResultItem) => {
return (checked: boolean) => {
- if (checked) {
- if (isMultipleChoice)
- onSelectedChange([...checkedList, item])
- else
- onSelectedChange([item])
- }
- else {
+ if (checked)
+ onSelectedChange([...checkedList, item])
+
+ else
onSelectedChange(checkedList.filter(checkedItem => checkedItem.source_url !== item.source_url))
- }
}
- }, [checkedList, isMultipleChoice, onSelectedChange])
+ }, [checkedList, onSelectedChange])
const [previewIndex, setPreviewIndex] = React.useState(-1)
const handlePreview = useCallback((index: number) => {
@@ -65,13 +59,11 @@ const CrawledResult: FC = ({
return (
- {isMultipleChoice && (
-
- )}
+
{t(`${I18N_PREFIX}.scrapTimeInfo`, {
total: list.length,
@@ -88,7 +80,6 @@ const CrawledResult: FC
= ({
payload={item}
isChecked={checkedList.some(checkedItem => checkedItem.source_url === item.source_url)}
onCheckChange={handleItemCheckChange(item)}
- isMultipleChoice={isMultipleChoice}
/>
))}
diff --git a/web/app/components/datasets/create/website/firecrawl/index.tsx b/web/app/components/datasets/create/website/firecrawl/index.tsx
index 1ef934308a..17d8d6416e 100644
--- a/web/app/components/datasets/create/website/firecrawl/index.tsx
+++ b/web/app/components/datasets/create/website/firecrawl/index.tsx
@@ -26,7 +26,6 @@ type Props = {
onJobIdChange: (jobId: string) => void
crawlOptions: CrawlOptions
onCrawlOptionsChange: (payload: CrawlOptions) => void
- supportBatchUpload: boolean
}
enum Step {
@@ -42,7 +41,6 @@ const FireCrawl: FC
= ({
onJobIdChange,
crawlOptions,
onCrawlOptionsChange,
- supportBatchUpload,
}) => {
const { t } = useTranslation()
const [step, setStep] = useState(Step.init)
@@ -168,12 +166,8 @@ const FireCrawl: FC = ({
setCrawlErrorMessage(errorMessage || t(`${I18N_PREFIX}.unknownError`))
}
else {
- data.data = data.data.map((item: any) => ({
- ...item,
- content: item.markdown,
- }))
setCrawlResult(data)
- onCheckedCrawlResultChange(supportBatchUpload ? (data.data || []) : (data.data?.slice(0, 1) || [])) // default select the crawl result
+ onCheckedCrawlResultChange(data.data || []) // default select the crawl result
setCrawlErrorMessage('')
}
}
@@ -184,7 +178,7 @@ const FireCrawl: FC = ({
finally {
setStep(Step.finished)
}
- }, [checkValid, crawlOptions, onJobIdChange, waitForCrawlFinished, t, onCheckedCrawlResultChange, supportBatchUpload])
+ }, [checkValid, crawlOptions, onJobIdChange, t, waitForCrawlFinished, onCheckedCrawlResultChange])
return (
@@ -223,7 +217,6 @@ const FireCrawl: FC
= ({
onSelectedChange={onCheckedCrawlResultChange}
onPreview={onPreview}
usedTime={Number.parseFloat(crawlResult?.time_consuming as string) || 0}
- isMultipleChoice={supportBatchUpload}
/>
}
diff --git a/web/app/components/datasets/create/website/index.tsx b/web/app/components/datasets/create/website/index.tsx
index 15324f642e..ee7ace6815 100644
--- a/web/app/components/datasets/create/website/index.tsx
+++ b/web/app/components/datasets/create/website/index.tsx
@@ -24,7 +24,6 @@ type Props = {
crawlOptions: CrawlOptions
onCrawlOptionsChange: (payload: CrawlOptions) => void
authedDataSourceList: DataSourceAuth[]
- supportBatchUpload?: boolean
}
const Website: FC = ({
@@ -36,7 +35,6 @@ const Website: FC = ({
crawlOptions,
onCrawlOptionsChange,
authedDataSourceList,
- supportBatchUpload = false,
}) => {
const { t } = useTranslation()
const { setShowAccountSettingModal } = useModalContext()
@@ -118,7 +116,6 @@ const Website: FC = ({
onJobIdChange={onJobIdChange}
crawlOptions={crawlOptions}
onCrawlOptionsChange={onCrawlOptionsChange}
- supportBatchUpload={supportBatchUpload}
/>
)}
{source && selectedProvider === DataSourceProvider.waterCrawl && (
@@ -129,7 +126,6 @@ const Website: FC = ({
onJobIdChange={onJobIdChange}
crawlOptions={crawlOptions}
onCrawlOptionsChange={onCrawlOptionsChange}
- supportBatchUpload={supportBatchUpload}
/>
)}
{source && selectedProvider === DataSourceProvider.jinaReader && (
@@ -140,7 +136,6 @@ const Website: FC = ({
onJobIdChange={onJobIdChange}
crawlOptions={crawlOptions}
onCrawlOptionsChange={onCrawlOptionsChange}
- supportBatchUpload={supportBatchUpload}
/>
)}
{!source && (
diff --git a/web/app/components/datasets/create/website/jina-reader/index.tsx b/web/app/components/datasets/create/website/jina-reader/index.tsx
index b2189b3e5c..7257e8f7e6 100644
--- a/web/app/components/datasets/create/website/jina-reader/index.tsx
+++ b/web/app/components/datasets/create/website/jina-reader/index.tsx
@@ -26,7 +26,6 @@ type Props = {
onJobIdChange: (jobId: string) => void
crawlOptions: CrawlOptions
onCrawlOptionsChange: (payload: CrawlOptions) => void
- supportBatchUpload: boolean
}
enum Step {
@@ -42,7 +41,6 @@ const JinaReader: FC = ({
onJobIdChange,
crawlOptions,
onCrawlOptionsChange,
- supportBatchUpload,
}) => {
const { t } = useTranslation()
const [step, setStep] = useState(Step.init)
@@ -178,7 +176,7 @@ const JinaReader: FC = ({
}
else {
setCrawlResult(data)
- onCheckedCrawlResultChange(supportBatchUpload ? (data.data || []) : (data.data?.slice(0, 1) || [])) // default select the crawl result
+ onCheckedCrawlResultChange(data.data || []) // default select the crawl result
setCrawlErrorMessage('')
}
}
@@ -190,7 +188,7 @@ const JinaReader: FC = ({
finally {
setStep(Step.finished)
}
- }, [checkValid, crawlOptions, onCheckedCrawlResultChange, onJobIdChange, supportBatchUpload, t, waitForCrawlFinished])
+ }, [checkValid, crawlOptions, onCheckedCrawlResultChange, onJobIdChange, t, waitForCrawlFinished])
return (
@@ -229,7 +227,6 @@ const JinaReader: FC
= ({
onSelectedChange={onCheckedCrawlResultChange}
onPreview={onPreview}
usedTime={Number.parseFloat(crawlResult?.time_consuming as string) || 0}
- isMultipleChoice={supportBatchUpload}
/>
}
diff --git a/web/app/components/datasets/create/website/watercrawl/index.tsx b/web/app/components/datasets/create/website/watercrawl/index.tsx
index bf0048b788..f1aee37e19 100644
--- a/web/app/components/datasets/create/website/watercrawl/index.tsx
+++ b/web/app/components/datasets/create/website/watercrawl/index.tsx
@@ -26,7 +26,6 @@ type Props = {
onJobIdChange: (jobId: string) => void
crawlOptions: CrawlOptions
onCrawlOptionsChange: (payload: CrawlOptions) => void
- supportBatchUpload: boolean
}
enum Step {
@@ -42,7 +41,6 @@ const WaterCrawl: FC = ({
onJobIdChange,
crawlOptions,
onCrawlOptionsChange,
- supportBatchUpload,
}) => {
const { t } = useTranslation()
const [step, setStep] = useState(Step.init)
@@ -165,7 +163,7 @@ const WaterCrawl: FC = ({
}
else {
setCrawlResult(data)
- onCheckedCrawlResultChange(supportBatchUpload ? (data.data || []) : (data.data?.slice(0, 1) || [])) // default select the crawl result
+ onCheckedCrawlResultChange(data.data || []) // default select the crawl result
setCrawlErrorMessage('')
}
}
@@ -176,7 +174,7 @@ const WaterCrawl: FC = ({
finally {
setStep(Step.finished)
}
- }, [checkValid, crawlOptions, onCheckedCrawlResultChange, onJobIdChange, supportBatchUpload, t, waitForCrawlFinished])
+ }, [checkValid, crawlOptions, onCheckedCrawlResultChange, onJobIdChange, t, waitForCrawlFinished])
return (
@@ -215,7 +213,6 @@ const WaterCrawl: FC
= ({
onSelectedChange={onCheckedCrawlResultChange}
onPreview={onPreview}
usedTime={Number.parseFloat(crawlResult?.time_consuming as string) || 0}
- isMultipleChoice={supportBatchUpload}
/>
}
diff --git a/web/app/components/datasets/documents/create-from-pipeline/data-source/local-file/index.tsx b/web/app/components/datasets/documents/create-from-pipeline/data-source/local-file/index.tsx
index eb94d073b7..f25f02fdbd 100644
--- a/web/app/components/datasets/documents/create-from-pipeline/data-source/local-file/index.tsx
+++ b/web/app/components/datasets/documents/create-from-pipeline/data-source/local-file/index.tsx
@@ -28,7 +28,7 @@ export type LocalFileProps = {
const LocalFile = ({
allowedExtensions,
- supportBatchUpload = false,
+ supportBatchUpload = true,
}: LocalFileProps) => {
const { t } = useTranslation()
const { notify } = useContext(ToastContext)
diff --git a/web/app/components/datasets/documents/create-from-pipeline/data-source/online-documents/index.tsx b/web/app/components/datasets/documents/create-from-pipeline/data-source/online-documents/index.tsx
index 72ceb4a21e..b7502f337f 100644
--- a/web/app/components/datasets/documents/create-from-pipeline/data-source/online-documents/index.tsx
+++ b/web/app/components/datasets/documents/create-from-pipeline/data-source/online-documents/index.tsx
@@ -30,7 +30,7 @@ const OnlineDocuments = ({
nodeId,
nodeData,
isInPipeline = false,
- supportBatchUpload = false,
+ supportBatchUpload = true,
onCredentialChange,
}: OnlineDocumentsProps) => {
const docLink = useDocLink()
diff --git a/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/index.tsx b/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/index.tsx
index 8bd1d7421b..1d279e146d 100644
--- a/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/index.tsx
+++ b/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/index.tsx
@@ -29,7 +29,7 @@ const OnlineDrive = ({
nodeId,
nodeData,
isInPipeline = false,
- supportBatchUpload = false,
+ supportBatchUpload = true,
onCredentialChange,
}: OnlineDriveProps) => {
const docLink = useDocLink()
diff --git a/web/app/components/datasets/documents/create-from-pipeline/data-source/website-crawl/index.tsx b/web/app/components/datasets/documents/create-from-pipeline/data-source/website-crawl/index.tsx
index 513ac8edd9..d9981a4638 100644
--- a/web/app/components/datasets/documents/create-from-pipeline/data-source/website-crawl/index.tsx
+++ b/web/app/components/datasets/documents/create-from-pipeline/data-source/website-crawl/index.tsx
@@ -42,7 +42,7 @@ const WebsiteCrawl = ({
nodeId,
nodeData,
isInPipeline = false,
- supportBatchUpload = false,
+ supportBatchUpload = true,
onCredentialChange,
}: WebsiteCrawlProps) => {
const { t } = useTranslation()
diff --git a/web/app/components/datasets/documents/create-from-pipeline/index.tsx b/web/app/components/datasets/documents/create-from-pipeline/index.tsx
index 1d9232403a..79e3694da8 100644
--- a/web/app/components/datasets/documents/create-from-pipeline/index.tsx
+++ b/web/app/components/datasets/documents/create-from-pipeline/index.tsx
@@ -36,6 +36,10 @@ import { useAddDocumentsSteps, useLocalFile, useOnlineDocument, useOnlineDrive,
import DataSourceProvider from './data-source/store/provider'
import { useDataSourceStore } from './data-source/store'
import { useFileUploadConfig } from '@/service/use-common'
+import UpgradeCard from '../../create/step-one/upgrade-card'
+import Divider from '@/app/components/base/divider'
+import { useBoolean } from 'ahooks'
+import PlanUpgradeModal from '@/app/components/billing/plan-upgrade-modal'
const CreateFormPipeline = () => {
const { t } = useTranslation()
@@ -57,7 +61,7 @@ const CreateFormPipeline = () => {
const {
steps,
currentStep,
- handleNextStep,
+ handleNextStep: doHandleNextStep,
handleBackStep,
} = useAddDocumentsSteps()
const {
@@ -104,6 +108,33 @@ const CreateFormPipeline = () => {
}, [allFileLoaded, datasource, datasourceType, enableBilling, isVectorSpaceFull, onlineDocuments.length, onlineDriveFileList.length, websitePages.length])
const supportBatchUpload = !enableBilling || plan.type !== 'sandbox'
+ const [isShowPlanUpgradeModal, {
+ setTrue: showPlanUpgradeModal,
+ setFalse: hidePlanUpgradeModal,
+ }] = useBoolean(false)
+ const handleNextStep = useCallback(() => {
+ if (!supportBatchUpload) {
+ let isMultiple = false
+ if (datasourceType === DatasourceType.localFile && localFileList.length > 1)
+ isMultiple = true
+
+ if (datasourceType === DatasourceType.onlineDocument && onlineDocuments.length > 1)
+ isMultiple = true
+
+ if (datasourceType === DatasourceType.websiteCrawl && websitePages.length > 1)
+ isMultiple = true
+
+ if (datasourceType === DatasourceType.onlineDrive && selectedFileIds.length > 1)
+ isMultiple = true
+
+ if (isMultiple) {
+ showPlanUpgradeModal()
+ return
+ }
+ }
+ doHandleNextStep()
+ }, [datasourceType, doHandleNextStep, localFileList.length, onlineDocuments.length, selectedFileIds.length, showPlanUpgradeModal, supportBatchUpload, websitePages.length])
+
const nextBtnDisabled = useMemo(() => {
if (!datasource) return true
if (datasourceType === DatasourceType.localFile)
@@ -125,16 +156,16 @@ const CreateFormPipeline = () => {
const showSelect = useMemo(() => {
if (datasourceType === DatasourceType.onlineDocument) {
const pagesCount = currentWorkspace?.pages.length ?? 0
- return supportBatchUpload && pagesCount > 0
+ return pagesCount > 0
}
if (datasourceType === DatasourceType.onlineDrive) {
const isBucketList = onlineDriveFileList.some(file => file.type === 'bucket')
- return supportBatchUpload && !isBucketList && onlineDriveFileList.filter((item) => {
+ return !isBucketList && onlineDriveFileList.filter((item) => {
return item.type !== 'bucket'
}).length > 0
}
return false
- }, [currentWorkspace?.pages.length, datasourceType, supportBatchUpload, onlineDriveFileList])
+ }, [currentWorkspace?.pages.length, datasourceType, onlineDriveFileList])
const totalOptions = useMemo(() => {
if (datasourceType === DatasourceType.onlineDocument)
@@ -390,11 +421,12 @@ const CreateFormPipeline = () => {
}, [PagesMapAndSelectedPagesId, currentWorkspace?.pages, dataSourceStore, datasourceType])
const clearDataSourceData = useCallback((dataSource: Datasource) => {
- if (dataSource.nodeData.provider_type === DatasourceType.onlineDocument)
+ const providerType = dataSource.nodeData.provider_type
+ if (providerType === DatasourceType.onlineDocument)
clearOnlineDocumentData()
- else if (dataSource.nodeData.provider_type === DatasourceType.websiteCrawl)
+ else if (providerType === DatasourceType.websiteCrawl)
clearWebsiteCrawlData()
- else if (dataSource.nodeData.provider_type === DatasourceType.onlineDrive)
+ else if (providerType === DatasourceType.onlineDrive)
clearOnlineDriveData()
}, [clearOnlineDocumentData, clearOnlineDriveData, clearWebsiteCrawlData])
@@ -452,7 +484,6 @@ const CreateFormPipeline = () => {
nodeId={datasource!.nodeId}
nodeData={datasource!.nodeData}
onCredentialChange={handleCredentialChange}
- supportBatchUpload={supportBatchUpload}
/>
)}
{datasourceType === DatasourceType.websiteCrawl && (
@@ -460,7 +491,6 @@ const CreateFormPipeline = () => {
nodeId={datasource!.nodeId}
nodeData={datasource!.nodeData}
onCredentialChange={handleCredentialChange}
- supportBatchUpload={supportBatchUpload}
/>
)}
{datasourceType === DatasourceType.onlineDrive && (
@@ -468,7 +498,6 @@ const CreateFormPipeline = () => {
nodeId={datasource!.nodeId}
nodeData={datasource!.nodeData}
onCredentialChange={handleCredentialChange}
- supportBatchUpload={supportBatchUpload}
/>
)}
{isShowVectorSpaceFull && (
@@ -483,6 +512,14 @@ const CreateFormPipeline = () => {
handleNextStep={handleNextStep}
tip={tip}
/>
+ {
+ !supportBatchUpload && datasourceType === DatasourceType.localFile && localFileList.length > 0 && (
+ <>
+
+
+ >
+ )
+ }
)
}
@@ -561,6 +598,14 @@ const CreateFormPipeline = () => {
)
}
+ {isShowPlanUpgradeModal && (
+
+ )}
)
}
diff --git a/web/app/components/datasets/documents/detail/segment-add/index.tsx b/web/app/components/datasets/documents/detail/segment-add/index.tsx
index d41118ec02..eb40d43e7c 100644
--- a/web/app/components/datasets/documents/detail/segment-add/index.tsx
+++ b/web/app/components/datasets/documents/detail/segment-add/index.tsx
@@ -1,6 +1,6 @@
'use client'
import type { FC } from 'react'
-import React, { useMemo } from 'react'
+import React, { useCallback, useMemo } from 'react'
import { useTranslation } from 'react-i18next'
import {
RiAddLine,
@@ -11,6 +11,10 @@ import {
import cn from '@/utils/classnames'
import { CheckCircle } from '@/app/components/base/icons/src/vender/solid/general'
import Popover from '@/app/components/base/popover'
+import { useBoolean } from 'ahooks'
+import { useProviderContext } from '@/context/provider-context'
+import PlanUpgradeModal from '@/app/components/billing/plan-upgrade-modal'
+import { Plan } from '@/app/components/billing/type'
export type ISegmentAddProps = {
importStatus: ProcessStatus | string | undefined
@@ -35,6 +39,23 @@ const SegmentAdd: FC
= ({
embedding,
}) => {
const { t } = useTranslation()
+ const [isShowPlanUpgradeModal, {
+ setTrue: showPlanUpgradeModal,
+ setFalse: hidePlanUpgradeModal,
+ }] = useBoolean(false)
+ const { plan, enableBilling } = useProviderContext()
+ const { type } = plan
+ const canAdd = enableBilling ? type !== Plan.sandbox : true
+
+ const withNeedUpgradeCheck = useCallback((fn: () => void) => {
+ return () => {
+ if (!canAdd) {
+ showPlanUpgradeModal()
+ return
+ }
+ fn()
+ }
+ }, [canAdd, showPlanUpgradeModal])
const textColor = useMemo(() => {
return embedding
? 'text-components-button-secondary-accent-text-disabled'
@@ -90,7 +111,7 @@ const SegmentAdd: FC = ({
type='button'
className={`inline-flex items-center rounded-l-lg border-r-[1px] border-r-divider-subtle px-2.5 py-2
hover:bg-state-base-hover disabled:cursor-not-allowed disabled:hover:bg-transparent`}
- onClick={showNewSegmentModal}
+ onClick={withNeedUpgradeCheck(showNewSegmentModal)}
disabled={embedding}
>
@@ -108,7 +129,7 @@ const SegmentAdd: FC = ({
@@ -116,7 +137,7 @@ const SegmentAdd: FC = ({
}
btnElement={
-
+
}
btnClassName={open => cn(
@@ -129,7 +150,16 @@ const SegmentAdd: FC = ({
className='h-fit min-w-[128px]'
disabled={embedding}
/>
+ {isShowPlanUpgradeModal && (
+
+ )}
+
)
}
export default React.memo(SegmentAdd)
diff --git a/web/context/hooks/use-trigger-events-limit-modal.ts b/web/context/hooks/use-trigger-events-limit-modal.ts
index b55501ffaf..ac02acc025 100644
--- a/web/context/hooks/use-trigger-events-limit-modal.ts
+++ b/web/context/hooks/use-trigger-events-limit-modal.ts
@@ -9,7 +9,6 @@ export type TriggerEventsLimitModalPayload = {
usage: number
total: number
resetInDays?: number
- planType: Plan
storageKey?: string
persistDismiss?: boolean
}
@@ -98,7 +97,6 @@ export const useTriggerEventsLimitModal = ({
payload: {
usage: usage.triggerEvents,
total: total.triggerEvents,
- planType: type,
resetInDays: triggerResetInDays,
storageKey,
persistDismiss,
diff --git a/web/context/modal-context.test.tsx b/web/context/modal-context.test.tsx
index f7e65bac6f..f929457180 100644
--- a/web/context/modal-context.test.tsx
+++ b/web/context/modal-context.test.tsx
@@ -31,7 +31,7 @@ const triggerEventsLimitModalMock = jest.fn((props: any) => {
latestTriggerEventsModalProps = props
return (
-
+
)
@@ -115,11 +115,10 @@ describe('ModalContextProvider trigger events limit modal', () => {
usage: 3000,
total: 3000,
resetInDays: 5,
- planType: Plan.professional,
})
act(() => {
- latestTriggerEventsModalProps.onDismiss()
+ latestTriggerEventsModalProps.onClose()
})
await waitFor(() => expect(screen.queryByTestId('trigger-limit-modal')).not.toBeInTheDocument())
@@ -149,7 +148,7 @@ describe('ModalContextProvider trigger events limit modal', () => {
await waitFor(() => expect(screen.getByTestId('trigger-limit-modal')).toBeInTheDocument())
act(() => {
- latestTriggerEventsModalProps.onDismiss()
+ latestTriggerEventsModalProps.onClose()
})
await waitFor(() => expect(screen.queryByTestId('trigger-limit-modal')).not.toBeInTheDocument())
@@ -177,7 +176,7 @@ describe('ModalContextProvider trigger events limit modal', () => {
await waitFor(() => expect(screen.getByTestId('trigger-limit-modal')).toBeInTheDocument())
act(() => {
- latestTriggerEventsModalProps.onDismiss()
+ latestTriggerEventsModalProps.onClose()
})
await waitFor(() => expect(screen.queryByTestId('trigger-limit-modal')).not.toBeInTheDocument())
diff --git a/web/context/modal-context.tsx b/web/context/modal-context.tsx
index 082b0f9c58..7f08045993 100644
--- a/web/context/modal-context.tsx
+++ b/web/context/modal-context.tsx
@@ -485,9 +485,8 @@ export const ModalContextProvider = ({
show
usage={showTriggerEventsLimitModal.payload.usage}
total={showTriggerEventsLimitModal.payload.total}
- planType={showTriggerEventsLimitModal.payload.planType}
resetInDays={showTriggerEventsLimitModal.payload.resetInDays}
- onDismiss={() => {
+ onClose={() => {
persistTriggerEventsLimitModalDismiss()
setShowTriggerEventsLimitModal(null)
}}
diff --git a/web/i18n/en-US/billing.ts b/web/i18n/en-US/billing.ts
index 2531e5831a..1ab4e3f0d4 100644
--- a/web/i18n/en-US/billing.ts
+++ b/web/i18n/en-US/billing.ts
@@ -221,6 +221,20 @@ const translation = {
fullTipLine2: 'annotate more conversations.',
quotaTitle: 'Annotation Reply Quota',
},
+ upgrade: {
+ uploadMultiplePages: {
+ title: 'Upgrade to upload multiple documents at once',
+ description: 'You’ve reached the upload limit — only one document can be selected and uploaded at a time on your current plan.',
+ },
+ uploadMultipleFiles: {
+ title: 'Upgrade to unlock batch document upload',
+ description: 'Batch-upload more documents at once to save time and improve efficiency.',
+ },
+ addChunks: {
+ title: 'Upgrade to continue adding chunks',
+ description: 'You’ve reached the limit of adding chunks for this plan.',
+ },
+ },
}
export default translation
diff --git a/web/i18n/ja-JP/billing.ts b/web/i18n/ja-JP/billing.ts
index 97fa4eb0e6..07361c0234 100644
--- a/web/i18n/ja-JP/billing.ts
+++ b/web/i18n/ja-JP/billing.ts
@@ -202,6 +202,20 @@ const translation = {
quotaTitle: '注釈返信クォータ',
},
teamMembers: 'チームメンバー',
+ upgrade: {
+ uploadMultiplePages: {
+ title: '複数ドキュメントを一度にアップロードするにはアップグレード',
+ description: '現在のプランではアップロード上限に達しています。1回の操作で選択・アップロードできるドキュメントは1つのみです。',
+ },
+ uploadMultipleFiles: {
+ title: '一括ドキュメントアップロード機能を解放するにはアップグレードが必要です',
+ description: '複数のドキュメントを一度にバッチアップロードすることで、時間を節約し、作業効率を向上できます。',
+ },
+ addChunks: {
+ title: 'アップグレードして、チャンクを引き続き追加できるようにしてください。',
+ description: 'このプランでは、チャンク追加の上限に達しています。',
+ },
+ },
}
export default translation
diff --git a/web/i18n/zh-Hans/billing.ts b/web/i18n/zh-Hans/billing.ts
index b404240b3d..037f1c88c5 100644
--- a/web/i18n/zh-Hans/billing.ts
+++ b/web/i18n/zh-Hans/billing.ts
@@ -202,6 +202,20 @@ const translation = {
quotaTitle: '标注的配额',
},
teamMembers: '团队成员',
+ upgrade: {
+ uploadMultiplePages: {
+ title: '升级以一次性上传多个文档',
+ description: '您已达到当前套餐的上传限制 —— 该套餐每次只能选择并上传 1 个文档。',
+ },
+ uploadMultipleFiles: {
+ title: '升级以解锁批量文档上传功能',
+ description: '一次性批量上传更多文档,以节省时间并提升效率。',
+ },
+ addChunks: {
+ title: '升级以继续添加分段',
+ description: '您已达到此计划的添加分段上限。',
+ },
+ },
}
export default translation