Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 19 additions & 14 deletions src/platform/workflow/core/services/workflowService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -310,31 +310,36 @@ export const useWorkflowService = () => {
value: string | ComfyWorkflow | null,
workflowData: ComfyWorkflowJSON
) => {
// Use workspaceStore here as it is patched in unit tests.
const workflowStore = useWorkspaceStore().workflow
if (typeof value === 'string') {
const workflow = workflowStore.getWorkflowByPath(
ComfyWorkflow.basePath + appendJsonExt(value)
)
if (workflow?.isPersisted) {
const loadedWorkflow = await workflowStore.openWorkflow(workflow)
loadedWorkflow.changeTracker.restore()
loadedWorkflow.changeTracker.reset(workflowData)
return
}
}

if (value === null || typeof value === 'string') {
const path = value as string | null
const tempWorkflow = workflowStore.createTemporary(

// Check if a persisted workflow with this path exists
if (path) {
const fullPath = ComfyWorkflow.basePath + appendJsonExt(path)
const existingWorkflow = workflowStore.getWorkflowByPath(fullPath)

// If the workflow exists and is NOT loaded yet (restoration case),
// use the existing workflow instead of creating a new one.
// If it IS loaded, this is a re-import case - create new with suffix.
if (existingWorkflow?.isPersisted && !existingWorkflow.isLoaded) {
const loadedWorkflow =
await workflowStore.openWorkflow(existingWorkflow)
loadedWorkflow.changeTracker.reset(workflowData)
loadedWorkflow.changeTracker.restore()
return
}
}

const tempWorkflow = workflowStore.createNewTemporary(
path ? appendJsonExt(path) : undefined,
workflowData
)
await workflowStore.openWorkflow(tempWorkflow)
return
}

// value is a ComfyWorkflow.
const loadedWorkflow = await workflowStore.openWorkflow(value)
loadedWorkflow.changeTracker.reset(workflowData)
loadedWorkflow.changeTracker.restore()
Expand Down
72 changes: 54 additions & 18 deletions src/platform/workflow/management/stores/workflowStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,10 @@ interface WorkflowStore {
path?: string,
workflowData?: ComfyWorkflowJSON
) => ComfyWorkflow
createNewTemporary: (
path?: string,
workflowData?: ComfyWorkflowJSON
) => ComfyWorkflow
renameWorkflow: (workflow: ComfyWorkflow, newPath: string) => Promise<void>
deleteWorkflow: (workflow: ComfyWorkflow) => Promise<void>
saveWorkflow: (workflow: ComfyWorkflow) => Promise<void>
Expand Down Expand Up @@ -365,25 +369,15 @@ export const useWorkflowStore = defineStore('workflow', () => {
return workflow
}

const createTemporary = (path?: string, workflowData?: ComfyWorkflowJSON) => {
const fullPath = getUnconflictedPath(
ComfyWorkflow.basePath + (path ?? 'Unsaved Workflow.json')
)
const existingWorkflow = workflows.value.find((w) => w.fullFilename == path)
if (
path &&
workflowData &&
existingWorkflow?.changeTracker &&
!existingWorkflow.directory.startsWith(
ComfyWorkflow.basePath.slice(0, -1)
)
) {
existingWorkflow.changeTracker.reset(workflowData)
return existingWorkflow
}

/**
* Helper to create a new temporary workflow
*/
const createNewWorkflow = (
path: string,
workflowData?: ComfyWorkflowJSON
): ComfyWorkflow => {
const workflow = new ComfyWorkflow({
path: fullPath,
path,
modified: Date.now(),
size: -1
})
Expand All @@ -396,6 +390,47 @@ export const useWorkflowStore = defineStore('workflow', () => {
return workflow
}

/**
* Create a temporary workflow, attempting to reuse an existing workflow if conditions match
*/
const createTemporary = (path?: string, workflowData?: ComfyWorkflowJSON) => {
const fullPath = getUnconflictedPath(
ComfyWorkflow.basePath + (path ?? 'Unsaved Workflow.json')
)

// Try to reuse an existing loaded workflow with the same filename
// that is not stored in the workflows directory
if (path && workflowData) {
const existingWorkflow = workflows.value.find(
(w) => w.fullFilename === path
)
if (
existingWorkflow?.changeTracker &&
!existingWorkflow.directory.startsWith(
ComfyWorkflow.basePath.slice(0, -1)
)
) {
existingWorkflow.changeTracker.reset(workflowData)
return existingWorkflow
}
}

return createNewWorkflow(fullPath, workflowData)
}

/**
* Create a new temporary workflow without attempting to reuse existing workflows
*/
const createNewTemporary = (
path?: string,
workflowData?: ComfyWorkflowJSON
): ComfyWorkflow => {
const fullPath = getUnconflictedPath(
ComfyWorkflow.basePath + (path ?? 'Unsaved Workflow.json')
)
return createNewWorkflow(fullPath, workflowData)
}

const closeWorkflow = async (workflow: ComfyWorkflow) => {
openWorkflowPaths.value = openWorkflowPaths.value.filter(
(path) => path !== workflow.path
Expand Down Expand Up @@ -777,6 +812,7 @@ export const useWorkflowStore = defineStore('workflow', () => {
isBusy,
closeWorkflow,
createTemporary,
createNewTemporary,
renameWorkflow,
deleteWorkflow,
saveAs,
Expand Down