Let finished caption jobs be dismissed from the Queue panel.

This commit is contained in:
Towsty
2026-09-30 23:18:44 -05:00
parent 15ef891b26
commit 14dcd234f3
5 changed files with 98 additions and 15 deletions
+15 -1
View File
@@ -385,6 +385,7 @@
<div class="job-status" :data-state="card.state">
<span class="left"><span class="dot" aria-hidden="true" />{{ card.statusLabel }}</span>
<button v-if="card.cancelable" type="button" class="kebab" aria-label="Cancel job" @click.stop="cancel(card.job)">⋮</button>
<button v-else-if="card.dismissable" type="button" class="kebab" aria-label="Dismiss job" @click.stop="dismissFinishedCard(card)">×</button>
</div>
<div v-if="card.progress" class="job-progress" :data-indeterminate="card.progress.indeterminate ? 'true' : undefined">
<progress
@@ -820,6 +821,7 @@ const queueCards=computed(()=>{
const live=job.live
const text=live?.resultText || job.resultText || ''
const state=live?.status || job.status
const finished=['complete','done','error','cancelled','failed'].includes(String(state))
cards.push({
id:job.id,
job,
@@ -829,7 +831,8 @@ const queueCards=computed(()=>{
state,
statusLabel:live?.message || state,
resultText:text,
cancelable:!['complete','done','error','cancelled'].includes(job.status) && !['complete','error','cancelled'].includes(String(state))
cancelable:!finished,
dismissable:finished
})
}
for(const job of upscales.value.filter((j:any)=>j.folderId===form.folderId && ['queued','running'].includes(j.status))){
@@ -1410,6 +1413,14 @@ function restore(item:any){Object.assign(form,restoreAll(form,item,xaigen,loraMe
function focusJob(job:any){selectOutput(job.outputs?.at(-1)||null);focusedJobId.value=job.id}
async function loadLoras(fresh=false){try{loraNames.value=await $fetch('/api/studio-2/loras'+(fresh?'?fresh=1':''))}catch{error.value='Could not refresh LoRAs. The last loaded list is still available.'}}
async function clearFinished(){await $fetch('/api/studio-2/clear-finished',{method:'POST'});await refreshJobs()}
async function dismissFinishedCard(card:any){
const id=card?.job?.id || card?.id
if(!id) return
try{
await $fetch('/api/studio-2/clear-finished',{method:'POST',body:{id}})
await refreshJobs()
}catch(e:any){error.value=e.data?.statusMessage||e.message||'Could not dismiss job'}
}
async function refreshJobs(){
const [nextJobs,nextUpscales,queue]=await Promise.all([
$fetch<any[]>('/api/studio-2/jobs'),
@@ -1779,6 +1790,9 @@ const mobileCtx=computed(()=>({
cancel,
focusQueueCard,
clearFinished,
dismissFinishedCard,
copyCaption,
useCaptionAsPrompt,
removeNegative,
addNegative,
addPhoto,
+6
View File
@@ -335,6 +335,12 @@
<div class="m-job-status">
<span>● {{ card.statusLabel }}</span>
<button v-if="card.cancelable" type="button" @click.stop="ctx.cancel(card.job)">Cancel</button>
<button v-else-if="card.dismissable" type="button" @click.stop="ctx.dismissFinishedCard(card)">Dismiss</button>
</div>
<p v-if="card.resultText" class="m-muted" style="white-space:pre-wrap">{{ card.resultText }}</p>
<div v-if="card.resultText" class="m-job-status">
<button type="button" @click.stop="ctx.copyCaption(card.resultText)">Copy</button>
<button type="button" @click.stop="ctx.useCaptionAsPrompt(card.resultText)">Use as prompt</button>
</div>
<div v-if="card.progress" class="m-job-progress" :data-indeterminate="card.progress.indeterminate ? 'true' : undefined">
<progress