init
This commit is contained in:
329
static/js/task_list.js
Normal file
329
static/js/task_list.js
Normal file
@@ -0,0 +1,329 @@
|
||||
let currentPage = 1;
|
||||
let claimModal, completeModal, detailModal;
|
||||
|
||||
$(document).ready(function() {
|
||||
// 初始化模态框
|
||||
claimModal = new bootstrap.Modal(document.getElementById('claimModal'));
|
||||
completeModal = new bootstrap.Modal(document.getElementById('completeModal'));
|
||||
detailModal = new bootstrap.Modal(document.getElementById('detailModal'));
|
||||
|
||||
// 加载任务列表
|
||||
loadTasks();
|
||||
});
|
||||
|
||||
// 加载任务列表
|
||||
function loadTasks(page = 1) {
|
||||
const status = $('#filter-status').val();
|
||||
const scope = $('#filter-scope').val();
|
||||
|
||||
let params = {
|
||||
page: page,
|
||||
per_page: 20
|
||||
};
|
||||
|
||||
if (status) {
|
||||
params.status = status;
|
||||
}
|
||||
|
||||
if (scope === 'my') {
|
||||
const user = JSON.parse(localStorage.getItem('current_user'));
|
||||
params.user_id = user.id;
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
url: '/api/groups/1/tasks',
|
||||
method: 'GET',
|
||||
data: params,
|
||||
success: function(response) {
|
||||
renderTasks(response.tasks);
|
||||
renderPagination(response.page, response.pages);
|
||||
currentPage = page;
|
||||
},
|
||||
error: handleAjaxError
|
||||
});
|
||||
}
|
||||
|
||||
// 渲染任务列表
|
||||
function renderTasks(tasks) {
|
||||
const tbody = $('#task-list');
|
||||
tbody.empty();
|
||||
|
||||
if (tasks.length === 0) {
|
||||
tbody.append('<tr><td colspan="9" class="text-center">暂无数据</td></tr>');
|
||||
return;
|
||||
}
|
||||
|
||||
const currentUser = JSON.parse(localStorage.getItem('current_user'));
|
||||
|
||||
tasks.forEach(function(task) {
|
||||
const priorityClass = getPriorityClass(task.priority);
|
||||
|
||||
let actions = '';
|
||||
|
||||
// 待认领状态 - 所有人可认领
|
||||
if (task.status === 'pending') {
|
||||
actions = `<button class="btn btn-sm btn-primary" onclick="openClaimModal(${task.id})">
|
||||
<i class="bi bi-hand-thumbs-up"></i> 认领
|
||||
</button>`;
|
||||
}
|
||||
|
||||
// 已认领状态 - 认领人可完成或取消
|
||||
if (task.status === 'claimed' && task.claimed_by_id === currentUser.id) {
|
||||
actions = `
|
||||
<button class="btn btn-sm btn-success" onclick="openCompleteModal(${task.id})">
|
||||
<i class="bi bi-check-circle"></i> 完成
|
||||
</button>
|
||||
<button class="btn btn-sm btn-warning" onclick="cancelClaim(${task.id})">
|
||||
<i class="bi bi-x-circle"></i> 取消
|
||||
</button>
|
||||
`;
|
||||
}
|
||||
|
||||
// 查看详情按钮
|
||||
actions += ` <button class="btn btn-sm btn-info" onclick="viewDetail(${task.id})">
|
||||
<i class="bi bi-eye"></i> 详情
|
||||
</button>`;
|
||||
|
||||
// 管理员可删除
|
||||
if (currentUser.role === 'admin') {
|
||||
actions += ` <button class="btn btn-sm btn-danger" onclick="deleteTask(${task.id})">
|
||||
<i class="bi bi-trash"></i> 删除
|
||||
</button>`;
|
||||
}
|
||||
|
||||
const row = `
|
||||
<tr>
|
||||
<td>${task.id}</td>
|
||||
<td>
|
||||
${task.series_link ?
|
||||
`<a href="${task.series_link}" target="_blank">${task.series_name}</a>` :
|
||||
task.series_name
|
||||
}
|
||||
</td>
|
||||
<td>${formatDate(task.series_date)}</td>
|
||||
<td><span class="${priorityClass}">${task.priority || '-'}</span></td>
|
||||
<td>${getStatusBadge(task.status)}</td>
|
||||
<td>${task.claimed_by || '-'}</td>
|
||||
<td>${task.torrent_id || '-'}</td>
|
||||
<td>${formatDateTime(task.created_at)}</td>
|
||||
<td>${actions}</td>
|
||||
</tr>
|
||||
`;
|
||||
|
||||
tbody.append(row);
|
||||
});
|
||||
}
|
||||
|
||||
// 渲染分页
|
||||
function renderPagination(current, total) {
|
||||
const pagination = $('#pagination');
|
||||
pagination.empty();
|
||||
|
||||
if (total <= 1) return;
|
||||
|
||||
// 上一页
|
||||
pagination.append(`
|
||||
<li class="page-item ${current === 1 ? 'disabled' : ''}">
|
||||
<a class="page-link" href="#" onclick="loadTasks(${current - 1}); return false;">上一页</a>
|
||||
</li>
|
||||
`);
|
||||
|
||||
// 页码
|
||||
for (let i = 1; i <= total; i++) {
|
||||
if (i === 1 || i === total || (i >= current - 2 && i <= current + 2)) {
|
||||
pagination.append(`
|
||||
<li class="page-item ${i === current ? 'active' : ''}">
|
||||
<a class="page-link" href="#" onclick="loadTasks(${i}); return false;">${i}</a>
|
||||
</li>
|
||||
`);
|
||||
} else if (i === current - 3 || i === current + 3) {
|
||||
pagination.append('<li class="page-item disabled"><span class="page-link">...</span></li>');
|
||||
}
|
||||
}
|
||||
|
||||
// 下一页
|
||||
pagination.append(`
|
||||
<li class="page-item ${current === total ? 'disabled' : ''}">
|
||||
<a class="page-link" href="#" onclick="loadTasks(${current + 1}); return false;">下一页</a>
|
||||
</li>
|
||||
`);
|
||||
}
|
||||
|
||||
// 打开认领模态框
|
||||
function openClaimModal(taskId) {
|
||||
$('#claim-task-id').val(taskId);
|
||||
$('#claim-note').val('');
|
||||
claimModal.show();
|
||||
}
|
||||
|
||||
// 提交认领
|
||||
function submitClaim() {
|
||||
const taskId = $('#claim-task-id').val();
|
||||
const note = $('#claim-note').val();
|
||||
|
||||
$.ajax({
|
||||
url: `/api/tasks/${taskId}/claim`,
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
data: JSON.stringify({
|
||||
claim_note: note
|
||||
}),
|
||||
success: function() {
|
||||
claimModal.hide();
|
||||
showSuccess('认领成功!');
|
||||
loadTasks(currentPage);
|
||||
},
|
||||
error: handleAjaxError
|
||||
});
|
||||
}
|
||||
|
||||
// 打开完成模态框
|
||||
function openCompleteModal(taskId) {
|
||||
$('#complete-task-id').val(taskId);
|
||||
$('#torrent-id').val('');
|
||||
$('#complete-note').val('');
|
||||
completeModal.show();
|
||||
}
|
||||
|
||||
// 提交完成
|
||||
function submitComplete() {
|
||||
const taskId = $('#complete-task-id').val();
|
||||
const torrentId = $('#torrent-id').val();
|
||||
const note = $('#complete-note').val();
|
||||
|
||||
if (!torrentId) {
|
||||
alert('请填写种子ID');
|
||||
return;
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
url: `/api/tasks/${taskId}/complete`,
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
data: JSON.stringify({
|
||||
torrent_id: torrentId,
|
||||
complete_note: note
|
||||
}),
|
||||
success: function() {
|
||||
completeModal.hide();
|
||||
showSuccess('任务完成!');
|
||||
loadTasks(currentPage);
|
||||
},
|
||||
error: handleAjaxError
|
||||
});
|
||||
}
|
||||
|
||||
// 取消认领
|
||||
function cancelClaim(taskId) {
|
||||
if (!confirm('确定要取消认领吗?')) {
|
||||
return;
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
url: `/api/tasks/${taskId}/cancel-claim`,
|
||||
method: 'POST',
|
||||
success: function() {
|
||||
showSuccess('已取消认领');
|
||||
loadTasks(currentPage);
|
||||
},
|
||||
error: handleAjaxError
|
||||
});
|
||||
}
|
||||
|
||||
// 查看详情
|
||||
function viewDetail(taskId) {
|
||||
$.ajax({
|
||||
url: `/api/tasks/${taskId}`,
|
||||
method: 'GET',
|
||||
success: function(task) {
|
||||
const html = `
|
||||
<dl class="row">
|
||||
<dt class="col-sm-3">任务ID</dt>
|
||||
<dd class="col-sm-9">${task.id}</dd>
|
||||
|
||||
<dt class="col-sm-3">剧集名称</dt>
|
||||
<dd class="col-sm-9">${task.series_name}</dd>
|
||||
|
||||
<dt class="col-sm-3">剧集链接</dt>
|
||||
<dd class="col-sm-9">
|
||||
${task.series_link ?
|
||||
`<a href="${task.series_link}" target="_blank">${task.series_link}</a>` :
|
||||
'-'
|
||||
}
|
||||
</dd>
|
||||
|
||||
<dt class="col-sm-3">更新日期</dt>
|
||||
<dd class="col-sm-9">${formatDate(task.series_date)}</dd>
|
||||
|
||||
<dt class="col-sm-3">优先级</dt>
|
||||
<dd class="col-sm-9"><span class="${getPriorityClass(task.priority)}">${task.priority || '-'}</span></dd>
|
||||
|
||||
<dt class="col-sm-3">状态</dt>
|
||||
<dd class="col-sm-9">${getStatusBadge(task.status)}</dd>
|
||||
|
||||
<dt class="col-sm-3">创建人</dt>
|
||||
<dd class="col-sm-9">${task.creator}</dd>
|
||||
|
||||
<dt class="col-sm-3">创建时间</dt>
|
||||
<dd class="col-sm-9">${formatDateTime(task.created_at)}</dd>
|
||||
|
||||
${task.claimed_by ? `
|
||||
<dt class="col-sm-3">认领人</dt>
|
||||
<dd class="col-sm-9">${task.claimed_by}</dd>
|
||||
|
||||
<dt class="col-sm-3">认领时间</dt>
|
||||
<dd class="col-sm-9">${formatDateTime(task.claimed_at)}</dd>
|
||||
|
||||
<dt class="col-sm-3">认领备注</dt>
|
||||
<dd class="col-sm-9">${task.claim_note || '-'}</dd>
|
||||
` : ''}
|
||||
|
||||
${task.torrent_id ? `
|
||||
<dt class="col-sm-3">种子ID</dt>
|
||||
<dd class="col-sm-9">${task.torrent_id}</dd>
|
||||
|
||||
<dt class="col-sm-3">完成时间</dt>
|
||||
<dd class="col-sm-9">${formatDateTime(task.completed_at)}</dd>
|
||||
|
||||
<dt class="col-sm-3">完成备注</dt>
|
||||
<dd class="col-sm-9">${task.complete_note || '-'}</dd>
|
||||
` : ''}
|
||||
</dl>
|
||||
`;
|
||||
|
||||
$('#task-detail').html(html);
|
||||
detailModal.show();
|
||||
},
|
||||
error: handleAjaxError
|
||||
});
|
||||
}
|
||||
|
||||
// 删除任务
|
||||
function deleteTask(taskId) {
|
||||
if (!confirm('确定要删除这个任务吗?此操作不可恢复!')) {
|
||||
return;
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
url: `/api/tasks/${taskId}`,
|
||||
method: 'DELETE',
|
||||
success: function() {
|
||||
showSuccess('任务已删除');
|
||||
loadTasks(currentPage);
|
||||
},
|
||||
error: handleAjaxError
|
||||
});
|
||||
}
|
||||
|
||||
// 重置筛选器
|
||||
function resetFilters() {
|
||||
$('#filter-status').val('');
|
||||
$('#filter-scope').val('all');
|
||||
loadTasks(1);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user