Add video canvas sidebar setting
This commit is contained in:
parent
be8cb630f9
commit
c74dffdcd6
@ -418,6 +418,7 @@ type SiteSettings = {
|
|||||||
canvasEnabled: boolean;
|
canvasEnabled: boolean;
|
||||||
agentEnabled: boolean;
|
agentEnabled: boolean;
|
||||||
canvasAgentModeEnabled: boolean;
|
canvasAgentModeEnabled: boolean;
|
||||||
|
videoCanvasSidebarEnabled: boolean;
|
||||||
agentCategoryTreeConfig: {
|
agentCategoryTreeConfig: {
|
||||||
productCategories: string[];
|
productCategories: string[];
|
||||||
audienceTags: string[];
|
audienceTags: string[];
|
||||||
@ -915,6 +916,7 @@ export function AdminSettingsClient() {
|
|||||||
canvasEnabled: true,
|
canvasEnabled: true,
|
||||||
agentEnabled: true,
|
agentEnabled: true,
|
||||||
canvasAgentModeEnabled: true,
|
canvasAgentModeEnabled: true,
|
||||||
|
videoCanvasSidebarEnabled: true,
|
||||||
agentCategoryTreeConfig: {
|
agentCategoryTreeConfig: {
|
||||||
productCategories: [],
|
productCategories: [],
|
||||||
audienceTags: [],
|
audienceTags: [],
|
||||||
@ -1014,6 +1016,8 @@ export function AdminSettingsClient() {
|
|||||||
agentEnabled: (siteSettingsData as any).agentEnabled ?? true,
|
agentEnabled: (siteSettingsData as any).agentEnabled ?? true,
|
||||||
canvasAgentModeEnabled:
|
canvasAgentModeEnabled:
|
||||||
(siteSettingsData as any).canvasAgentModeEnabled ?? true,
|
(siteSettingsData as any).canvasAgentModeEnabled ?? true,
|
||||||
|
videoCanvasSidebarEnabled:
|
||||||
|
(siteSettingsData as any).videoCanvasSidebarEnabled ?? true,
|
||||||
agentCategoryTreeConfig: {
|
agentCategoryTreeConfig: {
|
||||||
productCategories: Array.isArray(
|
productCategories: Array.isArray(
|
||||||
(siteSettingsData as any).agentCategoryTreeConfig?.productCategories
|
(siteSettingsData as any).agentCategoryTreeConfig?.productCategories
|
||||||
@ -8566,6 +8570,27 @@ export function AdminSettingsClient() {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div className="flex items-center justify-between rounded-lg border p-3">
|
||||||
|
<div className="space-y-0.5">
|
||||||
|
<Label htmlFor="videoCanvasSidebarEnabled">
|
||||||
|
视频画布模块侧边栏
|
||||||
|
</Label>
|
||||||
|
<div className="text-xs text-muted-foreground">
|
||||||
|
开启后,视频画布左侧显示“视频模块”分层侧边栏;关闭后只保留画布本体与节点快捷添加。
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Switch
|
||||||
|
id="videoCanvasSidebarEnabled"
|
||||||
|
checked={siteSettings.videoCanvasSidebarEnabled}
|
||||||
|
onCheckedChange={(checked) =>
|
||||||
|
setSiteSettings({
|
||||||
|
...siteSettings,
|
||||||
|
videoCanvasSidebarEnabled: checked,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="flex items-center justify-between rounded-lg border p-3">
|
<div className="flex items-center justify-between rounded-lg border p-3">
|
||||||
<div className="space-y-0.5">
|
<div className="space-y-0.5">
|
||||||
<Label htmlFor="aiDetailGenerationEnabled">
|
<Label htmlFor="aiDetailGenerationEnabled">
|
||||||
|
|||||||
@ -107,6 +107,7 @@ const STORAGE_FAILOVER_CONFIG_KEY = "storage_failover_config";
|
|||||||
const REALTIME_CANVAS_CONFIG_KEY = "realtime_canvas_config";
|
const REALTIME_CANVAS_CONFIG_KEY = "realtime_canvas_config";
|
||||||
const AGENT_CATEGORY_TREE_CONFIG_KEY = "agent_category_tree_config";
|
const AGENT_CATEGORY_TREE_CONFIG_KEY = "agent_category_tree_config";
|
||||||
const CANVAS_AGENT_MODE_ENABLED_KEY = "canvas_agent_mode_enabled";
|
const CANVAS_AGENT_MODE_ENABLED_KEY = "canvas_agent_mode_enabled";
|
||||||
|
const VIDEO_CANVAS_SIDEBAR_ENABLED_KEY = "video_canvas_sidebar_enabled";
|
||||||
|
|
||||||
function normalizeHomeVariant(value: unknown): "classic" | "lovart" {
|
function normalizeHomeVariant(value: unknown): "classic" | "lovart" {
|
||||||
return value === "lovart" ? "lovart" : "classic";
|
return value === "lovart" ? "lovart" : "classic";
|
||||||
@ -225,6 +226,10 @@ function normalizeCanvasAgentModeEnabled(value: unknown): boolean {
|
|||||||
return value !== false;
|
return value !== false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function normalizeVideoCanvasSidebarEnabled(value: unknown): boolean {
|
||||||
|
return value !== false;
|
||||||
|
}
|
||||||
|
|
||||||
function normalizeAgentCategoryTreeConfig(value: unknown): AgentCategoryTreeConfig {
|
function normalizeAgentCategoryTreeConfig(value: unknown): AgentCategoryTreeConfig {
|
||||||
const raw =
|
const raw =
|
||||||
value && typeof value === "object" && !Array.isArray(value)
|
value && typeof value === "object" && !Array.isArray(value)
|
||||||
@ -274,6 +279,7 @@ export async function GET() {
|
|||||||
dulupayConfigSetting,
|
dulupayConfigSetting,
|
||||||
realtimeCanvasConfigSetting,
|
realtimeCanvasConfigSetting,
|
||||||
canvasAgentModeEnabledSetting,
|
canvasAgentModeEnabledSetting,
|
||||||
|
videoCanvasSidebarEnabledSetting,
|
||||||
storageFailoverConfigSetting,
|
storageFailoverConfigSetting,
|
||||||
ossImageMigrationConfigSetting,
|
ossImageMigrationConfigSetting,
|
||||||
agentPresetLibraryConfigSetting,
|
agentPresetLibraryConfigSetting,
|
||||||
@ -380,6 +386,12 @@ export async function GET() {
|
|||||||
.where(eq(systemSettings.key, CANVAS_AGENT_MODE_ENABLED_KEY))
|
.where(eq(systemSettings.key, CANVAS_AGENT_MODE_ENABLED_KEY))
|
||||||
.limit(1)
|
.limit(1)
|
||||||
.then(rows => rows[0]),
|
.then(rows => rows[0]),
|
||||||
|
db
|
||||||
|
.select()
|
||||||
|
.from(systemSettings)
|
||||||
|
.where(eq(systemSettings.key, VIDEO_CANVAS_SIDEBAR_ENABLED_KEY))
|
||||||
|
.limit(1)
|
||||||
|
.then(rows => rows[0]),
|
||||||
db
|
db
|
||||||
.select()
|
.select()
|
||||||
.from(systemSettings)
|
.from(systemSettings)
|
||||||
@ -491,6 +503,9 @@ export async function GET() {
|
|||||||
const canvasAgentModeEnabled = normalizeCanvasAgentModeEnabled(
|
const canvasAgentModeEnabled = normalizeCanvasAgentModeEnabled(
|
||||||
canvasAgentModeEnabledSetting?.value
|
canvasAgentModeEnabledSetting?.value
|
||||||
);
|
);
|
||||||
|
const videoCanvasSidebarEnabled = normalizeVideoCanvasSidebarEnabled(
|
||||||
|
videoCanvasSidebarEnabledSetting?.value
|
||||||
|
);
|
||||||
const storageFailoverConfig = normalizeStorageFailoverConfig(
|
const storageFailoverConfig = normalizeStorageFailoverConfig(
|
||||||
storageFailoverConfigSetting?.value
|
storageFailoverConfigSetting?.value
|
||||||
);
|
);
|
||||||
@ -567,6 +582,7 @@ export async function GET() {
|
|||||||
canvasEnabled: true,
|
canvasEnabled: true,
|
||||||
agentEnabled: true,
|
agentEnabled: true,
|
||||||
canvasAgentModeEnabled: true,
|
canvasAgentModeEnabled: true,
|
||||||
|
videoCanvasSidebarEnabled: true,
|
||||||
agentPresetLibraryConfig: defaultAgentPresetLibraryConfig,
|
agentPresetLibraryConfig: defaultAgentPresetLibraryConfig,
|
||||||
agentCategoryTreeConfig: normalizeAgentCategoryTreeConfig(undefined),
|
agentCategoryTreeConfig: normalizeAgentCategoryTreeConfig(undefined),
|
||||||
agentSecondaryTypeConfig: defaultAgentSecondaryTypeConfig,
|
agentSecondaryTypeConfig: defaultAgentSecondaryTypeConfig,
|
||||||
@ -643,6 +659,7 @@ export async function GET() {
|
|||||||
dulupayConfig,
|
dulupayConfig,
|
||||||
realtimeCanvasServiceEnabled,
|
realtimeCanvasServiceEnabled,
|
||||||
canvasAgentModeEnabled,
|
canvasAgentModeEnabled,
|
||||||
|
videoCanvasSidebarEnabled,
|
||||||
storageFailoverConfig,
|
storageFailoverConfig,
|
||||||
ossImageMigrationConfig,
|
ossImageMigrationConfig,
|
||||||
});
|
});
|
||||||
@ -689,6 +706,7 @@ const updateSchema = z.object({
|
|||||||
canvasEnabled: z.boolean().optional(),
|
canvasEnabled: z.boolean().optional(),
|
||||||
agentEnabled: z.boolean().optional(),
|
agentEnabled: z.boolean().optional(),
|
||||||
canvasAgentModeEnabled: z.boolean().optional(),
|
canvasAgentModeEnabled: z.boolean().optional(),
|
||||||
|
videoCanvasSidebarEnabled: z.boolean().optional(),
|
||||||
agentPresetLibraryConfig: z
|
agentPresetLibraryConfig: z
|
||||||
.object({
|
.object({
|
||||||
sections: z
|
sections: z
|
||||||
@ -1086,6 +1104,7 @@ export async function PUT(request: NextRequest) {
|
|||||||
storageFailoverConfig,
|
storageFailoverConfig,
|
||||||
ossImageMigrationConfig,
|
ossImageMigrationConfig,
|
||||||
canvasAgentModeEnabled,
|
canvasAgentModeEnabled,
|
||||||
|
videoCanvasSidebarEnabled,
|
||||||
homeAnimationConfig,
|
homeAnimationConfig,
|
||||||
...siteSettingsPayload
|
...siteSettingsPayload
|
||||||
} = data;
|
} = data;
|
||||||
@ -1304,6 +1323,26 @@ export async function PUT(request: NextRequest) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (videoCanvasSidebarEnabled !== undefined) {
|
||||||
|
const normalized = normalizeVideoCanvasSidebarEnabled(videoCanvasSidebarEnabled);
|
||||||
|
await db
|
||||||
|
.insert(systemSettings)
|
||||||
|
.values({
|
||||||
|
key: VIDEO_CANVAS_SIDEBAR_ENABLED_KEY,
|
||||||
|
value: normalized,
|
||||||
|
updatedAt: new Date(),
|
||||||
|
updatedBy: session.user.id,
|
||||||
|
})
|
||||||
|
.onConflictDoUpdate({
|
||||||
|
target: systemSettings.key,
|
||||||
|
set: {
|
||||||
|
value: normalized,
|
||||||
|
updatedAt: new Date(),
|
||||||
|
updatedBy: session.user.id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (agentPresetLibraryConfig !== undefined) {
|
if (agentPresetLibraryConfig !== undefined) {
|
||||||
const normalized = normalizeAgentPresetLibraryConfig(agentPresetLibraryConfig);
|
const normalized = normalizeAgentPresetLibraryConfig(agentPresetLibraryConfig);
|
||||||
await db
|
await db
|
||||||
@ -1800,6 +1839,10 @@ export async function PUT(request: NextRequest) {
|
|||||||
canvasAgentModeEnabled !== undefined
|
canvasAgentModeEnabled !== undefined
|
||||||
? normalizeCanvasAgentModeEnabled(canvasAgentModeEnabled)
|
? normalizeCanvasAgentModeEnabled(canvasAgentModeEnabled)
|
||||||
: normalizeCanvasAgentModeEnabled(undefined),
|
: normalizeCanvasAgentModeEnabled(undefined),
|
||||||
|
videoCanvasSidebarEnabled:
|
||||||
|
videoCanvasSidebarEnabled !== undefined
|
||||||
|
? normalizeVideoCanvasSidebarEnabled(videoCanvasSidebarEnabled)
|
||||||
|
: normalizeVideoCanvasSidebarEnabled(undefined),
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// 创建新设置
|
// 创建新设置
|
||||||
@ -2004,6 +2047,26 @@ export async function PUT(request: NextRequest) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (videoCanvasSidebarEnabled !== undefined) {
|
||||||
|
const normalized = normalizeVideoCanvasSidebarEnabled(videoCanvasSidebarEnabled);
|
||||||
|
await db
|
||||||
|
.insert(systemSettings)
|
||||||
|
.values({
|
||||||
|
key: VIDEO_CANVAS_SIDEBAR_ENABLED_KEY,
|
||||||
|
value: normalized,
|
||||||
|
updatedAt: new Date(),
|
||||||
|
updatedBy: session.user.id,
|
||||||
|
})
|
||||||
|
.onConflictDoUpdate({
|
||||||
|
target: systemSettings.key,
|
||||||
|
set: {
|
||||||
|
value: normalized,
|
||||||
|
updatedAt: new Date(),
|
||||||
|
updatedBy: session.user.id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (agentPresetLibraryConfig !== undefined) {
|
if (agentPresetLibraryConfig !== undefined) {
|
||||||
const normalized = normalizeAgentPresetLibraryConfig(agentPresetLibraryConfig);
|
const normalized = normalizeAgentPresetLibraryConfig(agentPresetLibraryConfig);
|
||||||
await db
|
await db
|
||||||
@ -2432,6 +2495,10 @@ export async function PUT(request: NextRequest) {
|
|||||||
canvasAgentModeEnabled !== undefined
|
canvasAgentModeEnabled !== undefined
|
||||||
? normalizeCanvasAgentModeEnabled(canvasAgentModeEnabled)
|
? normalizeCanvasAgentModeEnabled(canvasAgentModeEnabled)
|
||||||
: normalizeCanvasAgentModeEnabled(undefined),
|
: normalizeCanvasAgentModeEnabled(undefined),
|
||||||
|
videoCanvasSidebarEnabled:
|
||||||
|
videoCanvasSidebarEnabled !== undefined
|
||||||
|
? normalizeVideoCanvasSidebarEnabled(videoCanvasSidebarEnabled)
|
||||||
|
: normalizeVideoCanvasSidebarEnabled(undefined),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@ -1225,6 +1225,7 @@ export default function CanvasEditorPage({ params }: PageProps) {
|
|||||||
siteLogoDark?: string | null;
|
siteLogoDark?: string | null;
|
||||||
agentEnabled?: boolean;
|
agentEnabled?: boolean;
|
||||||
canvasAgentModeEnabled?: boolean;
|
canvasAgentModeEnabled?: boolean;
|
||||||
|
videoCanvasSidebarEnabled?: boolean;
|
||||||
realtimeCanvasEnabled?: boolean;
|
realtimeCanvasEnabled?: boolean;
|
||||||
realtimeCanvasServiceEnabled?: boolean;
|
realtimeCanvasServiceEnabled?: boolean;
|
||||||
agentWorkflowShowcaseConfig?: AgentWorkflowShowcaseConfig;
|
agentWorkflowShowcaseConfig?: AgentWorkflowShowcaseConfig;
|
||||||
@ -1267,6 +1268,8 @@ export default function CanvasEditorPage({ params }: PageProps) {
|
|||||||
const isAgentWorkspaceEnabled = siteSettingsData?.agentEnabled !== false;
|
const isAgentWorkspaceEnabled = siteSettingsData?.agentEnabled !== false;
|
||||||
const isCanvasAgentModeEnabled =
|
const isCanvasAgentModeEnabled =
|
||||||
siteSettingsData?.canvasAgentModeEnabled !== false;
|
siteSettingsData?.canvasAgentModeEnabled !== false;
|
||||||
|
const isVideoModuleSidebarEnabled =
|
||||||
|
siteSettingsData?.videoCanvasSidebarEnabled !== false;
|
||||||
const isAgentMode = isAgentWorkspaceEnabled && requestedAgentMode;
|
const isAgentMode = isAgentWorkspaceEnabled && requestedAgentMode;
|
||||||
const hasLoadedCurrentAgentProject =
|
const hasLoadedCurrentAgentProject =
|
||||||
!requestedAgentMode ||
|
!requestedAgentMode ||
|
||||||
@ -1401,7 +1404,7 @@ export default function CanvasEditorPage({ params }: PageProps) {
|
|||||||
selectedWorkflowQuickConnectAnchor && selectedVideoWorkflowNode
|
selectedWorkflowQuickConnectAnchor && selectedVideoWorkflowNode
|
||||||
? selectedVideoWorkflowNode
|
? selectedVideoWorkflowNode
|
||||||
: null;
|
: null;
|
||||||
const videoModuleSidebarWidth = isVideoMode
|
const videoModuleSidebarWidth = isVideoMode && isVideoModuleSidebarEnabled
|
||||||
? isVideoModuleSidebarCollapsed
|
? isVideoModuleSidebarCollapsed
|
||||||
? 58
|
? 58
|
||||||
: 236
|
: 236
|
||||||
@ -8289,7 +8292,7 @@ export default function CanvasEditorPage({ params }: PageProps) {
|
|||||||
</DropdownMenu>
|
</DropdownMenu>
|
||||||
) : null}
|
) : null}
|
||||||
|
|
||||||
{isVideoMode ? (
|
{isVideoMode && isVideoModuleSidebarEnabled ? (
|
||||||
<div
|
<div
|
||||||
className="pointer-events-auto absolute top-16 left-4 z-20"
|
className="pointer-events-auto absolute top-16 left-4 z-20"
|
||||||
style={{ width: `${videoModuleSidebarWidth}px` }}
|
style={{ width: `${videoModuleSidebarWidth}px` }}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user