@@ -899,6 +899,9 @@ function createTaskElement(task) {
899899 const channelText = channels . find ( c => c . value === task . channel ) ?. label || task . channel ;
900900 const scheduleLabel = task . is_recurring ? '📅 下一次执行时间' : '📅 计划时间' ;
901901
902+ // 定义删除按钮
903+ const deleteBtn = `<button class="btn btn-sm btn-ghost" style="color: #ef4444; border-color: rgba(239, 68, 68, 0.2);" onclick="deleteTask(${ task . id } )">🗑️ 删除</button>` ;
904+
902905 div . innerHTML = `
903906 <div class="task-header">
904907 <div>
@@ -924,12 +927,15 @@ function createTaskElement(task) {
924927 <button class="btn btn-sm btn-info" onclick="editTask(${ task . id } )">编辑</button>
925928 ${ task . is_recurring ? `<button class="btn btn-sm btn-warning" onclick="toggleTaskPause(${ task . id } , 'pause')">暂停</button>` : '' }
926929 <button class="btn btn-sm btn-danger" onclick="cancelTask(${ task . id } )">取消任务</button>
930+ ${ deleteBtn }
927931 ` : task . status === 'paused' ? `
928932 <button class="btn btn-sm btn-info" onclick="editTask(${ task . id } )">编辑</button>
929933 <button class="btn btn-sm btn-success" onclick="toggleTaskPause(${ task . id } , 'resume')">恢复</button>
930934 <button class="btn btn-sm btn-danger" onclick="cancelTask(${ task . id } )">取消任务</button>
935+ ${ deleteBtn }
931936 ` : `
932937 <button class="btn btn-sm btn-success" onclick="editTask(${ task . id } )">重新启用</button>
938+ ${ deleteBtn }
933939 ` }
934940 </div>
935941 ` ;
@@ -1097,23 +1103,26 @@ function showConfirmDialog({
10971103 } ) ;
10981104}
10991105
1100- // 取消任务
1106+ // 取消任务(软删除)
11011107async function cancelTask ( taskId ) {
11021108 const confirmed = await showConfirmDialog ( {
11031109 title : '取消任务' ,
1104- message : '确定要取消这个任务吗?此操作不可恢复 。' ,
1110+ message : '确定要取消这个任务吗?\n取消后任务将停止发送,但保留在列表中,可以重新启用 。' ,
11051111 confirmText : '确认取消' ,
11061112 cancelText : '保留任务'
11071113 } ) ;
11081114
11091115 if ( ! confirmed ) return ;
11101116
11111117 try {
1118+ // 使用 PUT 更新状态为 cancelled
11121119 const response = await fetch ( `${ API_BASE } /tasks/${ taskId } ` , {
1113- method : 'DELETE ' ,
1120+ method : 'PUT ' ,
11141121 headers : {
1122+ 'Content-Type' : 'application/json' ,
11151123 'Authorization' : `Bearer ${ localStorage . getItem ( 'token' ) } `
1116- }
1124+ } ,
1125+ body : JSON . stringify ( { status : 'cancelled' } )
11171126 } ) ;
11181127
11191128 const result = await response . json ( ) ;
@@ -1135,6 +1144,44 @@ async function cancelTask(taskId) {
11351144 }
11361145}
11371146
1147+ // 彻底删除任务(硬删除)
1148+ async function deleteTask ( taskId ) {
1149+ const confirmed = await showConfirmDialog ( {
1150+ title : '彻底删除任务' ,
1151+ message : '⚠️ 确定要彻底删除这个任务吗?\n此操作将永久移除任务记录,无法恢复!' ,
1152+ confirmText : '彻底删除' ,
1153+ cancelText : '取消'
1154+ } ) ;
1155+
1156+ if ( ! confirmed ) return ;
1157+
1158+ try {
1159+ const response = await fetch ( `${ API_BASE } /tasks/${ taskId } ` , {
1160+ method : 'DELETE' ,
1161+ headers : {
1162+ 'Authorization' : `Bearer ${ localStorage . getItem ( 'token' ) } `
1163+ }
1164+ } ) ;
1165+
1166+ const result = await response . json ( ) ;
1167+
1168+ if ( response . ok ) {
1169+ showNotification ( '任务已彻底删除' , 'success' ) ;
1170+ loadTasks ( ) ;
1171+
1172+ // 刷新日历
1173+ if ( typeof window . loadCalendar === 'function' ) {
1174+ delete window . __TASKS_CACHE ;
1175+ window . loadCalendar ( ) ;
1176+ }
1177+ } else {
1178+ showNotification ( '删除失败: ' + result . error , 'error' ) ;
1179+ }
1180+ } catch ( error ) {
1181+ showNotification ( '删除失败: ' + error . message , 'error' ) ;
1182+ }
1183+ }
1184+
11381185// 切换任务暂停/恢复状态
11391186async function toggleTaskPause ( taskId , action ) {
11401187 const isPause = action === 'pause' ;
0 commit comments