fix: add missing context menu to dashboard jobqueue (#794)
This commit is contained in:
parent
f0662b2e70
commit
6030a8b506
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<panel :icon="mdiTrayFull" :title="$t('JobQueue.JobQueue')" card-class="jobqueue-panel">
|
<panel ref="jobqueuePanel" :icon="mdiTrayFull" :title="$t('JobQueue.JobQueue')" card-class="jobqueue-panel">
|
||||||
<template #buttons>
|
<template #buttons>
|
||||||
<v-btn
|
<v-btn
|
||||||
v-if="queueState === 'paused'"
|
v-if="queueState === 'paused'"
|
||||||
@ -93,11 +93,8 @@
|
|||||||
</template>
|
</template>
|
||||||
</td>
|
</td>
|
||||||
<td class=" ">
|
<td class=" ">
|
||||||
{{ item.filename }}
|
<div class="d-block text-truncate" :style="styleContentTdWidth">{{ item.filename }}</div>
|
||||||
<template v-if="existMetadata(item)">
|
<small v-if="existMetadata(item)">{{ getDescription(item) }}</small>
|
||||||
<br />
|
|
||||||
<small>{{ getDescription(item) }}</small>
|
|
||||||
</template>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</template>
|
</template>
|
||||||
@ -106,8 +103,8 @@
|
|||||||
<v-menu v-model="contextMenu.shown" :position-x="contextMenu.x" :position-y="contextMenu.y" absolute offset-y>
|
<v-menu v-model="contextMenu.shown" :position-x="contextMenu.x" :position-y="contextMenu.y" absolute offset-y>
|
||||||
<v-list>
|
<v-list>
|
||||||
<v-list-item @click="deleteJob(contextMenu.item)">
|
<v-list-item @click="deleteJob(contextMenu.item)">
|
||||||
<v-icon class="mr-1">{{ mdiDelete }}</v-icon>
|
<v-icon class="mr-1">{{ mdiPlaylistRemove }}</v-icon>
|
||||||
{{ $t('JobQueue.Delete') }}
|
{{ $t('JobQueue.RemoveFromQueue') }}
|
||||||
</v-list-item>
|
</v-list-item>
|
||||||
</v-list>
|
</v-list>
|
||||||
</v-menu>
|
</v-menu>
|
||||||
@ -121,7 +118,7 @@ import { ServerHistoryStateJob } from '@/store/server/history/types'
|
|||||||
import { formatFilesize, formatPrintTime } from '@/plugins/helpers'
|
import { formatFilesize, formatPrintTime } from '@/plugins/helpers'
|
||||||
import Panel from '@/components/ui/Panel.vue'
|
import Panel from '@/components/ui/Panel.vue'
|
||||||
import { ServerJobQueueStateJob } from '@/store/server/jobQueue/types'
|
import { ServerJobQueueStateJob } from '@/store/server/jobQueue/types'
|
||||||
import { mdiPlay, mdiPause, mdiFile, mdiDelete, mdiTrayFull } from '@mdi/js'
|
import { mdiPlay, mdiPause, mdiFile, mdiPlaylistRemove, mdiTrayFull } from '@mdi/js'
|
||||||
@Component({
|
@Component({
|
||||||
components: { Panel },
|
components: { Panel },
|
||||||
})
|
})
|
||||||
@ -129,11 +126,12 @@ export default class JobqueuePanel extends Mixins(BaseMixin) {
|
|||||||
mdiPlay = mdiPlay
|
mdiPlay = mdiPlay
|
||||||
mdiPause = mdiPause
|
mdiPause = mdiPause
|
||||||
mdiFile = mdiFile
|
mdiFile = mdiFile
|
||||||
mdiDelete = mdiDelete
|
mdiPlaylistRemove = mdiPlaylistRemove
|
||||||
mdiTrayFull = mdiTrayFull
|
mdiTrayFull = mdiTrayFull
|
||||||
|
|
||||||
formatFilesize = formatFilesize
|
formatFilesize = formatFilesize
|
||||||
|
|
||||||
|
private contentTdWidth = 100
|
||||||
private contextMenu = {
|
private contextMenu = {
|
||||||
shown: false,
|
shown: false,
|
||||||
touchTimer: undefined,
|
touchTimer: undefined,
|
||||||
@ -142,6 +140,10 @@ export default class JobqueuePanel extends Mixins(BaseMixin) {
|
|||||||
item: {},
|
item: {},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
declare $refs: {
|
||||||
|
jobqueuePanel: any
|
||||||
|
}
|
||||||
|
|
||||||
get jobs() {
|
get jobs() {
|
||||||
return this.$store.getters['server/jobQueue/getJobs']
|
return this.$store.getters['server/jobQueue/getJobs']
|
||||||
}
|
}
|
||||||
@ -158,34 +160,8 @@ export default class JobqueuePanel extends Mixins(BaseMixin) {
|
|||||||
this.$store.dispatch('gui/saveSetting', { name: 'view.jobqueue.countPerPage', value: newVal })
|
this.$store.dispatch('gui/saveSetting', { name: 'view.jobqueue.countPerPage', value: newVal })
|
||||||
}
|
}
|
||||||
|
|
||||||
refreshHistory() {
|
get styleContentTdWidth() {
|
||||||
this.$socket.emit('server.history.list', { start: 0, limit: 50 }, { action: 'server/history/getHistory' })
|
return `width: ${this.contentTdWidth}px;`
|
||||||
}
|
|
||||||
|
|
||||||
formatPrintTime(totalSeconds: number) {
|
|
||||||
if (totalSeconds) {
|
|
||||||
let output = ''
|
|
||||||
|
|
||||||
const days = Math.floor(totalSeconds / (3600 * 24))
|
|
||||||
if (days) {
|
|
||||||
totalSeconds %= 3600 * 24
|
|
||||||
output += days + 'd'
|
|
||||||
}
|
|
||||||
|
|
||||||
const hours = Math.floor(totalSeconds / 3600)
|
|
||||||
totalSeconds %= 3600
|
|
||||||
if (hours) output += ' ' + hours + 'h'
|
|
||||||
|
|
||||||
const minutes = Math.floor(totalSeconds / 60)
|
|
||||||
if (minutes) output += ' ' + minutes + 'm'
|
|
||||||
|
|
||||||
const seconds = totalSeconds % 60
|
|
||||||
if (seconds) output += ' ' + seconds.toFixed(0) + 's'
|
|
||||||
|
|
||||||
return output
|
|
||||||
}
|
|
||||||
|
|
||||||
return '--'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
showContextMenu(e: any, item: ServerHistoryStateJob) {
|
showContextMenu(e: any, item: ServerHistoryStateJob) {
|
||||||
@ -241,5 +217,18 @@ export default class JobqueuePanel extends Mixins(BaseMixin) {
|
|||||||
existMetadata(item: ServerJobQueueStateJob) {
|
existMetadata(item: ServerJobQueueStateJob) {
|
||||||
return item?.metadata?.metadataPulled
|
return item?.metadata?.metadataPulled
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
window.addEventListener('resize', this.eventListenerResize)
|
||||||
|
this.eventListenerResize()
|
||||||
|
}
|
||||||
|
|
||||||
|
destroyed() {
|
||||||
|
window.removeEventListener('resize', this.eventListenerResize)
|
||||||
|
}
|
||||||
|
|
||||||
|
eventListenerResize() {
|
||||||
|
this.contentTdWidth = this.$refs.jobqueuePanel?.$el?.clientWidth - 48 - 32
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<style lang="scss" scoped></style>
|
<style lang="scss" scoped></style>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<v-card flat>
|
<v-card ref="filesJobqueue" flat>
|
||||||
<v-data-table
|
<v-data-table
|
||||||
:items="jobsTable"
|
:items="jobsTable"
|
||||||
hide-default-footer
|
hide-default-footer
|
||||||
@ -14,7 +14,11 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template #item="{ item }">
|
<template #item="{ item }">
|
||||||
<tr :key="item.job_id">
|
<tr
|
||||||
|
:key="item.job_id"
|
||||||
|
v-longpress:600="(e) => showContextMenu(e, item)"
|
||||||
|
class="cursor-pointer"
|
||||||
|
@contextmenu="showContextMenu($event, item)">
|
||||||
<td class="pr-0 text-center" style="width: 32px">
|
<td class="pr-0 text-center" style="width: 32px">
|
||||||
<template v-if="getSmallThumbnail(item) && getBigThumbnail(item)">
|
<template v-if="getSmallThumbnail(item) && getBigThumbnail(item)">
|
||||||
<v-tooltip
|
<v-tooltip
|
||||||
@ -60,11 +64,8 @@
|
|||||||
<v-icon>{{ mdiPlay }}</v-icon>
|
<v-icon>{{ mdiPlay }}</v-icon>
|
||||||
</v-btn>
|
</v-btn>
|
||||||
</template>
|
</template>
|
||||||
{{ item.filename }}
|
<div class="d-block text-truncate" :style="styleContentTdWidth">{{ item.filename }}</div>
|
||||||
<template v-if="existMetadata(item)">
|
<small v-if="existMetadata(item)">{{ getDescription(item) }}</small>
|
||||||
<br />
|
|
||||||
<small>{{ getDescription(item) }}</small>
|
|
||||||
</template>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</template>
|
</template>
|
||||||
@ -85,6 +86,14 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</template>
|
</template>
|
||||||
</v-data-table>
|
</v-data-table>
|
||||||
|
<v-menu v-model="contextMenu.shown" :position-x="contextMenu.x" :position-y="contextMenu.y" absolute offset-y>
|
||||||
|
<v-list>
|
||||||
|
<v-list-item @click="removeFromJobqueue(contextMenu.item)">
|
||||||
|
<v-icon class="mr-1">{{ mdiPlaylistRemove }}</v-icon>
|
||||||
|
{{ $t('JobQueue.RemoveFromQueue') }}
|
||||||
|
</v-list-item>
|
||||||
|
</v-list>
|
||||||
|
</v-menu>
|
||||||
</v-card>
|
</v-card>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -93,7 +102,7 @@ import Component from 'vue-class-component'
|
|||||||
import { Mixins } from 'vue-property-decorator'
|
import { Mixins } from 'vue-property-decorator'
|
||||||
import BaseMixin from '@/components/mixins/base'
|
import BaseMixin from '@/components/mixins/base'
|
||||||
import { ServerJobQueueStateJob } from '@/store/server/jobQueue/types'
|
import { ServerJobQueueStateJob } from '@/store/server/jobQueue/types'
|
||||||
import { mdiFile, mdiPlay, mdiFileMultiple } from '@mdi/js'
|
import { mdiFile, mdiPlay, mdiFileMultiple, mdiPlaylistRemove } from '@mdi/js'
|
||||||
@Component({
|
@Component({
|
||||||
components: {},
|
components: {},
|
||||||
})
|
})
|
||||||
@ -101,6 +110,20 @@ export default class StatusPanelJobqueue extends Mixins(BaseMixin) {
|
|||||||
mdiFile = mdiFile
|
mdiFile = mdiFile
|
||||||
mdiPlay = mdiPlay
|
mdiPlay = mdiPlay
|
||||||
mdiFileMultiple = mdiFileMultiple
|
mdiFileMultiple = mdiFileMultiple
|
||||||
|
mdiPlaylistRemove = mdiPlaylistRemove
|
||||||
|
|
||||||
|
private contentTdWidth = 100
|
||||||
|
private contextMenu = {
|
||||||
|
shown: false,
|
||||||
|
touchTimer: undefined,
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
item: {},
|
||||||
|
}
|
||||||
|
|
||||||
|
declare $refs: {
|
||||||
|
filesJobqueue: any
|
||||||
|
}
|
||||||
|
|
||||||
get jobs() {
|
get jobs() {
|
||||||
return this.$store.getters['server/jobQueue/getJobs'] ?? []
|
return this.$store.getters['server/jobQueue/getJobs'] ?? []
|
||||||
@ -141,6 +164,10 @@ export default class StatusPanelJobqueue extends Mixins(BaseMixin) {
|
|||||||
return output
|
return output
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get styleContentTdWidth() {
|
||||||
|
return `width: ${this.contentTdWidth}px;`
|
||||||
|
}
|
||||||
|
|
||||||
getSmallThumbnail(item: ServerJobQueueStateJob) {
|
getSmallThumbnail(item: ServerJobQueueStateJob) {
|
||||||
return this.$store.getters['server/jobQueue/getSmallThumbnail'](item)
|
return this.$store.getters['server/jobQueue/getSmallThumbnail'](item)
|
||||||
}
|
}
|
||||||
@ -206,8 +233,38 @@ export default class StatusPanelJobqueue extends Mixins(BaseMixin) {
|
|||||||
return '--'
|
return '--'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
showContextMenu(e: any, item: ServerJobQueueStateJob) {
|
||||||
|
if (!this.contextMenu.shown) {
|
||||||
|
e?.preventDefault()
|
||||||
|
this.contextMenu.shown = true
|
||||||
|
this.contextMenu.x = e?.clientX || e?.pageX || window.screenX / 2
|
||||||
|
this.contextMenu.y = e?.clientY || e?.pageY || window.screenY / 2
|
||||||
|
this.contextMenu.item = item
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.contextMenu.shown = true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
startJobqueue() {
|
startJobqueue() {
|
||||||
this.$store.dispatch('server/jobQueue/start')
|
this.$store.dispatch('server/jobQueue/start')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
removeFromJobqueue(item: ServerJobQueueStateJob) {
|
||||||
|
this.$store.dispatch('server/jobQueue/deleteFromQueue', [item.job_id])
|
||||||
|
}
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
window.addEventListener('resize', this.eventListenerResize)
|
||||||
|
this.eventListenerResize()
|
||||||
|
}
|
||||||
|
|
||||||
|
destroyed() {
|
||||||
|
window.removeEventListener('resize', this.eventListenerResize)
|
||||||
|
}
|
||||||
|
|
||||||
|
eventListenerResize() {
|
||||||
|
this.contentTdWidth = this.$refs.filesJobqueue?.$el?.clientWidth - 48 - 48 - 32
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
@ -335,11 +335,11 @@
|
|||||||
},
|
},
|
||||||
"JobQueue": {
|
"JobQueue": {
|
||||||
"AllJobs": "Alle Aufträge",
|
"AllJobs": "Alle Aufträge",
|
||||||
"Delete": "Löschen",
|
|
||||||
"Empty": "Leer",
|
"Empty": "Leer",
|
||||||
"JobQueue": "Auftragswarteschlange",
|
"JobQueue": "Auftragswarteschlange",
|
||||||
"Jobs": "Aufträge",
|
"Jobs": "Aufträge",
|
||||||
"Pause": "Pause",
|
"Pause": "Pause",
|
||||||
|
"RemoveFromQueue": "Von Auftragswarteschlange entfernen",
|
||||||
"Start": "Start"
|
"Start": "Start"
|
||||||
},
|
},
|
||||||
"Machine": {
|
"Machine": {
|
||||||
|
@ -350,11 +350,11 @@
|
|||||||
},
|
},
|
||||||
"JobQueue": {
|
"JobQueue": {
|
||||||
"AllJobs": "All Jobs",
|
"AllJobs": "All Jobs",
|
||||||
"Delete": "Delete",
|
|
||||||
"Empty": "Empty",
|
"Empty": "Empty",
|
||||||
"JobQueue": "Job Queue",
|
"JobQueue": "Job Queue",
|
||||||
"Jobs": "Jobs",
|
"Jobs": "Jobs",
|
||||||
"Pause": "Pause",
|
"Pause": "Pause",
|
||||||
|
"RemoveFromQueue": "Remove from Queue",
|
||||||
"Start": "Start"
|
"Start": "Start"
|
||||||
},
|
},
|
||||||
"Machine": {
|
"Machine": {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user