feat: add workspace view mode settings
This commit is contained in:
1 parent
9471e72171
commit
690d09a3d1
13 files changed
+842
-518
No files matched your search
@@ -1,6 +1,6 @@
|
||||
"use client";
|
||||
|
||||
import { MoonIcon, SunIcon } from "lucide-react";
|
||||
import { LayoutGridIcon, ListIcon, MoonIcon, SunIcon } from "lucide-react";
|
||||
import { useMemo, type ComponentType, type SVGProps } from "react";
|
||||
import { toast } from "sonner";
|
||||
|
||||
@@ -48,6 +48,8 @@ export function AppearanceSettingsPage() {
|
||||
const { data: citationDisplay } = useCitationDisplaySettings();
|
||||
const updateCitationDisplay = useUpdateCitationDisplaySettings();
|
||||
const globalDefault = appearance?.default_theme ?? "light";
|
||||
const globalSkillView = appearance?.default_skill_view ?? "list";
|
||||
const globalAgentView = appearance?.default_agent_view ?? "card";
|
||||
const cleanupWords =
|
||||
citationDisplay?.cleanup_words ?? settings.display.citationCleanupWords ?? [];
|
||||
|
||||
@@ -65,6 +67,27 @@ export function AppearanceSettingsPage() {
|
||||
}
|
||||
};
|
||||
|
||||
const handleSetDefaultView = async (
|
||||
kind: "skill" | "agent",
|
||||
value: "card" | "list",
|
||||
) => {
|
||||
const current = kind === "skill" ? globalSkillView : globalAgentView;
|
||||
if (value === current) return;
|
||||
try {
|
||||
await updateAppearance.mutateAsync(
|
||||
kind === "skill"
|
||||
? { default_skill_view: value }
|
||||
: { default_agent_view: value },
|
||||
);
|
||||
const label = kind === "skill" ? "技能" : "智能体";
|
||||
toast.success(
|
||||
`已将${label}默认展示模式设置为${value === "card" ? "卡片" : "列表"}`,
|
||||
);
|
||||
} catch (e) {
|
||||
toast.error(e instanceof Error ? e.message : "保存失败");
|
||||
}
|
||||
};
|
||||
|
||||
const themeOptions = useMemo(
|
||||
() => [
|
||||
{
|
||||
@@ -146,6 +169,52 @@ export function AppearanceSettingsPage() {
|
||||
</>
|
||||
)}
|
||||
|
||||
{isAdmin && (
|
||||
<>
|
||||
<Separator />
|
||||
<SettingsSection
|
||||
title="默认展示模式(管理员)"
|
||||
description="技能与智能体列表对所有还没有手动切换过的用户的默认展示模式;已经自己切换过的用户保留其个人选择不受影响。"
|
||||
>
|
||||
<div className="flex flex-col gap-4">
|
||||
{(
|
||||
[
|
||||
{ kind: "skill", label: "技能", current: globalSkillView },
|
||||
{ kind: "agent", label: "智能体", current: globalAgentView },
|
||||
] as const
|
||||
).map(({ kind, label, current }) => (
|
||||
<div key={kind} className="flex flex-wrap items-center gap-2">
|
||||
<span className="w-14 text-sm font-medium">{label}</span>
|
||||
<Button
|
||||
type="button"
|
||||
variant={current === "card" ? "default" : "outline"}
|
||||
size="sm"
|
||||
onClick={() => void handleSetDefaultView(kind, "card")}
|
||||
disabled={updateAppearance.isPending}
|
||||
>
|
||||
<LayoutGridIcon className="mr-1.5 size-4" />
|
||||
卡片
|
||||
</Button>
|
||||
<Button
|
||||
type="button"
|
||||
variant={current === "list" ? "default" : "outline"}
|
||||
size="sm"
|
||||
onClick={() => void handleSetDefaultView(kind, "list")}
|
||||
disabled={updateAppearance.isPending}
|
||||
>
|
||||
<ListIcon className="mr-1.5 size-4" />
|
||||
列表
|
||||
</Button>
|
||||
<p className="text-muted-foreground ml-2 text-xs">
|
||||
当前系统默认:{current === "card" ? "卡片" : "列表"}
|
||||
</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</SettingsSection>
|
||||
</>
|
||||
)}
|
||||
|
||||
<Separator />
|
||||
|
||||
<SettingsSection
|
||||
|
||||
Reference in new issue
Block a user