diff --git a/src/components/sidebar/tabs/AssetsSidebarTab.vue b/src/components/sidebar/tabs/AssetsSidebarTab.vue index 3285000a1..c06edb4af 100644 --- a/src/components/sidebar/tabs/AssetsSidebarTab.vue +++ b/src/components/sidebar/tabs/AssetsSidebarTab.vue @@ -227,19 +227,11 @@ import { useAssetSelection } from '@/platform/assets/composables/useAssetSelecti import { useMediaAssetActions } from '@/platform/assets/composables/useMediaAssetActions' import { useMediaAssetFiltering } from '@/platform/assets/composables/useMediaAssetFiltering' import { getOutputAssetMetadata } from '@/platform/assets/schemas/assetMetadataSchema' -import type { OutputAssetMetadata } from '@/platform/assets/schemas/assetMetadataSchema' import type { AssetItem } from '@/platform/assets/schemas/assetSchema' import type { MediaKind } from '@/platform/assets/schemas/mediaAssetSchema' -import { - mapOutputsToAssetItems, - shouldLoadFullOutputs -} from '@/platform/assets/utils/outputAssetUtil' +import { resolveOutputAssetItems } from '@/platform/assets/utils/outputAssetUtil' import { isCloud } from '@/platform/distribution/types' import { useSettingStore } from '@/platform/settings/settingStore' -import { - getJobDetail, - getPreviewableOutputsFromJobDetail -} from '@/services/jobOutputCache' import { useCommandStore } from '@/stores/commandStore' import { useDialogStore } from '@/stores/dialogStore' import { useExecutionStore } from '@/stores/executionStore' @@ -561,17 +553,6 @@ const handleZoomClick = (asset: AssetItem) => { } } -async function resolveFolderOutputs(metadata: OutputAssetMetadata) { - const outputsToDisplay = metadata.allOutputs ?? [] - if (!shouldLoadFullOutputs(metadata.outputCount, outputsToDisplay.length)) { - return outputsToDisplay - } - - const jobDetail = await getJobDetail(metadata.promptId) - const previewableOutputs = getPreviewableOutputsFromJobDetail(jobDetail) - return previewableOutputs.length ? previewableOutputs : outputsToDisplay -} - const enterFolderView = async (asset: AssetItem) => { const metadata = getOutputAssetMetadata(asset.user_metadata) if (!metadata) { @@ -589,20 +570,16 @@ const enterFolderView = async (asset: AssetItem) => { folderPromptId.value = promptId folderExecutionTime.value = executionTimeInSeconds - const outputsToDisplay = await resolveFolderOutputs(metadata) + const folderItems = await resolveOutputAssetItems(metadata, { + createdAt: asset.created_at + }) - if (outputsToDisplay.length === 0) { + if (folderItems.length === 0) { console.warn('No outputs available for folder view') return } - folderAssets.value = mapOutputsToAssetItems({ - promptId, - outputs: outputsToDisplay, - createdAt: asset.created_at, - executionTimeInSeconds, - workflow: metadata.workflow - }) + folderAssets.value = folderItems } const exitFolderView = () => { diff --git a/src/platform/assets/composables/useOutputStacks.ts b/src/platform/assets/composables/useOutputStacks.ts index 63b9366b5..e5260f93a 100644 --- a/src/platform/assets/composables/useOutputStacks.ts +++ b/src/platform/assets/composables/useOutputStacks.ts @@ -1,17 +1,9 @@ import { computed, ref } from 'vue' import type { Ref } from 'vue' -import { getOutputAssetMetadata } from '@/platform/assets/schemas/assetMetadataSchema'; -import type { OutputAssetMetadata } from '@/platform/assets/schemas/assetMetadataSchema'; +import { getOutputAssetMetadata } from '@/platform/assets/schemas/assetMetadataSchema' import type { AssetItem } from '@/platform/assets/schemas/assetSchema' -import { - mapOutputsToAssetItems, - shouldLoadFullOutputs -} from '@/platform/assets/utils/outputAssetUtil' -import { - getJobDetail, - getPreviewableOutputsFromJobDetail -} from '@/services/jobOutputCache' +import { resolveOutputAssetItems } from '@/platform/assets/utils/outputAssetUtil' export type OutputStackListItem = { key: string @@ -110,41 +102,20 @@ export function useOutputStacks({ assets }: UseOutputStacksOptions) { expandedStackPromptIds.value = nextExpanded } - async function resolveStackOutputs(metadata: OutputAssetMetadata) { - const outputsToDisplay = metadata.allOutputs ?? [] - if (!shouldLoadFullOutputs(metadata.outputCount, outputsToDisplay.length)) { - return outputsToDisplay - } - - try { - const jobDetail = await getJobDetail(metadata.promptId) - const previewableOutputs = getPreviewableOutputsFromJobDetail(jobDetail) - return previewableOutputs.length ? previewableOutputs : outputsToDisplay - } catch (error) { - console.error('Failed to fetch job detail for stack children:', error) - return outputsToDisplay - } - } - async function resolveStackChildren(asset: AssetItem): Promise { const metadata = getOutputAssetMetadata(asset.user_metadata) if (!metadata) { return [] } - - const outputsToDisplay = await resolveStackOutputs(metadata) - if (!outputsToDisplay.length) { + try { + return await resolveOutputAssetItems(metadata, { + createdAt: asset.created_at, + excludeOutputKey: asset.name + }) + } catch (error) { + console.error('Failed to resolve stack children:', error) return [] } - - return mapOutputsToAssetItems({ - promptId: metadata.promptId, - outputs: outputsToDisplay, - createdAt: asset.created_at, - executionTimeInSeconds: metadata.executionTimeInSeconds, - workflow: metadata.workflow, - excludeFilename: asset.name - }) } return { diff --git a/src/platform/assets/utils/outputAssetUtil.ts b/src/platform/assets/utils/outputAssetUtil.ts index abdaf0eb8..6d651d84f 100644 --- a/src/platform/assets/utils/outputAssetUtil.ts +++ b/src/platform/assets/utils/outputAssetUtil.ts @@ -1,5 +1,9 @@ import type { OutputAssetMetadata } from '@/platform/assets/schemas/assetMetadataSchema' import type { AssetItem } from '@/platform/assets/schemas/assetSchema' +import { + getJobDetail, + getPreviewableOutputsFromJobDetail +} from '@/services/jobOutputCache' import type { ResultItemImpl } from '@/stores/queueStore' type OutputAssetMapOptions = { @@ -11,6 +15,11 @@ type OutputAssetMapOptions = { excludeFilename?: string } +type ResolveOutputAssetItemsOptions = { + createdAt?: string + excludeOutputKey?: string +} + export function shouldLoadFullOutputs( outputCount: OutputAssetMetadata['outputCount'], outputsLength: number @@ -50,3 +59,26 @@ export function mapOutputsToAssetItems({ } })) } + +export async function resolveOutputAssetItems( + metadata: OutputAssetMetadata, + { createdAt, excludeOutputKey }: ResolveOutputAssetItemsOptions = {} +): Promise { + let outputsToDisplay = metadata.allOutputs ?? [] + if (shouldLoadFullOutputs(metadata.outputCount, outputsToDisplay.length)) { + const jobDetail = await getJobDetail(metadata.promptId) + const previewableOutputs = getPreviewableOutputsFromJobDetail(jobDetail) + if (previewableOutputs.length) { + outputsToDisplay = previewableOutputs + } + } + + return mapOutputsToAssetItems({ + promptId: metadata.promptId, + outputs: outputsToDisplay, + createdAt, + executionTimeInSeconds: metadata.executionTimeInSeconds, + workflow: metadata.workflow, + excludeFilename: excludeOutputKey + }) +}