From 28bdec98133c876fcb8b35c7ef4288ab5e2ec823 Mon Sep 17 00:00:00 2001 From: Chris Busillo Date: Sat, 6 Jun 2026 13:42:17 -0400 Subject: [PATCH] Render folder studio progressively --- frontend/src/lib/api/placeholders.ts | 58 ++++++++ .../workstation/FolderStudioView.svelte | 28 ++-- .../workstation/folder-studio-view.test.ts | 25 ++++ .../workstation/folder-studio-view.ts | 15 +- .../routes/folders/[...prefix]/+page.svelte | 133 ++++++++++++++++-- .../src/routes/folders/[...prefix]/+page.ts | 43 +----- 6 files changed, 241 insertions(+), 61 deletions(-) diff --git a/frontend/src/lib/api/placeholders.ts b/frontend/src/lib/api/placeholders.ts index 5fad80e..530b7a6 100644 --- a/frontend/src/lib/api/placeholders.ts +++ b/frontend/src/lib/api/placeholders.ts @@ -2,6 +2,8 @@ import type { CompletedPayload, DashboardFoldersPayload, DashboardSummaryPayload, + FolderPayload, + FolderStatusPayload, HostsPayload, QueueLane } from './types'; @@ -46,6 +48,62 @@ export const initialFoldersPayload: DashboardFoldersPayload = { export const initialHosts: HostsPayload = { compact: true, hosts: [] }; +export function initialFolderPayload(prefix: string): FolderPayload { + return { + prefix, + pending: true, + metric_support: { vmaf: false, xpsnr: false, ssim: false }, + metric_status_copy: 'loading', + workflow_state: { + prefix, + state: 'loading', + primary_lane: 'none', + label: 'Loading', + tone: 'active', + detail: 'Fetching folder state, worker readiness, and workflow status.', + counts: {}, + lane_counts: {}, + state_counts: {}, + next_action: { + kind: 'review_scope', + label: 'Open folders', + enabled: true, + target_prefix: prefix + }, + blockers: [] + } + }; +} + +export function initialFolderStatusPayload(prefix: string): FolderStatusPayload { + return { + prefix, + polling_active: false, + calibration_status: 'loading', + folder_scan_status: 'loading', + calibration_job: null, + folder_scan_job: null, + workflow_state: { + prefix, + state: 'loading', + primary_lane: 'none', + label: 'Loading', + tone: 'active', + detail: 'Fetching folder state, worker readiness, and workflow status.', + counts: {}, + lane_counts: {}, + state_counts: {}, + next_action: { + kind: 'review_scope', + label: 'Open folders', + enabled: true, + target_prefix: prefix + }, + blockers: [] + } + }; +} + export const initialCompleted: CompletedPayload = { folders: [], completed_count: 0, diff --git a/frontend/src/lib/components/workstation/FolderStudioView.svelte b/frontend/src/lib/components/workstation/FolderStudioView.svelte index 6f95680..93f5747 100644 --- a/frontend/src/lib/components/workstation/FolderStudioView.svelte +++ b/frontend/src/lib/components/workstation/FolderStudioView.svelte @@ -1,5 +1,4 @@ - {data.mode === 'studio' - ? `${data.folder.prefix} · Mediaforce Folder Studio` - : 'Mediaforce Folders'} + {mode === 'studio' ? `${prefix} · Mediaforce Folder Studio` : 'Mediaforce Folders'} -{#if data.mode === 'studio'} - +{#if mode === 'studio'} + {:else} {/if} diff --git a/frontend/src/routes/folders/[...prefix]/+page.ts b/frontend/src/routes/folders/[...prefix]/+page.ts index f35eabe..f5cddc7 100644 --- a/frontend/src/routes/folders/[...prefix]/+page.ts +++ b/frontend/src/routes/folders/[...prefix]/+page.ts @@ -1,43 +1,4 @@ -import { fetchJson } from '$lib/api/client'; -import type { - DashboardFoldersPayload, - DashboardSummaryPayload, - FolderPayload, - FolderStatusPayload, - HostsPayload -} from '$lib/api/types'; - -function encodePrefix(prefix: string): string { - return prefix - .split('/') - .map((segment) => encodeURIComponent(segment)) - .join('/'); -} - -export async function load({ - fetch, - params -}: { - fetch: typeof window.fetch; - params: { prefix?: string }; -}) { +export function load({ params }: { params: { prefix?: string } }) { const prefix = params.prefix ?? ''; - if (!prefix) { - const [dashboard, foldersPayload, hosts] = await Promise.all([ - fetchJson('/api/dashboard', fetch), - fetchJson('/api/dashboard/folders', fetch), - fetchJson('/api/hosts?compact=1', fetch) - ]); - - return { mode: 'directory' as const, dashboard, foldersPayload, hosts }; - } - - const encodedPrefix = encodePrefix(prefix); - const [folder, status, hosts] = await Promise.all([ - fetchJson(`/api/folders/${encodedPrefix}`, fetch), - fetchJson(`/api/folders/${encodedPrefix}/status`, fetch), - fetchJson('/api/hosts?compact=1', fetch) - ]); - - return { mode: 'studio' as const, folder, status, hosts }; + return { mode: prefix ? ('studio' as const) : ('directory' as const), prefix }; }