代码提交

This commit is contained in:
wong
2025-04-11 17:05:42 +08:00
parent 31cdc895e6
commit 568de908e2

View File

@@ -34,6 +34,7 @@ interface SyncTask {
createTime: string createTime: string
creator: string creator: string
libraries?: string[] libraries?: string[]
devices?: string[]
} }
export default function MomentsSyncPage() { export default function MomentsSyncPage() {
@@ -43,15 +44,19 @@ export default function MomentsSyncPage() {
const [searchQuery, setSearchQuery] = useState("") const [searchQuery, setSearchQuery] = useState("")
const [showDeleteAlert, setShowDeleteAlert] = useState(false) const [showDeleteAlert, setShowDeleteAlert] = useState(false)
const [taskToDelete, setTaskToDelete] = useState<string | null>(null) const [taskToDelete, setTaskToDelete] = useState<string | null>(null)
const [currentPage, setCurrentPage] = useState(1)
const [pageSize, setPageSize] = useState(10)
const [total, setTotal] = useState(0)
// 获取任务列表 // 获取任务列表
const fetchTasks = async () => { const fetchTasks = async () => {
const loadingToast = showToast("正在加载任务列表...", "loading", true); const loadingToast = showToast("正在加载任务列表...", "loading", true);
setIsLoading(true) setIsLoading(true)
try { try {
const response = await api.get<ApiResponse>('/v1/workbench/list?type=2') const response = await api.get<ApiResponse>(`/v1/workbench/list?type=2&page=${currentPage}&pageSize=${pageSize}`)
if (response.code === 200 && response.data) { if (response.code === 200 && response.data) {
setTasks(response.data.list || []) setTasks(response.data.list || [])
setTotal(response.data.total || 0)
} else { } else {
showToast(response.msg || "获取任务列表失败", "error") showToast(response.msg || "获取任务列表失败", "error")
} }
@@ -67,7 +72,18 @@ export default function MomentsSyncPage() {
// 组件加载时获取任务列表 // 组件加载时获取任务列表
useEffect(() => { useEffect(() => {
fetchTasks() fetchTasks()
}, []) }, [currentPage, pageSize])
// 处理页码变化
const handlePageChange = (page: number) => {
setCurrentPage(page)
}
// 处理每页条数变化
const handlePageSizeChange = (size: number) => {
setPageSize(size)
setCurrentPage(1) // 重置到第一页
}
// 搜索任务 // 搜索任务
const handleSearch = () => { const handleSearch = () => {
@@ -239,71 +255,110 @@ export default function MomentsSyncPage() {
</div> </div>
</div> </div>
) : ( ) : (
<div className="space-y-4"> <>
{filteredTasks.map((task) => ( <div className="space-y-4">
<Card key={task.id} className="p-4"> {filteredTasks.map((task) => (
<div className="flex items-center justify-between mb-4"> <Card key={task.id} className="p-4">
<div className="flex items-center space-x-2"> <div className="flex items-center justify-between mb-4">
<h3 className="font-medium">{task.name}</h3> <div className="flex items-center space-x-2">
<Badge variant={task.status === 1 ? "success" : "secondary"}> <h3 className="font-medium">{task.name}</h3>
{task.status === "running" ? "进行中" : "已暂停"} <Badge variant={task.status === "running" ? "success" : "secondary"}>
</Badge> {task.status === "running" ? "进行中" : "已暂停"}
</Badge>
</div>
<div className="flex items-center space-x-2">
<Switch
checked={task.status === "running"}
onCheckedChange={() => toggleTaskStatus(task.id, task.status)}
/>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="ghost" size="sm">
<MoreVertical className="h-4 w-4" />
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuItem onClick={() => handleView(task.id)}>
<Eye className="h-4 w-4 mr-2" />
</DropdownMenuItem>
<DropdownMenuItem onClick={() => handleEdit(task.id)}>
<Edit className="h-4 w-4 mr-2" />
</DropdownMenuItem>
<DropdownMenuItem onClick={() => handleCopy(task.id)}>
<Copy className="h-4 w-4 mr-2" />
</DropdownMenuItem>
<DropdownMenuItem onClick={() => confirmDelete(task.id)}>
<Trash2 className="h-4 w-4 mr-2" />
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</div>
</div> </div>
<div className="flex items-center space-x-2">
<Switch
checked={task.status === 1}
onCheckedChange={() => toggleTaskStatus(task.id, task.status)}
/>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="ghost" size="sm">
<MoreVertical className="h-4 w-4" />
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuItem onClick={() => handleView(task.id)}>
<Eye className="h-4 w-4 mr-2" />
</DropdownMenuItem>
<DropdownMenuItem onClick={() => handleEdit(task.id)}>
<Edit className="h-4 w-4 mr-2" />
</DropdownMenuItem>
<DropdownMenuItem onClick={() => handleCopy(task.id)}>
<Copy className="h-4 w-4 mr-2" />
</DropdownMenuItem>
<DropdownMenuItem onClick={() => confirmDelete(task.id)}>
<Trash2 className="h-4 w-4 mr-2" />
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</div>
</div>
<div className="grid grid-cols-2 gap-4 mb-4">
<div className="text-sm text-gray-500">
<div>{task.devices?.length || 0} </div>
<div>{task.contentLib}</div>
</div>
<div className="text-sm text-gray-500">
<div>{task.syncCount} </div>
<div>{task.creator}</div>
</div>
</div>
<div className="grid grid-cols-2 gap-4 mb-4"> <div className="flex items-center justify-between text-xs text-gray-500 border-t pt-4">
<div className="text-sm text-gray-500"> <div className="flex items-center">
<div>{task.deviceCount} </div> <Clock className="w-4 h-4 mr-1" />
<div>{task.contentLib}</div> {task.lastSyncTime}
</div>
<div>{task.createTime}</div>
</div> </div>
<div className="text-sm text-gray-500"> </Card>
<div>{task.syncCount} </div> ))}
<div>{task.creator}</div> </div>
</div>
</div>
<div className="flex items-center justify-between text-xs text-gray-500 border-t pt-4"> {/* 分页组件 */}
<div className="flex items-center"> <div className="flex justify-between items-center mt-4">
<Clock className="w-4 h-4 mr-1" /> <div className="flex items-center space-x-2">
{task.lastSyncTime} <span className="text-sm text-gray-500"></span>
</div> <select
<div>{task.createTime}</div> className="border rounded px-2 py-1 text-sm"
</div> value={pageSize}
</Card> onChange={(e) => handlePageSizeChange(Number(e.target.value))}
))} >
</div> <option value={10}>10</option>
<option value={20}>20</option>
<option value={50}>50</option>
</select>
<span className="text-sm text-gray-500"></span>
</div>
<div className="flex items-center space-x-2">
<Button
variant="outline"
size="sm"
onClick={() => handlePageChange(currentPage - 1)}
disabled={currentPage === 1}
>
</Button>
<span className="text-sm text-gray-500">
{currentPage} / {Math.ceil(total / pageSize)}
</span>
<Button
variant="outline"
size="sm"
onClick={() => handlePageChange(currentPage + 1)}
disabled={currentPage >= Math.ceil(total / pageSize)}
>
</Button>
</div>
</div>
</>
)} )}
</div> </div>