feat: add OpenList upload support and upload tasks monitoring page

Backend:
- Add OpenListRecordArtifactUploader implementing AList-compatible API upload
- Add Uploading status to RecordArtifactUploadStatus enum
- Add MarkUploadStarted() to RecordResult entity for upload progress tracking
- Add ListUploadStatus API endpoint with pagination and status filtering
- Add UploadTaskItemDto and UploadTaskListResponse models
- Add upload segment count stats (uploaded/failed/uploading) to session DTO
- Add OpenListUploadSettingsDto and upload target type OpenList

Frontend:
- Add UploadTasksView page with route /upload-tasks
- Add upload status labels and UploadTaskItem types
- Refactor MainLayout navigation and clean up main.css
- Polish DashboardView, MetricCard, StatusBadge, RightDrawer components
- Update SettingsView to support OpenList upload configuration

Build:
- Add frontend/Dockerfile.arm64 for ARM64 frontend image
- Update build-arm64-image.sh script

Other:
- Add segment_completed_openlist.sh trigger script
- Add prototype/ directory with UI mockups
- Add frontend .dockerignore refinements

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-01 21:14:50 +08:00
co-authored by Claude Fable 5
parent f8abae0a7a
commit 9df174bb0b
44 changed files with 3962 additions and 1827 deletions
+8 -9
View File
@@ -2119,7 +2119,7 @@ watch(
width: 56px;
height: 56px;
border-radius: 999px;
background: linear-gradient(180deg, #2563eb 0%, #4338ca 100%);
background: var(--accent);
color: #ffffff;
font-size: 20px;
font-weight: 800;
@@ -2214,7 +2214,7 @@ watch(
border: 1px solid var(--border-subtle);
border-bottom: 0;
border-radius: 12px 12px 0 0;
background: linear-gradient(180deg, var(--surface-raised), var(--surface-muted));
background: var(--surface-muted);
box-shadow: var(--shadow-soft);
}
@@ -2255,7 +2255,7 @@ watch(
border: 1px solid var(--border-subtle);
border-top: 0;
border-radius: 0 0 12px 12px;
background: linear-gradient(180deg, var(--surface-raised), var(--surface));
background: var(--surface);
box-shadow: var(--shadow-soft);
}
@@ -2303,7 +2303,7 @@ watch(
gap: 10px;
padding: 16px 18px;
border-radius: 12px;
background: linear-gradient(180deg, var(--surface-muted), var(--surface));
background: var(--surface);
border: 1px solid var(--border-subtle);
}
@@ -2420,7 +2420,7 @@ watch(
padding: 18px 18px 4px;
border-radius: 12px;
border: 1px solid var(--border-subtle);
background: linear-gradient(180deg, var(--surface-muted), var(--surface));
background: var(--surface);
}
.template-section__header {
@@ -2526,11 +2526,10 @@ watch(
justify-content: space-between;
gap: 16px;
padding: 14px 18px;
border-radius: 14px;
border-radius: var(--radius-md);
border: 1px solid var(--border-base);
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0)),
var(--surface-raised);
background: var(--surface-raised);
box-shadow: var(--shadow-lg);
box-shadow: var(--shadow-float);
backdrop-filter: blur(18px);
pointer-events: auto;