fix: use identityUuid (camelCase) for person data
This commit is contained in:
@@ -22,10 +22,10 @@
|
|||||||
<div class="ms-ppl-section-title">已知人物:</div>
|
<div class="ms-ppl-section-title">已知人物:</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="ms-ppl-face-grid">
|
<div class="ms-ppl-face-grid">
|
||||||
<div v-for="p in confirmedPeople" :key="p.identity_uuid" class="ms-ppl-face-card" @click="selectPerson(p)" @contextmenu.prevent="showContextMenu($event, p)">
|
<div v-for="p in confirmedPeople" :key="p.identityUuid" class="ms-ppl-face-card" @click="selectPerson(p)" @contextmenu.prevent="showContextMenu($event, p)">
|
||||||
<div class="ms-ppl-face-img-wrap">
|
<div class="ms-ppl-face-img-wrap">
|
||||||
<img v-if="profiles[p.identity_uuid]" :src="profiles[p.identity_uuid]" alt="" @vue:mounted="loadProfile(p.identity_uuid)">
|
<img v-if="profiles[p.identityUuid]" :src="profiles[p.identityUuid]" alt="" @vue:mounted="loadProfile(p.identityUuid)">
|
||||||
<svg v-else class="ms-silhouette" @vue:mounted="loadProfile(p.identity_uuid)" viewBox="0 0 120 120" fill="none">
|
<svg v-else class="ms-silhouette" @vue:mounted="loadProfile(p.identityUuid)" viewBox="0 0 120 120" fill="none">
|
||||||
<circle cx="60" cy="45" r="25" fill="#d1d5db"/>
|
<circle cx="60" cy="45" r="25" fill="#d1d5db"/>
|
||||||
<ellipse cx="60" cy="105" rx="40" ry="25" fill="#d1d5db"/>
|
<ellipse cx="60" cy="105" rx="40" ry="25" fill="#d1d5db"/>
|
||||||
</svg>
|
</svg>
|
||||||
@@ -44,10 +44,10 @@
|
|||||||
<div class="ms-ppl-section-title">待定人物:</div>
|
<div class="ms-ppl-section-title">待定人物:</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="ms-ppl-face-grid">
|
<div class="ms-ppl-face-grid">
|
||||||
<div v-for="p in pendingPeople" :key="p.identity_uuid" class="ms-ppl-face-card" @click="selectPerson(p)" @contextmenu.prevent="showContextMenu($event, p)">
|
<div v-for="p in pendingPeople" :key="p.identityUuid" class="ms-ppl-face-card" @click="selectPerson(p)" @contextmenu.prevent="showContextMenu($event, p)">
|
||||||
<div class="ms-ppl-face-img-wrap">
|
<div class="ms-ppl-face-img-wrap">
|
||||||
<img v-if="profiles[p.identity_uuid]" :src="profiles[p.identity_uuid]" alt="" @vue:mounted="loadProfile(p.identity_uuid)">
|
<img v-if="profiles[p.identityUuid]" :src="profiles[p.identityUuid]" alt="" @vue:mounted="loadProfile(p.identityUuid)">
|
||||||
<svg v-else class="ms-silhouette" @vue:mounted="loadProfile(p.identity_uuid)" viewBox="0 0 120 120" fill="none">
|
<svg v-else class="ms-silhouette" @vue:mounted="loadProfile(p.identityUuid)" viewBox="0 0 120 120" fill="none">
|
||||||
<circle cx="60" cy="45" r="25" fill="#d1d5db"/>
|
<circle cx="60" cy="45" r="25" fill="#d1d5db"/>
|
||||||
<ellipse cx="60" cy="105" rx="40" ry="25" fill="#d1d5db"/>
|
<ellipse cx="60" cy="105" rx="40" ry="25" fill="#d1d5db"/>
|
||||||
</svg>
|
</svg>
|
||||||
@@ -72,10 +72,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="ms-ppl-face-grid">
|
<div class="ms-ppl-face-grid">
|
||||||
<div v-for="p in skippedPeople" :key="p.identity_uuid" class="ms-ppl-face-card skipped-card" @click="selectPerson(p)" @contextmenu.prevent="showContextMenu($event, p)">
|
<div v-for="p in skippedPeople" :key="p.identityUuid" class="ms-ppl-face-card skipped-card" @click="selectPerson(p)" @contextmenu.prevent="showContextMenu($event, p)">
|
||||||
<div class="ms-ppl-face-img-wrap">
|
<div class="ms-ppl-face-img-wrap">
|
||||||
<img v-if="profiles[p.identity_uuid]" :src="profiles[p.identity_uuid]" alt="" @vue:mounted="loadProfile(p.identity_uuid)">
|
<img v-if="profiles[p.identityUuid]" :src="profiles[p.identityUuid]" alt="" @vue:mounted="loadProfile(p.identityUuid)">
|
||||||
<svg v-else class="ms-silhouette" @vue:mounted="loadProfile(p.identity_uuid)" viewBox="0 0 120 120" fill="none">
|
<svg v-else class="ms-silhouette" @vue:mounted="loadProfile(p.identityUuid)" viewBox="0 0 120 120" fill="none">
|
||||||
<circle cx="60" cy="45" r="25" fill="#d1d5db"/>
|
<circle cx="60" cy="45" r="25" fill="#d1d5db"/>
|
||||||
<ellipse cx="60" cy="105" rx="40" ry="25" fill="#d1d5db"/>
|
<ellipse cx="60" cy="105" rx="40" ry="25" fill="#d1d5db"/>
|
||||||
</svg>
|
</svg>
|
||||||
@@ -224,7 +224,13 @@ function onSearch() {
|
|||||||
|
|
||||||
async function loadProfile(uuid: string) {
|
async function loadProfile(uuid: string) {
|
||||||
if (profiles.value[uuid]) return
|
if (profiles.value[uuid]) return
|
||||||
try { profiles.value[uuid] = await invoke('get_identity_profile', { uuid }) } catch {}
|
try {
|
||||||
|
const result: string = await invoke('get_identity_profile', { uuid })
|
||||||
|
console.log('Profile loaded for:', uuid, result ? 'success' : 'empty')
|
||||||
|
profiles.value[uuid] = result
|
||||||
|
} catch (e) {
|
||||||
|
console.error('Profile load failed for:', uuid, e)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function loadCandidateThumb(uuid: string) {
|
async function loadCandidateThumb(uuid: string) {
|
||||||
@@ -233,7 +239,10 @@ async function loadCandidateThumb(uuid: string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function selectPerson(p: any) {
|
function selectPerson(p: any) {
|
||||||
router.push({ name: 'PersonDetail', params: { uuid: p.identity_uuid } })
|
const uuid = p.identityUuid || p.identityUuid
|
||||||
|
console.log('selectPerson called:', uuid, p.name)
|
||||||
|
router.push({ name: 'PersonDetail', params: { uuid } })
|
||||||
|
.catch(e => console.error('Router push failed:', e))
|
||||||
}
|
}
|
||||||
|
|
||||||
async function toggleStar() {
|
async function toggleStar() {
|
||||||
@@ -247,7 +256,7 @@ async function confirmDelete() {
|
|||||||
if (!confirm(`Delete "${selected.value.name}"?`)) return
|
if (!confirm(`Delete "${selected.value.name}"?`)) return
|
||||||
try {
|
try {
|
||||||
await invoke('delete_identity', { uuid: selected.value.identity_uuid })
|
await invoke('delete_identity', { uuid: selected.value.identity_uuid })
|
||||||
people.value = people.value.filter((p: any) => p.identity_uuid !== selected.value.identity_uuid)
|
people.value = people.value.filter((p: any) => p.identityUuid !== selected.value.identity_uuid)
|
||||||
selected.value = null
|
selected.value = null
|
||||||
} catch (e) { console.error('Failed to delete:', e) }
|
} catch (e) { console.error('Failed to delete:', e) }
|
||||||
}
|
}
|
||||||
@@ -273,7 +282,7 @@ async function confirmMerge() {
|
|||||||
try {
|
try {
|
||||||
await invoke('merge_identities', { uuid: selected.value.identity_uuid, intoUuid: mergeTarget.value })
|
await invoke('merge_identities', { uuid: selected.value.identity_uuid, intoUuid: mergeTarget.value })
|
||||||
showMerge.value = false
|
showMerge.value = false
|
||||||
people.value = people.value.filter((p: any) => p.identity_uuid !== selected.value.identity_uuid)
|
people.value = people.value.filter((p: any) => p.identityUuid !== selected.value.identity_uuid)
|
||||||
selected.value = null
|
selected.value = null
|
||||||
} catch (e) { console.error('Merge failed:', e) }
|
} catch (e) { console.error('Merge failed:', e) }
|
||||||
}
|
}
|
||||||
@@ -304,16 +313,16 @@ function ctxAction(action: string) {
|
|||||||
ctxMenu.value.show = false
|
ctxMenu.value.show = false
|
||||||
if (action === 'star') {
|
if (action === 'star') {
|
||||||
p.starred = !p.starred
|
p.starred = !p.starred
|
||||||
const idx = people.value.findIndex((x: any) => x.identity_uuid === p.identity_uuid)
|
const idx = people.value.findIndex((x: any) => x.identity_uuid === p.identityUuid)
|
||||||
if (idx >= 0) people.value[idx].starred = p.starred
|
if (idx >= 0) people.value[idx].starred = p.starred
|
||||||
} else if (action === 'skip') {
|
} else if (action === 'skip') {
|
||||||
invoke('update_identity_status', { uuid: p.identity_uuid, status: 'skipped' }).then(() => {
|
invoke('update_identity_status', { uuid: p.identityUuid, status: 'skipped' }).then(() => {
|
||||||
const idx = people.value.findIndex((x: any) => x.identity_uuid === p.identity_uuid)
|
const idx = people.value.findIndex((x: any) => x.identity_uuid === p.identityUuid)
|
||||||
if (idx >= 0) people.value[idx].status = 'skipped'
|
if (idx >= 0) people.value[idx].status = 'skipped'
|
||||||
}).catch(e => console.error('Skip failed:', e))
|
}).catch(e => console.error('Skip failed:', e))
|
||||||
} else if (action === 'confirm') {
|
} else if (action === 'confirm') {
|
||||||
invoke('update_identity_status', { uuid: p.identity_uuid, status: 'confirmed' }).then(() => {
|
invoke('update_identity_status', { uuid: p.identityUuid, status: 'confirmed' }).then(() => {
|
||||||
const idx = people.value.findIndex((x: any) => x.identity_uuid === p.identity_uuid)
|
const idx = people.value.findIndex((x: any) => x.identity_uuid === p.identityUuid)
|
||||||
if (idx >= 0) people.value[idx].status = 'confirmed'
|
if (idx >= 0) people.value[idx].status = 'confirmed'
|
||||||
}).catch(e => console.error('Confirm failed:', e))
|
}).catch(e => console.error('Confirm failed:', e))
|
||||||
} else if (action === 'rename' || action === 'merge') {
|
} else if (action === 'rename' || action === 'merge') {
|
||||||
|
|||||||
@@ -162,7 +162,7 @@ onMounted(async () => {
|
|||||||
console.log('getPeople raw result:', JSON.stringify(people).slice(0, 200))
|
console.log('getPeople raw result:', JSON.stringify(people).slice(0, 200))
|
||||||
console.log('getPeople result count:', Array.isArray(people) ? people.length : 'not array')
|
console.log('getPeople result count:', Array.isArray(people) ? people.length : 'not array')
|
||||||
peopleCount.value = Array.isArray(people) ? people.length : 0
|
peopleCount.value = Array.isArray(people) ? people.length : 0
|
||||||
const found = (Array.isArray(people) ? people : []).find((p: any) => p.identity_uuid === uuid)
|
const found = (Array.isArray(people) ? people : []).find((p: any) => p.identityUuid === uuid)
|
||||||
console.log('Person found:', !!found, found?.name)
|
console.log('Person found:', !!found, found?.name)
|
||||||
if (found) {
|
if (found) {
|
||||||
person.value = { ...found, status: found.status || 'confirmed' }
|
person.value = { ...found, status: found.status || 'confirmed' }
|
||||||
@@ -245,7 +245,7 @@ async function toggleStar() {
|
|||||||
async function confirmDelete() {
|
async function confirmDelete() {
|
||||||
if (!person.value || !confirm(`Delete "${person.value.name}"?`)) return
|
if (!person.value || !confirm(`Delete "${person.value.name}"?`)) return
|
||||||
try {
|
try {
|
||||||
await invoke('delete_identity', { uuid: person.value.identity_uuid })
|
await invoke('delete_identity', { uuid: person.value.identityUuid })
|
||||||
router.back()
|
router.back()
|
||||||
} catch (e) { console.error('Failed to delete:', e) }
|
} catch (e) { console.error('Failed to delete:', e) }
|
||||||
}
|
}
|
||||||
@@ -253,16 +253,16 @@ async function confirmDelete() {
|
|||||||
async function bindCandidate(c: any) {
|
async function bindCandidate(c: any) {
|
||||||
if (!person.value) return
|
if (!person.value) return
|
||||||
try {
|
try {
|
||||||
await invoke('bind_face', { uuid: person.value.identity_uuid, faceId: String(c.id), fileUuid: c.file_uuid })
|
await invoke('bind_face', { uuid: person.value.identityUuid, faceId: String(c.id), fileUuid: c.file_uuid })
|
||||||
showCandidates.value = false
|
showCandidates.value = false
|
||||||
await loadFaces(person.value.identity_uuid)
|
await loadFaces(person.value.identityUuid)
|
||||||
} catch (e) { console.error('Bind failed:', e) }
|
} catch (e) { console.error('Bind failed:', e) }
|
||||||
}
|
}
|
||||||
|
|
||||||
async function confirmMerge() {
|
async function confirmMerge() {
|
||||||
if (!person.value || !mergeTarget.value) return
|
if (!person.value || !mergeTarget.value) return
|
||||||
try {
|
try {
|
||||||
await invoke('merge_identities', { uuid: person.value.identity_uuid, intoUuid: mergeTarget.value })
|
await invoke('merge_identities', { uuid: person.value.identityUuid, intoUuid: mergeTarget.value })
|
||||||
router.back()
|
router.back()
|
||||||
} catch (e) { console.error('Merge failed:', e) }
|
} catch (e) { console.error('Merge failed:', e) }
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user