From c6924afe5b29202be79644440963391e90c58644 Mon Sep 17 00:00:00 2001 From: "Mr.Dat" Date: Fri, 27 Feb 2026 18:07:43 +0700 Subject: [PATCH] feat(video): enhance video management UI and functionality - Refactor VideoBulkActions.vue to remove unused imports. - Update VideoFilters.vue to improve search and status filtering with new UI components from PrimeVue. - Modify VideoTable.vue to enhance action buttons for editing, copying, and deleting videos, using PrimeVue Button components. - Implement saveImageFromStream function in merge.ts to handle thumbnail image uploads. - Add new animation rule for card spring effect in uno.config.ts. - Create FileUploadType.vue icon component for local and remote file uploads. - Introduce CopyVideoModal.vue for sharing video links with enhanced user experience. - Add DetailVideoModal.vue for editing video details with form validation using Zod. - Establish new display routes in display.ts for handling thumbnail and metadata updates. --- components.d.ts | 6 +- src/components/DashboardNav.vue | 6 +- src/components/GlobalUploadIndicator.vue | 58 +++-- src/components/icons/FileUploadType.vue | 23 ++ src/components/icons/LinkIcon.vue | 2 +- src/composables/useUploadQueue.ts | 22 +- src/index.tsx | 8 +- src/main.ts | 26 +- src/routes/auth/forgot.vue | 6 +- src/routes/auth/login.vue | 14 +- src/routes/auth/signup.vue | 14 +- src/routes/index.ts | 32 ++- .../overview/components/QuickActions.vue | 5 +- src/routes/upload/Upload.vue | 32 ++- .../upload/components/UploadDropzone.vue | 85 +++++-- .../upload/components/UploadQueueItem.vue | 22 +- src/routes/video/CopyVideoModal.vue | 174 +++++++++++++ src/routes/video/DetailVideoModal.vue | 229 ++++++++++++++++++ src/routes/video/Videos.vue | 153 +++++++++++- .../video/components/VideoBulkActions.vue | 1 - src/routes/video/components/VideoFilters.vue | 109 +++------ src/routes/video/components/VideoTable.vue | 62 +++-- src/server/modules/merge.ts | 16 ++ src/server/routes/display.ts | 23 ++ uno.config.ts | 9 + 25 files changed, 906 insertions(+), 231 deletions(-) create mode 100644 src/components/icons/FileUploadType.vue create mode 100644 src/routes/video/CopyVideoModal.vue create mode 100644 src/routes/video/DetailVideoModal.vue create mode 100644 src/server/routes/display.ts diff --git a/components.d.ts b/components.d.ts index 18b48ac..f4114e8 100644 --- a/components.d.ts +++ b/components.d.ts @@ -16,7 +16,6 @@ declare module 'vue' { AlertTriangleIcon: typeof import('./src/components/icons/AlertTriangleIcon.vue')['default'] ArrowDownTray: typeof import('./src/components/icons/ArrowDownTray.vue')['default'] ArrowRightIcon: typeof import('./src/components/icons/ArrowRightIcon.vue')['default'] - Avatar: typeof import('primevue/avatar')['default'] Bell: typeof import('./src/components/icons/Bell.vue')['default'] Button: typeof import('primevue/button')['default'] Chart: typeof import('./src/components/icons/Chart.vue')['default'] @@ -32,6 +31,7 @@ declare module 'vue' { Dialog: typeof import('primevue/dialog')['default'] EllipsisVerticalIcon: typeof import('./src/components/icons/EllipsisVerticalIcon.vue')['default'] EmptyState: typeof import('./src/components/dashboard/EmptyState.vue')['default'] + FileUploadType: typeof import('./src/components/icons/FileUploadType.vue')['default'] FloatLabel: typeof import('primevue/floatlabel')['default'] GlobalUploadIndicator: typeof import('./src/components/GlobalUploadIndicator.vue')['default'] HardDriveUpload: typeof import('./src/components/icons/HardDriveUpload.vue')['default'] @@ -49,7 +49,6 @@ declare module 'vue' { PanelLeft: typeof import('./src/components/icons/PanelLeft.vue')['default'] Password: typeof import('primevue/password')['default'] PencilIcon: typeof import('./src/components/icons/PencilIcon.vue')['default'] - Popover: typeof import('primevue/popover')['default'] RootLayout: typeof import('./src/components/RootLayout.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] @@ -74,7 +73,6 @@ declare global { const AlertTriangleIcon: typeof import('./src/components/icons/AlertTriangleIcon.vue')['default'] const ArrowDownTray: typeof import('./src/components/icons/ArrowDownTray.vue')['default'] const ArrowRightIcon: typeof import('./src/components/icons/ArrowRightIcon.vue')['default'] - const Avatar: typeof import('primevue/avatar')['default'] const Bell: typeof import('./src/components/icons/Bell.vue')['default'] const Button: typeof import('primevue/button')['default'] const Chart: typeof import('./src/components/icons/Chart.vue')['default'] @@ -90,6 +88,7 @@ declare global { const Dialog: typeof import('primevue/dialog')['default'] const EllipsisVerticalIcon: typeof import('./src/components/icons/EllipsisVerticalIcon.vue')['default'] const EmptyState: typeof import('./src/components/dashboard/EmptyState.vue')['default'] + const FileUploadType: typeof import('./src/components/icons/FileUploadType.vue')['default'] const FloatLabel: typeof import('primevue/floatlabel')['default'] const GlobalUploadIndicator: typeof import('./src/components/GlobalUploadIndicator.vue')['default'] const HardDriveUpload: typeof import('./src/components/icons/HardDriveUpload.vue')['default'] @@ -107,7 +106,6 @@ declare global { const PanelLeft: typeof import('./src/components/icons/PanelLeft.vue')['default'] const Password: typeof import('primevue/password')['default'] const PencilIcon: typeof import('./src/components/icons/PencilIcon.vue')['default'] - const Popover: typeof import('primevue/popover')['default'] const RootLayout: typeof import('./src/components/RootLayout.vue')['default'] const RouterLink: typeof import('vue-router')['RouterLink'] const RouterView: typeof import('vue-router')['RouterView'] diff --git a/src/components/DashboardNav.vue b/src/components/DashboardNav.vue index a85e9a6..c71422c 100644 --- a/src/components/DashboardNav.vue +++ b/src/components/DashboardNav.vue @@ -1,12 +1,12 @@