mirror of
https://github.com/langgenius/dify.git
synced 2026-04-28 11:56:55 +08:00
feat: refactor template card actions and details to standardize prop names; add create modal for dataset creation
This commit is contained in:
parent
df928772c0
commit
5a8f10520f
@ -6,7 +6,7 @@ import Operations from './operations'
|
|||||||
import CustomPopover from '@/app/components/base/popover'
|
import CustomPopover from '@/app/components/base/popover'
|
||||||
|
|
||||||
type ActionsProps = {
|
type ActionsProps = {
|
||||||
handleApplyTemplate: () => void
|
onApplyTemplate: () => void
|
||||||
handleShowTemplateDetails: () => void
|
handleShowTemplateDetails: () => void
|
||||||
showMoreOperations: boolean
|
showMoreOperations: boolean
|
||||||
openEditModal: () => void
|
openEditModal: () => void
|
||||||
@ -15,7 +15,7 @@ type ActionsProps = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const Actions = ({
|
const Actions = ({
|
||||||
handleApplyTemplate,
|
onApplyTemplate,
|
||||||
handleShowTemplateDetails,
|
handleShowTemplateDetails,
|
||||||
showMoreOperations,
|
showMoreOperations,
|
||||||
openEditModal,
|
openEditModal,
|
||||||
@ -28,7 +28,7 @@ const Actions = ({
|
|||||||
<div className='absolute bottom-0 left-0 z-10 hidden w-full items-center gap-x-1 bg-pipeline-template-card-hover-bg p-4 pt-8 group-hover:flex'>
|
<div className='absolute bottom-0 left-0 z-10 hidden w-full items-center gap-x-1 bg-pipeline-template-card-hover-bg p-4 pt-8 group-hover:flex'>
|
||||||
<Button
|
<Button
|
||||||
variant='primary'
|
variant='primary'
|
||||||
onClick={handleApplyTemplate}
|
onClick={onApplyTemplate}
|
||||||
className='grow gap-x-0.5'
|
className='grow gap-x-0.5'
|
||||||
>
|
>
|
||||||
<RiAddLine className='size-4' />
|
<RiAddLine className='size-4' />
|
||||||
|
|||||||
@ -3,19 +3,20 @@ import CreateForm from '../../create-form'
|
|||||||
import { useCallback, useEffect, useState } from 'react'
|
import { useCallback, useEffect, useState } from 'react'
|
||||||
import type { CreateFormData } from '@/models/pipeline'
|
import type { CreateFormData } from '@/models/pipeline'
|
||||||
import { ChunkingMode, type CreateDatasetReq, DatasetPermission } from '@/models/datasets'
|
import { ChunkingMode, type CreateDatasetReq, DatasetPermission } from '@/models/datasets'
|
||||||
import { useCreatePipelineDataset } from '@/service/knowledge/use-create-dataset'
|
|
||||||
import type { Member } from '@/models/common'
|
import type { Member } from '@/models/common'
|
||||||
import { useMembers } from '@/service/use-common'
|
import { useMembers } from '@/service/use-common'
|
||||||
|
|
||||||
type ApplyTemplateModalProps = {
|
type CreateModalProps = {
|
||||||
show: boolean
|
show: boolean
|
||||||
onClose: () => void
|
onClose: () => void
|
||||||
|
onCreate: (payload: Omit<CreateDatasetReq, 'yaml_content'>) => Promise<void>
|
||||||
}
|
}
|
||||||
|
|
||||||
const ApplyTemplateModal = ({
|
const CreateModal = ({
|
||||||
show,
|
show,
|
||||||
onClose,
|
onClose,
|
||||||
}: ApplyTemplateModalProps) => {
|
onCreate,
|
||||||
|
}: CreateModalProps) => {
|
||||||
const [memberList, setMemberList] = useState<Member[]>([])
|
const [memberList, setMemberList] = useState<Member[]>([])
|
||||||
const { data: members } = useMembers()
|
const { data: members } = useMembers()
|
||||||
|
|
||||||
@ -24,8 +25,6 @@ const ApplyTemplateModal = ({
|
|||||||
setMemberList(members.accounts)
|
setMemberList(members.accounts)
|
||||||
}, [members])
|
}, [members])
|
||||||
|
|
||||||
const { mutateAsync: createEmptyDataset } = useCreatePipelineDataset() // todo: yaml content
|
|
||||||
|
|
||||||
const handleCreate = useCallback(async (payload: CreateFormData) => {
|
const handleCreate = useCallback(async (payload: CreateFormData) => {
|
||||||
const { name, appIcon, description, permission, selectedMemberIDs } = payload
|
const { name, appIcon, description, permission, selectedMemberIDs } = payload
|
||||||
const request: CreateDatasetReq = {
|
const request: CreateDatasetReq = {
|
||||||
@ -50,12 +49,8 @@ const ApplyTemplateModal = ({
|
|||||||
})
|
})
|
||||||
request.partial_member_list = selectedMemberList
|
request.partial_member_list = selectedMemberList
|
||||||
}
|
}
|
||||||
await createEmptyDataset(request, {
|
onCreate(request)
|
||||||
onSettled: () => {
|
}, [memberList, onCreate])
|
||||||
onClose?.()
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}, [createEmptyDataset, memberList, onClose])
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Modal
|
<Modal
|
||||||
@ -71,4 +66,4 @@ const ApplyTemplateModal = ({
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export default ApplyTemplateModal
|
export default CreateModal
|
||||||
@ -9,13 +9,13 @@ import Tooltip from '@/app/components/base/tooltip'
|
|||||||
|
|
||||||
type DetailsProps = {
|
type DetailsProps = {
|
||||||
id: string
|
id: string
|
||||||
handleUseTemplate: () => void
|
onApplyTemplate: () => void
|
||||||
onClose: () => void
|
onClose: () => void
|
||||||
}
|
}
|
||||||
|
|
||||||
const Details = ({
|
const Details = ({
|
||||||
id,
|
id,
|
||||||
handleUseTemplate,
|
onApplyTemplate,
|
||||||
onClose,
|
onClose,
|
||||||
}: DetailsProps) => {
|
}: DetailsProps) => {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
@ -74,7 +74,7 @@ const Details = ({
|
|||||||
<div className='p-3'>
|
<div className='p-3'>
|
||||||
<Button
|
<Button
|
||||||
variant='primary'
|
variant='primary'
|
||||||
onClick={handleUseTemplate}
|
onClick={onApplyTemplate}
|
||||||
className='w-full gap-x-0.5'
|
className='w-full gap-x-0.5'
|
||||||
>
|
>
|
||||||
<RiAddLine className='size-4' />
|
<RiAddLine className='size-4' />
|
||||||
|
|||||||
@ -7,17 +7,18 @@ import Confirm from '@/app/components/base/confirm'
|
|||||||
import {
|
import {
|
||||||
useDeletePipeline,
|
useDeletePipeline,
|
||||||
useExportPipelineDSL,
|
useExportPipelineDSL,
|
||||||
useImportPipelineDSL,
|
|
||||||
usePipelineTemplateById,
|
usePipelineTemplateById,
|
||||||
} from '@/service/use-pipeline'
|
} from '@/service/use-pipeline'
|
||||||
import { downloadFile } from '@/utils/format'
|
import { downloadFile } from '@/utils/format'
|
||||||
import Toast from '@/app/components/base/toast'
|
import Toast from '@/app/components/base/toast'
|
||||||
import { DSLImportMode } from '@/models/app'
|
|
||||||
import { usePluginDependencies } from '@/app/components/workflow/plugin-dependency/hooks'
|
import { usePluginDependencies } from '@/app/components/workflow/plugin-dependency/hooks'
|
||||||
import { useRouter } from 'next/navigation'
|
import { useRouter } from 'next/navigation'
|
||||||
import Details from './details'
|
import Details from './details'
|
||||||
import Content from './content'
|
import Content from './content'
|
||||||
import Actions from './actions'
|
import Actions from './actions'
|
||||||
|
import type { CreateDatasetReq } from '@/models/datasets'
|
||||||
|
import { useCreatePipelineDataset } from '@/service/knowledge/use-create-dataset'
|
||||||
|
import CreateModal from './create-modal'
|
||||||
|
|
||||||
type TemplateCardProps = {
|
type TemplateCardProps = {
|
||||||
pipeline: PipelineTemplate
|
pipeline: PipelineTemplate
|
||||||
@ -33,12 +34,17 @@ const TemplateCard = ({
|
|||||||
const [showEditModal, setShowEditModal] = useState(false)
|
const [showEditModal, setShowEditModal] = useState(false)
|
||||||
const [showDeleteConfirm, setShowConfirmDelete] = useState(false)
|
const [showDeleteConfirm, setShowConfirmDelete] = useState(false)
|
||||||
const [showDetailModal, setShowDetailModal] = useState(false)
|
const [showDetailModal, setShowDetailModal] = useState(false)
|
||||||
|
const [showCreateModal, setShowCreateModal] = useState(false)
|
||||||
|
|
||||||
const { refetch: getPipelineTemplateInfo } = usePipelineTemplateById(pipeline.id, false)
|
const { refetch: getPipelineTemplateInfo } = usePipelineTemplateById(pipeline.id, false)
|
||||||
const { mutateAsync: importDSL } = useImportPipelineDSL()
|
const { mutateAsync: createEmptyDataset } = useCreatePipelineDataset()
|
||||||
const { handleCheckPluginDependencies } = usePluginDependencies()
|
const { handleCheckPluginDependencies } = usePluginDependencies()
|
||||||
|
|
||||||
const handleUseTemplate = useCallback(async () => {
|
const openCreateModal = useCallback(() => {
|
||||||
|
setShowCreateModal(true)
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
const handleUseTemplate = useCallback(async (payload: Omit<CreateDatasetReq, 'yaml_content'>) => {
|
||||||
try {
|
try {
|
||||||
const { data: pipelineTemplateInfo } = await getPipelineTemplateInfo()
|
const { data: pipelineTemplateInfo } = await getPipelineTemplateInfo()
|
||||||
if (!pipelineTemplateInfo) {
|
if (!pipelineTemplateInfo) {
|
||||||
@ -49,17 +55,17 @@ const TemplateCard = ({
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
const request = {
|
const request = {
|
||||||
mode: DSLImportMode.YAML_CONTENT,
|
...payload,
|
||||||
yaml_content: pipelineTemplateInfo.export_data,
|
yaml_content: pipelineTemplateInfo.export_data,
|
||||||
}
|
}
|
||||||
const newPipeline = await importDSL(request)
|
const newDataset = await createEmptyDataset(request)
|
||||||
Toast.notify({
|
Toast.notify({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
message: t('app.newApp.appCreated'),
|
message: t('app.newApp.appCreated'),
|
||||||
})
|
})
|
||||||
if (newPipeline.pipeline_id)
|
if (newDataset.pipeline_info?.id)
|
||||||
await handleCheckPluginDependencies(newPipeline.pipeline_id, true)
|
await handleCheckPluginDependencies(newDataset.pipeline_info.id, true)
|
||||||
push(`dataset/${newPipeline.pipeline_id}/pipeline`)
|
push(`dataset/${newDataset.id}/pipeline`)
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
Toast.notify({
|
Toast.notify({
|
||||||
@ -67,7 +73,7 @@ const TemplateCard = ({
|
|||||||
message: t('datasetPipeline.creation.errorTip'),
|
message: t('datasetPipeline.creation.errorTip'),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}, [getPipelineTemplateInfo, importDSL, t, handleCheckPluginDependencies, push])
|
}, [getPipelineTemplateInfo, createEmptyDataset, t, handleCheckPluginDependencies, push])
|
||||||
|
|
||||||
const handleShowTemplateDetails = useCallback(() => {
|
const handleShowTemplateDetails = useCallback(() => {
|
||||||
setShowDetailModal(true)
|
setShowDetailModal(true)
|
||||||
@ -140,7 +146,7 @@ const TemplateCard = ({
|
|||||||
docForm={pipeline.doc_form}
|
docForm={pipeline.doc_form}
|
||||||
/>
|
/>
|
||||||
<Actions
|
<Actions
|
||||||
handleApplyTemplate={handleUseTemplate}
|
onApplyTemplate={openCreateModal}
|
||||||
handleShowTemplateDetails={handleShowTemplateDetails}
|
handleShowTemplateDetails={handleShowTemplateDetails}
|
||||||
showMoreOperations={showMoreOperations}
|
showMoreOperations={showMoreOperations}
|
||||||
openEditModal={openEditModal}
|
openEditModal={openEditModal}
|
||||||
@ -177,10 +183,18 @@ const TemplateCard = ({
|
|||||||
<Details
|
<Details
|
||||||
id={pipeline.id}
|
id={pipeline.id}
|
||||||
onClose={closeDetailsModal}
|
onClose={closeDetailsModal}
|
||||||
handleUseTemplate={handleUseTemplate}
|
onApplyTemplate={openCreateModal}
|
||||||
/>
|
/>
|
||||||
</Modal>
|
</Modal>
|
||||||
)}
|
)}
|
||||||
|
{showCreateModal && (
|
||||||
|
<CreateModal
|
||||||
|
show={showCreateModal}
|
||||||
|
onClose={() => setShowCreateModal(false)}
|
||||||
|
onCreate={handleUseTemplate}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,6 +6,9 @@ import type { MetadataFilteringVariableType } from '@/app/components/workflow/no
|
|||||||
import type { MetadataItemWithValue } from '@/app/components/datasets/metadata/types'
|
import type { MetadataItemWithValue } from '@/app/components/datasets/metadata/types'
|
||||||
import { ExternalKnowledgeBase, General, Graph, ParentChild, Qa } from '@/app/components/base/icons/src/public/knowledge/dataset-card'
|
import { ExternalKnowledgeBase, General, Graph, ParentChild, Qa } from '@/app/components/base/icons/src/public/knowledge/dataset-card'
|
||||||
import { GeneralChunk, ParentChildChunk, QuestionAndAnswer } from '@/app/components/base/icons/src/vender/knowledge'
|
import { GeneralChunk, ParentChildChunk, QuestionAndAnswer } from '@/app/components/base/icons/src/vender/knowledge'
|
||||||
|
import type { Edge, EnvironmentVariable, Node } from '@/app/components/workflow/types'
|
||||||
|
import type { Viewport } from 'reactflow'
|
||||||
|
import type { RAGPipelineVariables } from './pipeline'
|
||||||
|
|
||||||
export enum DataSourceType {
|
export enum DataSourceType {
|
||||||
FILE = 'upload_file',
|
FILE = 'upload_file',
|
||||||
@ -737,6 +740,7 @@ export type CreateDatasetReq = {
|
|||||||
user_id: string
|
user_id: string
|
||||||
role?: 'owner' | 'admin' | 'editor' | 'normal' | 'dataset_operator'
|
role?: 'owner' | 'admin' | 'editor' | 'normal' | 'dataset_operator'
|
||||||
}[]
|
}[]
|
||||||
|
yaml_content?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
export type CreateDatasetResponse = {
|
export type CreateDatasetResponse = {
|
||||||
@ -749,4 +753,14 @@ export type CreateDatasetResponse = {
|
|||||||
created_at: number
|
created_at: number
|
||||||
updated_by: string
|
updated_by: string
|
||||||
updated_at: number
|
updated_at: number
|
||||||
|
pipeline_info: {
|
||||||
|
id: string
|
||||||
|
graph: {
|
||||||
|
nodes: Node[]
|
||||||
|
edges: Edge[]
|
||||||
|
viewport?: Viewport
|
||||||
|
}
|
||||||
|
environment_variables: EnvironmentVariable[]
|
||||||
|
rag_pipeline_variables: RAGPipelineVariables
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user