diff --git a/frontend/src/components/admin/OutputTypeTable.tsx b/frontend/src/components/admin/OutputTypeTable.tsx index f1066a6..2199c00 100644 --- a/frontend/src/components/admin/OutputTypeTable.tsx +++ b/frontend/src/components/admin/OutputTypeTable.tsx @@ -1,4 +1,4 @@ -import { useState, useRef, useEffect } from 'react' +import React, { useState, useRef, useEffect } from 'react' import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' import { Pencil, Trash2, Plus, Check, X, ChevronDown, Copy } from 'lucide-react' import { toast } from 'sonner' @@ -218,6 +218,452 @@ export default function OutputTypeTable() { return renderer === 'blender' } + // Render the edit form grid (shared between edit-row and add-row) + function renderEditFormGrid( + mode: 'edit' | 'add', + ot: OutputType | null, + ) { + // For edit mode, use editDraft + ot fallback. For add mode, use form state. + const isEdit = mode === 'edit' && ot !== null + + // Getter helpers + const val = (field: keyof typeof form) => { + if (isEdit) { + if (field === 'name') return editDraft.name ?? ot!.name + if (field === 'renderer') return editDraft.renderer ?? ot!.renderer + if (field === 'output_format') return editDraft.output_format ?? ot!.output_format + if (field === 'is_animation') return editDraft.is_animation ?? ot!.is_animation + if (field === 'transparent_bg') return editDraft.transparent_bg ?? ot!.transparent_bg + if (field === 'cycles_device') return editDraft.cycles_device ?? (ot!.cycles_device || '') + if (field === 'sort_order') return editDraft.sort_order ?? ot!.sort_order + if (field === 'pricing_tier_id') return editDraft.pricing_tier_id ?? ot!.pricing_tier_id ?? '' + if (field === 'material_override') return editDraft.material_override ?? ot!.material_override ?? '' + // render_settings fields (prefixed with _) + if (field === 'width') return (editDraft as any)._width ?? (ot!.render_settings?.width || '') + if (field === 'height') return (editDraft as any)._height ?? (ot!.render_settings?.height || '') + if (field === 'engine') return (editDraft as any)._engine ?? (ot!.render_settings?.engine || '') + if (field === 'samples') return (editDraft as any)._samples ?? (ot!.render_settings?.samples || '') + if (field === 'frame_count') return (editDraft as any)._frame_count ?? (ot!.render_settings?.frame_count || '') + if (field === 'fps') return (editDraft as any)._fps ?? (ot!.render_settings?.fps || '') + if (field === 'turntable_axis') return (editDraft as any)._turntable_axis ?? (ot!.render_settings?.turntable_axis || 'world_z') + if (field === 'bg_color') { + return (editDraft as any)._bg_color !== undefined + ? (editDraft as any)._bg_color as string + : (ot!.render_settings?.bg_color as string || '') + } + if (field === 'noise_threshold') return (editDraft as any)._noise_threshold ?? (ot!.render_settings?.noise_threshold as string || '') + if (field === 'denoiser') return (editDraft as any)._denoiser ?? (ot!.render_settings?.denoiser as string || '') + if (field === 'denoising_input_passes') return (editDraft as any)._denoising_input_passes ?? (ot!.render_settings?.denoising_input_passes as string || '') + if (field === 'denoising_prefilter') return (editDraft as any)._denoising_prefilter ?? (ot!.render_settings?.denoising_prefilter as string || '') + if (field === 'denoising_quality') return (editDraft as any)._denoising_quality ?? (ot!.render_settings?.denoising_quality as string || '') + if (field === 'denoising_use_gpu') return (editDraft as any)._denoising_use_gpu ?? (ot!.render_settings?.denoising_use_gpu as string || '') + return (form as any)[field] + } + return (form as any)[field] + } + + const set = (field: string, value: any) => { + if (isEdit) { + // render_settings fields get _ prefix in editDraft + const rsFields = ['width', 'height', 'engine', 'samples', 'frame_count', 'fps', 'turntable_axis', 'bg_color', 'noise_threshold', 'denoiser', 'denoising_input_passes', 'denoising_prefilter', 'denoising_quality', 'denoising_use_gpu'] + if (rsFields.includes(field)) { + setEditDraft({ ...editDraft, [`_${field}`]: value } as any) + } else { + setEditDraft({ ...editDraft, [field]: value } as any) + } + } else { + setForm({ ...form, [field]: value }) + } + } + + const currentRenderer = val('renderer') as string + const currentFormat = val('output_format') as string + const currentIsAnimation = val('is_animation') as boolean + const isBlender = showBlenderSettings(currentRenderer) + const showBg = showTransparentBg(currentRenderer, currentFormat) + const bgColor = val('bg_color') as string + const bgEnabled = bgColor !== '' + + const categoriesValue = isEdit + ? (editDraft.compatible_categories ?? ot!.compatible_categories) || [] + : form.compatible_categories + + return ( + <> + {/* Row 1: Name | Renderer | Format | Animation */} +