mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-01-26 19:09:52 +00:00
Adds a workflow progress panel component underneath the `actionbar-container`. I suggest starting a review at the extraneous changes that were needed. Including but not limited to: - `get createTime()` in queueStore - `promptIdToWorkflowId`, `initializingPromptIds`, and `nodeProgressStatesByPrompt` in executionStore - `create_time` handling in v2ToV1Adapter - `pointer-events-auto` on ComfyActionbar.vue The rest of the changes should be contained under `QueueProgressOverlay.vue`, and has less of a blast radius in case something goes wrong. --------- Co-authored-by: pythongosssss <125205205+pythongosssss@users.noreply.github.com> Co-authored-by: GitHub Action <action@github.com> Co-authored-by: github-actions <github-actions@github.com> Co-authored-by: Jin Yi <jin12cc@gmail.com> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Alexander Brown <drjkl@comfy.org> Co-authored-by: Johnpaul Chiwetelu <49923152+Myestery@users.noreply.github.com> Co-authored-by: Christian Byrne <cbyrne@comfy.org> Co-authored-by: Comfy Org PR Bot <snomiao+comfy-pr@gmail.com> Co-authored-by: christian-byrne <72887196+christian-byrne@users.noreply.github.com>
104 lines
3.1 KiB
TypeScript
104 lines
3.1 KiB
TypeScript
import { describe, it, expect } from 'vitest'
|
|
|
|
import { useResultGallery } from '@/composables/queue/useResultGallery'
|
|
import type { JobListItem } from '@/composables/queue/useJobList'
|
|
|
|
type PreviewLike = { url: string; supportsPreview: boolean }
|
|
|
|
const createPreview = (url: string, supportsPreview = true): PreviewLike => ({
|
|
url,
|
|
supportsPreview
|
|
})
|
|
|
|
const createTask = (preview?: PreviewLike) => ({
|
|
previewOutput: preview
|
|
})
|
|
|
|
const createJobItem = (id: string, preview?: PreviewLike): JobListItem =>
|
|
({
|
|
id,
|
|
title: `Job ${id}`,
|
|
meta: '',
|
|
state: 'completed',
|
|
showClear: false,
|
|
taskRef: preview ? { previewOutput: preview } : undefined
|
|
}) as JobListItem
|
|
|
|
describe('useResultGallery', () => {
|
|
it('collects only previewable outputs and preserves their order', () => {
|
|
const previewable = [createPreview('p-1'), createPreview('p-2')]
|
|
const tasks = [
|
|
createTask(previewable[0]),
|
|
createTask({ url: 'skip-me', supportsPreview: false }),
|
|
createTask(previewable[1]),
|
|
createTask()
|
|
]
|
|
|
|
const { galleryItems, galleryActiveIndex, onViewItem } = useResultGallery(
|
|
() => tasks
|
|
)
|
|
|
|
onViewItem(createJobItem('job-1', previewable[0]))
|
|
|
|
expect(galleryItems.value).toEqual(previewable)
|
|
expect(galleryActiveIndex.value).toBe(0)
|
|
})
|
|
|
|
it('does not change state when there are no previewable tasks', () => {
|
|
const { galleryItems, galleryActiveIndex, onViewItem } = useResultGallery(
|
|
() => []
|
|
)
|
|
|
|
onViewItem(createJobItem('job-missing'))
|
|
|
|
expect(galleryItems.value).toEqual([])
|
|
expect(galleryActiveIndex.value).toBe(-1)
|
|
})
|
|
|
|
it('activates the index that matches the viewed preview URL', () => {
|
|
const previewable = [
|
|
createPreview('p-1'),
|
|
createPreview('p-2'),
|
|
createPreview('p-3')
|
|
]
|
|
const tasks = previewable.map((preview) => createTask(preview))
|
|
|
|
const { galleryItems, galleryActiveIndex, onViewItem } = useResultGallery(
|
|
() => tasks
|
|
)
|
|
|
|
onViewItem(createJobItem('job-2', createPreview('p-2')))
|
|
|
|
expect(galleryItems.value).toEqual(previewable)
|
|
expect(galleryActiveIndex.value).toBe(1)
|
|
})
|
|
|
|
it('defaults to the first entry when the clicked job lacks a preview', () => {
|
|
const previewable = [createPreview('p-1'), createPreview('p-2')]
|
|
const tasks = previewable.map((preview) => createTask(preview))
|
|
|
|
const { galleryItems, galleryActiveIndex, onViewItem } = useResultGallery(
|
|
() => tasks
|
|
)
|
|
|
|
onViewItem(createJobItem('job-no-preview'))
|
|
|
|
expect(galleryItems.value).toEqual(previewable)
|
|
expect(galleryActiveIndex.value).toBe(0)
|
|
})
|
|
|
|
it('defaults to the first entry when no gallery item matches the preview URL', () => {
|
|
const previewable = [createPreview('p-1'), createPreview('p-2')]
|
|
const tasks = previewable.map((preview) => createTask(preview))
|
|
|
|
const { galleryItems, galleryActiveIndex, onViewItem } = useResultGallery(
|
|
() => tasks
|
|
)
|
|
|
|
onViewItem(createJobItem('job-mismatch', createPreview('missing')))
|
|
|
|
expect(galleryItems.value).toEqual(previewable)
|
|
expect(galleryActiveIndex.value).toBe(0)
|
|
})
|
|
})
|