|
|
|
@ -6,13 +6,28 @@ import {
|
|
|
|
import { produce } from 'immer'
|
|
|
|
import { produce } from 'immer'
|
|
|
|
import type { InputVar } from '@/models/pipeline'
|
|
|
|
import type { InputVar } from '@/models/pipeline'
|
|
|
|
import type { SortableItem } from './types'
|
|
|
|
import type { SortableItem } from './types'
|
|
|
|
|
|
|
|
import type { MoreInfo, ValueSelector } from '@/app/components/workflow/types'
|
|
|
|
|
|
|
|
import { ChangeType } from '@/app/components/workflow/types'
|
|
|
|
|
|
|
|
import { useWorkflow } from '@/app/components/workflow/hooks'
|
|
|
|
|
|
|
|
import { useBoolean } from 'ahooks'
|
|
|
|
|
|
|
|
|
|
|
|
export const useFieldList = (
|
|
|
|
export const useFieldList = (
|
|
|
|
initialInputFields: InputVar[],
|
|
|
|
initialInputFields: InputVar[],
|
|
|
|
onInputFieldsChange: (value: InputVar[]) => void,
|
|
|
|
onInputFieldsChange: (value: InputVar[]) => void,
|
|
|
|
|
|
|
|
nodeId: string,
|
|
|
|
) => {
|
|
|
|
) => {
|
|
|
|
const [inputFields, setInputFields] = useState<InputVar[]>(initialInputFields)
|
|
|
|
const [inputFields, setInputFields] = useState<InputVar[]>(initialInputFields)
|
|
|
|
const inputFieldsRef = useRef<InputVar[]>(inputFields)
|
|
|
|
const inputFieldsRef = useRef<InputVar[]>(inputFields)
|
|
|
|
|
|
|
|
const [removedVar, setRemovedVar] = useState<ValueSelector>([])
|
|
|
|
|
|
|
|
const [removedIndex, setRemoveIndex] = useState(0)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const { handleOutVarRenameChange, isVarUsedInNodes, removeUsedVarInNodes } = useWorkflow()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const [isShowRemoveVarConfirm, {
|
|
|
|
|
|
|
|
setTrue: showRemoveVarConfirm,
|
|
|
|
|
|
|
|
setFalse: hideRemoveVarConfirm,
|
|
|
|
|
|
|
|
}] = useBoolean(false)
|
|
|
|
|
|
|
|
|
|
|
|
const handleInputFieldsChange = useCallback((newInputFields: InputVar[]) => {
|
|
|
|
const handleInputFieldsChange = useCallback((newInputFields: InputVar[]) => {
|
|
|
|
setInputFields(newInputFields)
|
|
|
|
setInputFields(newInputFields)
|
|
|
|
inputFieldsRef.current = newInputFields
|
|
|
|
inputFieldsRef.current = newInputFields
|
|
|
|
@ -38,12 +53,27 @@ export const useFieldList = (
|
|
|
|
setEditingField(undefined)
|
|
|
|
setEditingField(undefined)
|
|
|
|
}, [])
|
|
|
|
}, [])
|
|
|
|
|
|
|
|
|
|
|
|
const handleRemoveField = useCallback((id: string) => {
|
|
|
|
const handleRemoveField = useCallback((index: number) => {
|
|
|
|
const newInputFields = inputFieldsRef.current.filter(field => field.variable !== id)
|
|
|
|
const itemToRemove = inputFieldsRef.current[index]
|
|
|
|
|
|
|
|
// Check if the variable is used in other nodes
|
|
|
|
|
|
|
|
if (isVarUsedInNodes([nodeId, itemToRemove.variable || ''])) {
|
|
|
|
|
|
|
|
showRemoveVarConfirm()
|
|
|
|
|
|
|
|
setRemovedVar([nodeId, itemToRemove.variable || ''])
|
|
|
|
|
|
|
|
setRemoveIndex(index as number)
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
const newInputFields = inputFieldsRef.current.splice(index, 1)
|
|
|
|
handleInputFieldsChange(newInputFields)
|
|
|
|
handleInputFieldsChange(newInputFields)
|
|
|
|
}, [handleInputFieldsChange])
|
|
|
|
}, [handleInputFieldsChange, isVarUsedInNodes, nodeId, showRemoveVarConfirm])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const onRemoveVarConfirm = useCallback(() => {
|
|
|
|
|
|
|
|
const newInputFields = inputFieldsRef.current.splice(removedIndex, 1)
|
|
|
|
|
|
|
|
handleInputFieldsChange(newInputFields)
|
|
|
|
|
|
|
|
removeUsedVarInNodes(removedVar)
|
|
|
|
|
|
|
|
hideRemoveVarConfirm()
|
|
|
|
|
|
|
|
}, [removedIndex, handleInputFieldsChange, removeUsedVarInNodes, removedVar, hideRemoveVarConfirm])
|
|
|
|
|
|
|
|
|
|
|
|
const handleSubmitField = useCallback((data: InputVar) => {
|
|
|
|
const handleSubmitField = useCallback((data: InputVar, moreInfo?: MoreInfo) => {
|
|
|
|
const newInputFields = produce(inputFieldsRef.current, (draft) => {
|
|
|
|
const newInputFields = produce(inputFieldsRef.current, (draft) => {
|
|
|
|
const currentIndex = draft.findIndex(field => field.variable === data.variable)
|
|
|
|
const currentIndex = draft.findIndex(field => field.variable === data.variable)
|
|
|
|
if (currentIndex === -1) {
|
|
|
|
if (currentIndex === -1) {
|
|
|
|
@ -53,7 +83,10 @@ export const useFieldList = (
|
|
|
|
draft[currentIndex] = data
|
|
|
|
draft[currentIndex] = data
|
|
|
|
})
|
|
|
|
})
|
|
|
|
handleInputFieldsChange(newInputFields)
|
|
|
|
handleInputFieldsChange(newInputFields)
|
|
|
|
}, [handleInputFieldsChange])
|
|
|
|
// Update variable name in nodes if it has changed
|
|
|
|
|
|
|
|
if (moreInfo?.type === ChangeType.changeVarName)
|
|
|
|
|
|
|
|
handleOutVarRenameChange(nodeId, [nodeId, moreInfo.payload?.beforeKey || ''], [nodeId, moreInfo.payload?.afterKey || ''])
|
|
|
|
|
|
|
|
}, [handleInputFieldsChange, handleOutVarRenameChange, nodeId])
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
return {
|
|
|
|
inputFields,
|
|
|
|
inputFields,
|
|
|
|
@ -65,5 +98,8 @@ export const useFieldList = (
|
|
|
|
showInputFieldEditor,
|
|
|
|
showInputFieldEditor,
|
|
|
|
handleOpenInputFieldEditor,
|
|
|
|
handleOpenInputFieldEditor,
|
|
|
|
handleCancelInputFieldEditor,
|
|
|
|
handleCancelInputFieldEditor,
|
|
|
|
|
|
|
|
isShowRemoveVarConfirm,
|
|
|
|
|
|
|
|
hideRemoveVarConfirm,
|
|
|
|
|
|
|
|
onRemoveVarConfirm,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|