()
| 1898 | } |
| 1899 | |
| 1900 | async function loadRecentTasks() { |
| 1901 | if (!elements.recentRegistrationTasksTable) return; |
| 1902 | |
| 1903 | try { |
| 1904 | const data = await api.get('/registration/tasks?page=1&page_size=12'); |
| 1905 | const tasks = Array.isArray(data.tasks) ? data.tasks : []; |
| 1906 | |
| 1907 | if (!tasks.length) { |
| 1908 | elements.recentRegistrationTasksTable.innerHTML = ` |
| 1909 | <tr> |
| 1910 | <td colspan="4"> |
| 1911 | <div class="empty-state" style="padding: var(--spacing-md);"> |
| 1912 | <div class="empty-state-icon">🧾</div> |
| 1913 | <div class="empty-state-title">暂无注册任务</div> |
| 1914 | </div> |
| 1915 | </td> |
| 1916 | </tr> |
| 1917 | `; |
| 1918 | return; |
| 1919 | } |
| 1920 | |
| 1921 | elements.recentRegistrationTasksTable.innerHTML = tasks.map(task => { |
| 1922 | const status = getRegistrationTaskStatusMeta(task.status); |
| 1923 | const taskId = escapeHtml(String(task.task_uuid || '').slice(0, 8) || '-'); |
| 1924 | const serviceText = task.email_service_name |
| 1925 | ? escapeHtml(task.email_service_name) |
| 1926 | : (task.email_service_type ? escapeHtml(getServiceTypeText(task.email_service_type)) : (task.email_service_id ? `服务 #${task.email_service_id}` : '未绑定服务')); |
| 1927 | const summary = escapeHtml(buildRecentTaskSummary(task)); |
| 1928 | const recoveryBadge = task.recovered_on_startup |
| 1929 | ? '<span class="task-recovery-badge">启动回收</span>' |
| 1930 | : ''; |
| 1931 | return ` |
| 1932 | <tr class="${task.recovered_on_startup ? 'task-recovered-row' : ''}"> |
| 1933 | <td> |
| 1934 | <div style="font-weight: 600;">${taskId}</div> |
| 1935 | <div class="task-subtext">${serviceText}</div> |
| 1936 | </td> |
| 1937 | <td> |
| 1938 | <div class="task-status-stack"> |
| 1939 | <span class="status-badge ${status.className}">${escapeHtml(status.text)}</span> |
| 1940 | ${recoveryBadge} |
| 1941 | </div> |
| 1942 | </td> |
| 1943 | <td> |
| 1944 | <div>${summary}</div> |
| 1945 | ${task.recovered_on_startup ? `<div class="task-subtext">${escapeHtml(task.error_message || '')}</div>` : ''} |
| 1946 | </td> |
| 1947 | <td>${formatRecentTaskTime(task)}</td> |
| 1948 | </tr> |
| 1949 | `; |
| 1950 | }).join(''); |
| 1951 | } catch (error) { |
| 1952 | elements.recentRegistrationTasksTable.innerHTML = ` |
| 1953 | <tr> |
| 1954 | <td colspan="4"> |
| 1955 | <div class="empty-state" style="padding: var(--spacing-md);"> |
| 1956 | <div class="empty-state-title">加载失败:${escapeHtml(error.message)}</div> |
| 1957 | </div> |
no test coverage detected