311fe0ee9c
Goal (operator 2026-06-18): the overview of a Settings tab fits one unscrolled viewport; expanding a tile to read into it is the only reason to scroll. - Every Maintenance card converted to the collapsible MaintenanceTile (collapsed by default = icon + short title + one-line blurb). Task cards (ML backfill, centroids, thumbnails, archive re-extract, missing-file repair, DB maintenance) sit in a responsive grid; running tasks auto-expand. Tagging config (suggestion thresholds, allowlist, aliases) grouped in one Tagging section as collapsible tiles; Backup is its own collapsible tile. - Three labeled sections mirror the Cleanup tab: Backfills and reprocessing / Tagging / Storage. - Center the whole Settings surface: SettingsView is now a centered, width-capped (1140px) column so the tab strip and every panel sit in a tidy centered measure (was full-width). CleanupView drops its own left-aligned max-width to fill it. All card logic unchanged - only the chrome. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
36 lines
1.1 KiB
Vue
36 lines
1.1 KiB
Vue
<template>
|
|
<MaintenanceTile
|
|
icon="mdi-refresh"
|
|
title="ML backfill"
|
|
blurb="Re-run tagging + embeddings on images missing them."
|
|
:open="busy"
|
|
>
|
|
<p class="text-body-2 mb-3">
|
|
Re-run Camie + SigLIP on images missing predictions or embeddings
|
|
for the current model versions. Safe to re-run.
|
|
</p>
|
|
<v-btn color="primary" rounded="pill" :loading="busy" @click="run">
|
|
<v-icon start>mdi-refresh</v-icon> Run backfill now
|
|
</v-btn>
|
|
<span v-if="done" class="ml-3 text-caption">Enqueued.</span>
|
|
<QueueStatusBar queue="ml" queue-label="ML" />
|
|
</MaintenanceTile>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { toast } from '../../utils/toast.js'
|
|
import { ref } from 'vue'
|
|
import { useMLStore } from '../../stores/ml.js'
|
|
import MaintenanceTile from '../common/MaintenanceTile.vue'
|
|
import QueueStatusBar from './QueueStatusBar.vue'
|
|
const store = useMLStore()
|
|
const busy = ref(false)
|
|
const done = ref(false)
|
|
async function run() {
|
|
busy.value = true
|
|
try { await store.triggerBackfill(); done.value = true }
|
|
catch (e) { toast({ text: e.message, type: 'error' }) }
|
|
finally { busy.value = false }
|
|
}
|
|
</script>
|