@@ -83,7 +88,9 @@
@@ -94,7 +101,9 @@
@@ -128,6 +137,8 @@ import { useTreeExpansion } from '@/hooks/treeHooks'
import { useSettingStore } from '@/stores/settingStore'
import { workflowService } from '@/services/workflowService'
import { useWorkspaceStore } from '@/stores/workspaceStore'
+import { appendJsonExt } from '@/utils/formatUtil'
+import { buildTree, sortedTree } from '@/utils/treeUtil'
const settingStore = useSettingStore()
const workflowTabsPosition = computed(() =>
@@ -138,9 +149,7 @@ const searchQuery = ref('')
const isSearching = computed(() => searchQuery.value.length > 0)
const filteredWorkflows = ref([])
const filteredRoot = computed(() => {
- return workflowStore.buildWorkflowTree(
- filteredWorkflows.value as ComfyWorkflow[]
- )
+ return buildWorkflowTree(filteredWorkflows.value as ComfyWorkflow[])
})
const handleSearch = (query: string) => {
if (query.length === 0) {
@@ -172,8 +181,37 @@ const handleCloseWorkflow = (workflow?: ComfyWorkflow) => {
}
}
-const renderTreeNode = (node: TreeNode): TreeExplorerNode => {
- const children = node.children?.map(renderTreeNode)
+enum WorkflowTreeType {
+ Open = 'Open',
+ Bookmarks = 'Bookmarks',
+ Browse = 'Browse'
+}
+
+const buildWorkflowTree = (workflows: ComfyWorkflow[]) => {
+ return buildTree(workflows, (workflow: ComfyWorkflow) =>
+ workflow.key.split('/')
+ )
+}
+
+const workflowsTree = computed(() =>
+ sortedTree(buildWorkflowTree(workflowStore.persistedWorkflows), {
+ groupLeaf: true
+ })
+)
+// Bookmarked workflows tree is flat.
+const bookmarkedWorkflowsTree = computed(() =>
+ buildTree(workflowStore.bookmarkedWorkflows, (workflow) => [workflow.key])
+)
+// Open workflows tree is flat.
+const openWorkflowsTree = computed(() =>
+ buildTree(workflowStore.openWorkflows, (workflow) => [workflow.key])
+)
+
+const renderTreeNode = (
+ node: TreeNode,
+ type: WorkflowTreeType
+): TreeExplorerNode => {
+ const children = node.children?.map((child) => renderTreeNode(child, type))
const workflow: ComfyWorkflow = node.data
@@ -194,7 +232,12 @@ const renderTreeNode = (node: TreeNode): TreeExplorerNode => {
node: TreeExplorerNode,
newName: string
) => {
- await workflowService.renameWorkflow(workflow, newName)
+ const newPath =
+ type === WorkflowTreeType.Browse
+ ? workflow.directory + '/' + appendJsonExt(newName)
+ : ComfyWorkflow.basePath + appendJsonExt(newName)
+
+ await workflowService.renameWorkflow(workflow, newPath)
},
handleDelete: workflow.isTemporary
? undefined
diff --git a/src/services/workflowService.ts b/src/services/workflowService.ts
index a412f10bf..bd6355ec3 100644
--- a/src/services/workflowService.ts
+++ b/src/services/workflowService.ts
@@ -61,14 +61,15 @@ export const workflowService = {
})
if (!newFilename) return
+ const newPath = workflow.directory + '/' + appendJsonExt(newFilename)
+ const newKey = newPath.substring(ComfyWorkflow.basePath.length)
+
if (workflow.isTemporary) {
- await this.renameWorkflow(workflow, newFilename)
+ await this.renameWorkflow(workflow, newPath)
await useWorkflowStore().saveWorkflow(workflow)
} else {
const tempWorkflow = useWorkflowStore().createTemporary(
- (workflow.directory + '/' + appendJsonExt(newFilename)).substring(
- 'workflows/'.length
- ),
+ newKey,
workflow.activeState as ComfyWorkflowJSON
)
await this.openWorkflow(tempWorkflow)
@@ -162,8 +163,8 @@ export const workflowService = {
await workflowStore.closeWorkflow(workflow)
},
- async renameWorkflow(workflow: ComfyWorkflow, newName: string) {
- await useWorkflowStore().renameWorkflow(workflow, newName)
+ async renameWorkflow(workflow: ComfyWorkflow, newPath: string) {
+ await useWorkflowStore().renameWorkflow(workflow, newPath)
},
async deleteWorkflow(workflow: ComfyWorkflow) {
@@ -212,7 +213,7 @@ export const workflowService = {
const workflowStore = useWorkspaceStore().workflow
if (typeof value === 'string') {
const workflow = workflowStore.getWorkflowByPath(
- 'workflows/' + appendJsonExt(value)
+ ComfyWorkflow.basePath + appendJsonExt(value)
)
if (workflow?.isPersisted) {
const loadedWorkflow = await workflowStore.openWorkflow(workflow)
diff --git a/src/stores/workflowStore.ts b/src/stores/workflowStore.ts
index bb393741b..b757dd37f 100644
--- a/src/stores/workflowStore.ts
+++ b/src/stores/workflowStore.ts
@@ -1,15 +1,16 @@
import { defineStore } from 'pinia'
import { computed, markRaw, ref } from 'vue'
-import { buildTree, sortedTree } from '@/utils/treeUtil'
import { api } from '@/scripts/api'
import { UserFile } from './userFileStore'
import { ChangeTracker } from '@/scripts/changeTracker'
import { ComfyWorkflowJSON } from '@/types/comfyWorkflow'
-import { appendJsonExt, getPathDetails } from '@/utils/formatUtil'
+import { getPathDetails } from '@/utils/formatUtil'
import { defaultGraphJSON } from '@/scripts/defaultGraph'
import { syncEntities } from '@/utils/syncUtil'
export class ComfyWorkflow extends UserFile {
+ static readonly basePath = 'workflows/'
+
/**
* The change tracker for the workflow. Non-reactive raw object.
*/
@@ -28,7 +29,7 @@ export class ComfyWorkflow extends UserFile {
}
get key() {
- return this.path.substring('workflows/'.length)
+ return this.path.substring(ComfyWorkflow.basePath.length)
}
get activeState(): ComfyWorkflowJSON | null {
@@ -104,12 +105,6 @@ export class ComfyWorkflow extends UserFile {
this.content = JSON.stringify(this.activeState)
return await super.saveAs(path)
}
-
- async rename(newName: string) {
- const newPath = this.directory + '/' + appendJsonExt(newName)
- await super.rename(newPath)
- return this
- }
}
export interface LoadedComfyWorkflow extends ComfyWorkflow {
@@ -210,7 +205,7 @@ export const useWorkflowStore = defineStore('workflow', () => {
const createTemporary = (path?: string, workflowData?: ComfyWorkflowJSON) => {
const fullPath = getUnconflictedPath(
- 'workflows/' + (path ?? 'Unsaved Workflow.json')
+ ComfyWorkflow.basePath + (path ?? 'Unsaved Workflow.json')
)
const workflow = new ComfyWorkflow({
path: fullPath,
@@ -289,33 +284,15 @@ export const useWorkflowStore = defineStore('workflow', () => {
workflows.value.filter((workflow) => workflow.isModified)
)
- const buildWorkflowTree = (workflows: ComfyWorkflow[]) => {
- return buildTree(workflows, (workflow: ComfyWorkflow) =>
- workflow.key.split('/')
- )
- }
- const workflowsTree = computed(() =>
- sortedTree(buildWorkflowTree(persistedWorkflows.value), { groupLeaf: true })
- )
- // Bookmarked workflows tree is flat.
- const bookmarkedWorkflowsTree = computed(() =>
- buildTree(bookmarkedWorkflows.value, (workflow) => [workflow.key])
- )
- // Open workflows tree is flat.
- const openWorkflowsTree = computed(() =>
- buildTree(openWorkflows.value, (workflow) => [workflow.key])
- )
-
- const renameWorkflow = async (workflow: ComfyWorkflow, newName: string) => {
+ const renameWorkflow = async (workflow: ComfyWorkflow, newPath: string) => {
// Capture all needed values upfront
const oldPath = workflow.path
- const newPath = workflow.directory + '/' + appendJsonExt(newName)
const wasBookmarked = bookmarkStore.isBookmarked(oldPath)
const openIndex = detachWorkflow(workflow)
// Perform the actual rename operation first
try {
- await workflow.rename(newName)
+ await workflow.rename(newPath)
} finally {
attachWorkflow(workflow, openIndex)
}
@@ -353,7 +330,6 @@ export const useWorkflowStore = defineStore('workflow', () => {
activeWorkflow,
isActive,
openWorkflows,
- openWorkflowsTree,
openedWorkflowIndexShift,
openWorkflow,
isOpen,
@@ -365,11 +341,9 @@ export const useWorkflowStore = defineStore('workflow', () => {
workflows,
bookmarkedWorkflows,
+ persistedWorkflows,
modifiedWorkflows,
getWorkflowByPath,
- workflowsTree,
- bookmarkedWorkflowsTree,
- buildWorkflowTree,
syncWorkflows
}
})
diff --git a/tests-ui/tests/fast/store/workflowStore.test.ts b/tests-ui/tests/fast/store/workflowStore.test.ts
index 4b647f4ca..ec30456b8 100644
--- a/tests-ui/tests/fast/store/workflowStore.test.ts
+++ b/tests-ui/tests/fast/store/workflowStore.test.ts
@@ -178,9 +178,8 @@ describe('useWorkflowStore', () => {
} as any)
// Perform rename
- const newName = 'renamed.json'
const newPath = 'workflows/dir/renamed.json'
- await store.renameWorkflow(workflow, newName)
+ await store.renameWorkflow(workflow, newPath)
// Check that bookmark was transferred
expect(bookmarkStore.isBookmarked(newPath)).toBe(true)