feat: 评论/帖子编辑历史与编辑标记,内容锁定
- 新增 smartDiff 差异计算与 EditHistoryModal 编辑历史弹窗,替换原 CommentEditHistoryModal - 新增 PostEditedMark 编辑标记展示 - 新增内容锁定机制(content_lock)防止并发编辑冲突 - 审核与通知服务适配
This commit is contained in:
@@ -56,7 +56,7 @@ export default function PointsTabs({
|
||||
: TAB_OPTIONS.filter((o) => o.key === "overview");
|
||||
|
||||
return (
|
||||
<div>
|
||||
<div className={tab === "users" ? "admin-points-users-tab" : undefined}>
|
||||
{canManage ? (
|
||||
<div className="mb-4">
|
||||
<AdminSegmented
|
||||
|
||||
@@ -24,6 +24,15 @@ const fmt = (n?: number) => (Number(n) || 0).toLocaleString("zh-CN");
|
||||
|
||||
type PointsSortKey = "id" | "points" | "total_points";
|
||||
|
||||
/**
|
||||
* 表头吸顶样式:sticky 相对 .admin-canvas 滚动口生效(lg 起外层不再是滚动容器,见下方包装层)。
|
||||
* 分隔线用 inset 阴影而非 border——border-collapse: collapse 下吸顶 th 的边线会丢失。
|
||||
*/
|
||||
const thStickStyle = {
|
||||
background: "var(--panel)",
|
||||
boxShadow: "inset 0 -1px 0 var(--line)",
|
||||
} as const;
|
||||
|
||||
/** 表头排序按钮:未激活显示双向箭头,激活显示单向箭头并高亮 */
|
||||
function SortHeader({
|
||||
label,
|
||||
@@ -158,24 +167,40 @@ export default function UserPointsTab() {
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="panel p-0 overflow-hidden">
|
||||
<div className="overflow-x-auto">
|
||||
<div className="panel p-0">
|
||||
{/* lg 起放开横向滚动容器:sticky th 才能相对 admin-canvas 吸顶;窄屏保留横向滚动(不吸顶) */}
|
||||
<div className="overflow-x-auto lg:overflow-x-visible">
|
||||
<table className="w-full text-[13px]" style={{ borderCollapse: "collapse" }}>
|
||||
<thead>
|
||||
<tr style={{ borderBottom: "1px solid var(--line)" }}>
|
||||
<th className="px-4 py-2.5 text-left font-medium" style={{ color: "var(--ink-3)" }}>
|
||||
<tr>
|
||||
<th
|
||||
className="sticky top-0 z-10 px-4 py-2.5 text-left font-medium"
|
||||
style={{ color: "var(--ink-3)", ...thStickStyle }}
|
||||
>
|
||||
用户
|
||||
</th>
|
||||
<th className="px-4 py-2.5 text-right font-medium" style={{ color: "var(--ink-3)" }}>
|
||||
<th
|
||||
className="sticky top-0 z-10 px-4 py-2.5 text-right font-medium"
|
||||
style={{ color: "var(--ink-3)", ...thStickStyle }}
|
||||
>
|
||||
<SortHeader label="余额" active={sort === "points"} dir={dir} onClick={() => toggleSort("points")} />
|
||||
</th>
|
||||
<th className="px-4 py-2.5 text-right font-medium" style={{ color: "var(--ink-3)" }}>
|
||||
<th
|
||||
className="sticky top-0 z-10 px-4 py-2.5 text-right font-medium"
|
||||
style={{ color: "var(--ink-3)", ...thStickStyle }}
|
||||
>
|
||||
<SortHeader label="累计获得" active={sort === "total_points"} dir={dir} onClick={() => toggleSort("total_points")} />
|
||||
</th>
|
||||
<th className="px-4 py-2.5 text-left font-medium" style={{ color: "var(--ink-3)" }}>
|
||||
<th
|
||||
className="sticky top-0 z-10 px-4 py-2.5 text-left font-medium"
|
||||
style={{ color: "var(--ink-3)", ...thStickStyle }}
|
||||
>
|
||||
等级
|
||||
</th>
|
||||
<th className="px-4 py-2.5 text-right font-medium" style={{ color: "var(--ink-3)" }}>
|
||||
<th
|
||||
className="sticky top-0 z-10 px-4 py-2.5 text-right font-medium"
|
||||
style={{ color: "var(--ink-3)", ...thStickStyle }}
|
||||
>
|
||||
操作
|
||||
</th>
|
||||
</tr>
|
||||
|
||||
Reference in New Issue
Block a user