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 };
}