@@ -149,8 +156,6 @@
{{ r.text_content }}
-
{{ r.file_name || '' }}
{{ r.file_uuid }}
-
{{ r.display_file_name }}
{{ r.file_uuid }}
F{{ r.start_frame }}–{{ r.end_frame }}
({{ formatTime(r.start_time) }}–{{ formatTime(r.end_time) }})
@@ -1517,6 +1522,22 @@ function playVideoAtFrame(r: any, frame: number) {
playing.value = true
}
+function playFullFile(r: any) {
+ currentVideo.value = {
+ fileUuid: r.file_uuid,
+ startFrame: 0,
+ endFrame: 0, // 0 = play to end
+ title: r.file_name || 'Full Video'
+ }
+ playing.value = true
+}
+
+function isVideoFile(r: any): boolean {
+ if (!r.file_name) return false
+ const ext = r.file_name.split('.').pop()?.toLowerCase()
+ return ['mp4', 'mov', 'mkv', 'avi', 'webm'].includes(ext || '')
+}
+
function isVariantFrame(r: any, frame: number): boolean {
return r.variants?.some((v: any) => v.frames.includes(frame))
}
@@ -2068,6 +2089,26 @@ function openSource(src: SourceInfo) {
position: relative;
}
.card-thumb img { width: 100%; height: 100%; object-fit: cover; }
+.card-file-info {
+ display: flex; align-items: center; gap: 5px;
+ padding: 5px 8px; background: var(--card-background);
+ border-bottom: 1px solid var(--border-light);
+ cursor: pointer; transition: background .15s;
+}
+.card-file-info:hover {
+ background: rgba(var(--primary-color-rgb), 0.1);
+}
+.card-file-icon {
+ flex-shrink: 0; color: var(--primary-color);
+}
+.card-file-name {
+ font-size: 11px; font-weight: 600; color: var(--text-primary);
+ flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
+}
+.card-file-uuid-badge {
+ font-size: 8px; color: var(--muted-text); font-family: monospace;
+ max-width: 80px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
+}
.ocr-group-badge {
position: absolute; top: 6px; right: 6px;
background: rgba(var(--primary-color-rgb), 0.85); color: #fff;