/** * 可领取任务管理模块 JavaScript * 提供可领取任务的查看和领取功能 */ (function() { 'use strict'; // 引用全局的翻译函数 // 翻译函数由 i18n-helper.js 提供 // 模块私有状态 let listPaginator = null; let container = null; // 可领取任务管理模块 const UserAvailableTasks = { init: function(containerElement) { container = containerElement; this.initPaginators(); this.initEventListeners(); this.loadAvailableTasks(); }, initPaginators: function() { // 初始化可领取任务列表分页器 listPaginator = createPaginator('availableTasks', { initialPage: 1, initialPageSize: 20, onPageChange: (page, pageSize) => { this.loadAvailableTasks(); }, onPageSizeChange: (pageSize) => { this.loadAvailableTasks(); } }); }, initEventListeners: function() { // 刷新列表 const refreshBtn = container.querySelector('#refreshAvailableTasksBtn'); if (refreshBtn) { refreshBtn.addEventListener('click', () => { this.loadAvailableTasks(); }); } }, loadAvailableTasks: async function() { if (!listPaginator) return; const tbody = container.querySelector('#availableTasksTableBody'); if (!tbody) return; try { tbody.innerHTML = '加载中...'; const skip = listPaginator.getSkip(); const limit = listPaginator.getLimit(); const tasks = await apiGet(`/datasets/tasks/available?skip=${skip}&limit=${limit}`); const emptyState = container.querySelector('#availableTasksEmptyState'); const paginationContainer = container.querySelector('#availableTasksPaginationContainer'); if (tasks.length === 0) { tbody.innerHTML = ''; if (emptyState) emptyState.classList.remove('hidden'); if (paginationContainer) paginationContainer.classList.add('hidden'); return; } if (emptyState) emptyState.classList.add('hidden'); if (paginationContainer) paginationContainer.classList.remove('hidden'); tbody.innerHTML = tasks.map(task => { const categoryRequirement = task.category ? `${t('task.categoryRequirementPrefix')}${escapeHtml(task.category)}` : `${t('task.noCategoryRestriction')}`; const evaluationDimensions = task.evaluation_dimensions && task.evaluation_dimensions.length > 0 ? `
${task.evaluation_dimensions.map(dim => `${escapeHtml(dim.name)}` ).join('')}
` : '-'; const deadline = task.deadline ? this.formatDateTime(task.deadline) : '-'; const taskDescription = task.task_description ? `
${escapeHtml(task.task_description)}
` : '-'; const evaluationPurpose = task.evaluation_purpose ? `
${escapeHtml(task.evaluation_purpose)}
` : '-'; return ` ${escapeHtml(task.dataset_name)} ${taskDescription} ${categoryRequirement} ${task.target_annotation_count}${t('task.qaUnit')} ${escapeHtml(task.project_name || '-')} ${evaluationPurpose} ${deadline} ${evaluationDimensions}
`; }).join(''); // 更新分页信息(由于API可能不支持总数,这里使用简单的分页逻辑) // 如果返回的数量等于limit,假设还有更多数据 const hasMore = tasks.length === limit; listPaginator.setTotalCount((listPaginator.currentPage - 1) * limit + tasks.length + (hasMore ? 1 : 0)); listPaginator.render(); } catch (error) { console.error('Failed to load available tasks:', error); tbody.innerHTML = `${t('task.loadFailed') || '加载失败,请刷新重试'}`; showError((t('task.loadListFailed') || '加载可领取任务列表失败') + ': ' + (error.message || t('common.unknownError'))); } }, claimTask: async function(datasetId) { if (!confirm(t('task.claimConfirm'))) { return; } try { await apiPost(`/datasets/tasks/${datasetId}/claim`, {}); showSuccess(t('task.claimSuccess')); // 刷新列表 this.loadAvailableTasks(); } catch (error) { console.error('Failed to claim task:', error); const errorMessage = error.data?.detail || error.message || t('common.unknownError'); showError(t('task.claimFailed') + ': ' + errorMessage); } }, formatDateTime: function(dateTimeString) { if (!dateTimeString) return '-'; try { const date = new Date(dateTimeString); const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); const hours = String(date.getHours()).padStart(2, '0'); const minutes = String(date.getMinutes()).padStart(2, '0'); return `${year}-${month}-${day} ${hours}:${minutes}`; } catch (e) { return dateTimeString; } } }; // 导出到全局 window.UserAvailableTasks = UserAvailableTasks; })();