同步处理
This commit is contained in:
1 parent
9939943e31
commit
6494ad2918
26 files changed
+970
-40
No files matched your search
@@ -8,6 +8,7 @@ defineProps<{
|
||||
totalPages: number
|
||||
total: number
|
||||
pageSize: number
|
||||
showHidden: boolean
|
||||
loading?: boolean
|
||||
}>()
|
||||
|
||||
@@ -15,6 +16,9 @@ const emit = defineEmits<{
|
||||
'retry': [jobId: string]
|
||||
'download': [jobId: string]
|
||||
'cancel': [jobId: string]
|
||||
'hide': [jobId: string, hidden: boolean]
|
||||
'hideAll': [hidden: boolean]
|
||||
'toggleHidden': []
|
||||
'view': [job: BackupJobItem]
|
||||
'update:page': [page: number]
|
||||
'update:pageSize': [pageSize: number]
|
||||
@@ -85,6 +89,10 @@ function canView(job: BackupJobItem): boolean {
|
||||
return job.type === 'full_restore' && job.status === 'done' && Boolean(job.message)
|
||||
}
|
||||
|
||||
function canHide(job: BackupJobItem): boolean {
|
||||
return job.status === 'done' || job.status === 'failed' || job.hidden
|
||||
}
|
||||
|
||||
function formatTime(value: string) {
|
||||
if (!value) return '—'
|
||||
return new Date(value).toLocaleString(locale.value, { hour12: false })
|
||||
@@ -102,11 +110,33 @@ function formatTime(value: string) {
|
||||
{{ t('storage.backup.jobsSubtitle') }}
|
||||
</p>
|
||||
</div>
|
||||
<UIcon
|
||||
v-if="polling"
|
||||
name="i-lucide-loader-circle"
|
||||
class="size-4 shrink-0 animate-spin text-muted"
|
||||
/>
|
||||
<div class="flex shrink-0 items-center gap-2">
|
||||
<UIcon
|
||||
v-if="polling"
|
||||
name="i-lucide-loader-circle"
|
||||
class="size-4 animate-spin text-muted"
|
||||
/>
|
||||
<UButton
|
||||
size="xs"
|
||||
variant="ghost"
|
||||
color="neutral"
|
||||
:icon="showHidden ? 'i-lucide-eye-off' : 'i-lucide-eye'"
|
||||
:label="showHidden
|
||||
? t('storage.backup.hiddenJobsHide')
|
||||
: t('storage.backup.hiddenJobsShow')"
|
||||
@click="emit('toggleHidden')"
|
||||
/>
|
||||
<UButton
|
||||
size="xs"
|
||||
variant="outline"
|
||||
color="neutral"
|
||||
:icon="showHidden ? 'i-lucide-rotate-ccw' : 'i-lucide-x'"
|
||||
:label="showHidden
|
||||
? t('storage.backup.jobsRestoreAll')
|
||||
: t('storage.backup.jobsHideAll')"
|
||||
@click="emit('hideAll', !showHidden)"
|
||||
/>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div
|
||||
@@ -243,6 +273,17 @@ function formatTime(value: string) {
|
||||
color="neutral"
|
||||
@click="emit('retry', job.id)"
|
||||
/>
|
||||
<UButton
|
||||
v-if="canHide(job)"
|
||||
size="xs"
|
||||
variant="outline"
|
||||
:color="job.hidden ? 'neutral' : 'error'"
|
||||
:icon="job.hidden ? 'i-lucide-eye' : 'i-lucide-x'"
|
||||
:title="job.hidden
|
||||
? t('storage.backup.jobUnhide')
|
||||
: t('storage.backup.jobHide')"
|
||||
@click="emit('hide', job.id, !job.hidden)"
|
||||
/>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -19,6 +19,7 @@ const {
|
||||
jobsTotal,
|
||||
jobsTotalPages,
|
||||
jobsLoading,
|
||||
showHiddenJobs,
|
||||
estimate,
|
||||
packages,
|
||||
loadingEstimate,
|
||||
@@ -26,6 +27,9 @@ const {
|
||||
hasActiveJob,
|
||||
getActiveJob,
|
||||
loadJobs,
|
||||
toggleShowHiddenJobs,
|
||||
hideJob,
|
||||
hideAllJobs,
|
||||
setJobsPage,
|
||||
setJobsPageSize,
|
||||
loadEstimate,
|
||||
@@ -98,6 +102,14 @@ async function onCancel(jobId: string) {
|
||||
await cancelJob(jobId)
|
||||
}
|
||||
|
||||
async function onHideJob(jobId: string, hidden: boolean) {
|
||||
await hideJob(jobId, hidden)
|
||||
}
|
||||
|
||||
async function onHideAll(hidden: boolean) {
|
||||
await hideAllJobs(hidden)
|
||||
}
|
||||
|
||||
async function onSync(body: {
|
||||
fromBackendId: string
|
||||
toBackendId: string
|
||||
@@ -192,11 +204,15 @@ function onViewJob(job: BackupJobItem) {
|
||||
:total="jobsTotal"
|
||||
:page-size="jobsPageSize"
|
||||
:loading="jobsLoading"
|
||||
:show-hidden="showHiddenJobs"
|
||||
@update:page="setJobsPage"
|
||||
@update:page-size="setJobsPageSize"
|
||||
@download="onDownload"
|
||||
@retry="onRetry"
|
||||
@cancel="onCancel"
|
||||
@hide="onHideJob"
|
||||
@hide-all="onHideAll"
|
||||
@toggle-hidden="toggleShowHiddenJobs"
|
||||
@view="onViewJob"
|
||||
/>
|
||||
</section>
|
||||
|
||||
@@ -13,6 +13,7 @@ const jobsPageSize = ref(10)
|
||||
const jobsTotal = ref(0)
|
||||
const jobsTotalPages = ref(1)
|
||||
const jobsLoading = ref(false)
|
||||
const showHiddenJobs = ref(false)
|
||||
const activeJobState = ref<BackupJobItem | null>(null)
|
||||
const estimate = ref<BackupEstimate | null>(null)
|
||||
const packages = ref<BackupPackageItem[]>([])
|
||||
@@ -69,7 +70,8 @@ export function useBackup() {
|
||||
credentials: 'include',
|
||||
query: {
|
||||
pageNum: jobsPage.value,
|
||||
pageSize: jobsPageSize.value
|
||||
pageSize: jobsPageSize.value,
|
||||
includeHidden: showHiddenJobs.value
|
||||
}
|
||||
})
|
||||
jobs.value = data.jobs
|
||||
@@ -104,6 +106,58 @@ export function useBackup() {
|
||||
return loadJobs()
|
||||
}
|
||||
|
||||
async function toggleShowHiddenJobs() {
|
||||
showHiddenJobs.value = !showHiddenJobs.value
|
||||
jobsPage.value = 1
|
||||
await loadJobs()
|
||||
}
|
||||
|
||||
async function hideJob(jobId: string, hidden = true) {
|
||||
try {
|
||||
await $fetch('/api/admin/backup/jobs/hide', {
|
||||
method: 'POST',
|
||||
credentials: 'include',
|
||||
body: { jobId, hidden }
|
||||
})
|
||||
if (hidden) {
|
||||
showHiddenJobs.value = false
|
||||
jobsPage.value = 1
|
||||
}
|
||||
await loadJobs()
|
||||
toast.add({
|
||||
title: hidden
|
||||
? t('storage.backup.jobHidden')
|
||||
: t('storage.backup.jobUnhidden'),
|
||||
color: 'success'
|
||||
})
|
||||
} catch (error: unknown) {
|
||||
handleError(error, t('storage.backup.hideFailed'))
|
||||
}
|
||||
}
|
||||
|
||||
async function hideAllJobs(hidden = true) {
|
||||
try {
|
||||
await $fetch('/api/admin/backup/jobs/hide-all', {
|
||||
method: 'POST',
|
||||
credentials: 'include',
|
||||
body: { hidden }
|
||||
})
|
||||
if (hidden) {
|
||||
showHiddenJobs.value = false
|
||||
}
|
||||
jobsPage.value = 1
|
||||
await loadJobs()
|
||||
toast.add({
|
||||
title: hidden
|
||||
? t('storage.backup.jobsHiddenAll')
|
||||
: t('storage.backup.jobsUnhiddenAll'),
|
||||
color: 'success'
|
||||
})
|
||||
} catch (error: unknown) {
|
||||
handleError(error, t('storage.backup.hideFailed'))
|
||||
}
|
||||
}
|
||||
|
||||
async function loadEstimate() {
|
||||
loadingEstimate.value = true
|
||||
try {
|
||||
@@ -327,6 +381,7 @@ export function useBackup() {
|
||||
jobsTotal,
|
||||
jobsTotalPages,
|
||||
jobsLoading,
|
||||
showHiddenJobs,
|
||||
estimate,
|
||||
packages,
|
||||
loadingEstimate,
|
||||
@@ -334,6 +389,9 @@ export function useBackup() {
|
||||
hasActiveJob,
|
||||
getActiveJob,
|
||||
loadJobs,
|
||||
toggleShowHiddenJobs,
|
||||
hideJob,
|
||||
hideAllJobs,
|
||||
setJobsPage,
|
||||
setJobsPageSize,
|
||||
loadEstimate,
|
||||
|
||||
@@ -16,6 +16,7 @@ export interface BackupJobItem {
|
||||
error: string | null
|
||||
createdAt: string
|
||||
updatedAt: string
|
||||
hidden: boolean
|
||||
finishedAt: string | null
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user