330 lines
10 KiB
JavaScript
330 lines
10 KiB
JavaScript
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);
|
|
}
|
|
|
|
|