From 718554dee905cd98dcef6824ba0d057d6368629a Mon Sep 17 00:00:00 2001 From: lethdat Date: Sat, 14 Feb 2026 17:18:22 +0700 Subject: [PATCH] feat: Add CardPopover component for video actions and integrate EllipsisVerticalIcon --- components.d.ts | 32 ++++ src/components/icons/EllipsisVerticalIcon.vue | 5 + src/routes/video/components/CardPopover.vue | 139 ++++++++++++++++++ src/routes/video/components/VideoGrid.vue | 19 ++- 4 files changed, 187 insertions(+), 8 deletions(-) create mode 100644 src/components/icons/EllipsisVerticalIcon.vue create mode 100644 src/routes/video/components/CardPopover.vue diff --git a/components.d.ts b/components.d.ts index ec3f2c2..e89c3c1 100644 --- a/components.d.ts +++ b/components.d.ts @@ -17,7 +17,9 @@ declare module 'vue' { ArrowDownTray: typeof import('./src/components/icons/ArrowDownTray.vue')['default'] ArrowRightIcon: typeof import('./src/components/icons/ArrowRightIcon.vue')['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'] + Checkbox: typeof import('primevue/checkbox')['default'] CheckCircleIcon: typeof import('./src/components/icons/CheckCircleIcon.vue')['default'] CheckIcon: typeof import('./src/components/icons/CheckIcon.vue')['default'] CheckMarkIcon: typeof import('./src/components/icons/CheckMarkIcon.vue')['default'] @@ -26,23 +28,37 @@ declare module 'vue' { CreditCardIcon: typeof import('./src/components/icons/CreditCardIcon.vue')['default'] DashboardLayout: typeof import('./src/components/DashboardLayout.vue')['default'] DashboardNav: typeof import('./src/components/DashboardNav.vue')['default'] + EllipsisVerticalIcon: typeof import('./src/components/icons/EllipsisVerticalIcon.vue')['default'] EmptyState: typeof import('./src/components/dashboard/EmptyState.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'] Home: typeof import('./src/components/icons/Home.vue')['default'] + IconField: typeof import('primevue/iconfield')['default'] InfoIcon: typeof import('./src/components/icons/InfoIcon.vue')['default'] + InputGroup: typeof import('primevue/inputgroup')['default'] + InputGroupAddon: typeof import('primevue/inputgroupaddon')['default'] + InputIcon: typeof import('primevue/inputicon')['default'] InputText: typeof import('primevue/inputtext')['default'] Layout: typeof import('./src/components/icons/Layout.vue')['default'] LinkIcon: typeof import('./src/components/icons/LinkIcon.vue')['default'] + Menu: typeof import('primevue/menu')['default'] + Message: typeof import('primevue/message')['default'] NotificationDrawer: typeof import('./src/components/NotificationDrawer.vue')['default'] PageHeader: typeof import('./src/components/dashboard/PageHeader.vue')['default'] + Paginator: typeof import('primevue/paginator')['default'] 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'] + Select: typeof import('primevue/select')['default'] SettingsIcon: typeof import('./src/components/icons/SettingsIcon.vue')['default'] + Skeleton: typeof import('primevue/skeleton')['default'] StatsCard: typeof import('./src/components/dashboard/StatsCard.vue')['default'] + Tag: typeof import('primevue/tag')['default'] TestIcon: typeof import('./src/components/icons/TestIcon.vue')['default'] TrashIcon: typeof import('./src/components/icons/TrashIcon.vue')['default'] Upload: typeof import('./src/components/icons/Upload.vue')['default'] @@ -60,7 +76,9 @@ declare global { const ArrowDownTray: typeof import('./src/components/icons/ArrowDownTray.vue')['default'] const ArrowRightIcon: typeof import('./src/components/icons/ArrowRightIcon.vue')['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'] + const Checkbox: typeof import('primevue/checkbox')['default'] const CheckCircleIcon: typeof import('./src/components/icons/CheckCircleIcon.vue')['default'] const CheckIcon: typeof import('./src/components/icons/CheckIcon.vue')['default'] const CheckMarkIcon: typeof import('./src/components/icons/CheckMarkIcon.vue')['default'] @@ -69,23 +87,37 @@ declare global { const CreditCardIcon: typeof import('./src/components/icons/CreditCardIcon.vue')['default'] const DashboardLayout: typeof import('./src/components/DashboardLayout.vue')['default'] const DashboardNav: typeof import('./src/components/DashboardNav.vue')['default'] + const EllipsisVerticalIcon: typeof import('./src/components/icons/EllipsisVerticalIcon.vue')['default'] const EmptyState: typeof import('./src/components/dashboard/EmptyState.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'] const Home: typeof import('./src/components/icons/Home.vue')['default'] + const IconField: typeof import('primevue/iconfield')['default'] const InfoIcon: typeof import('./src/components/icons/InfoIcon.vue')['default'] + const InputGroup: typeof import('primevue/inputgroup')['default'] + const InputGroupAddon: typeof import('primevue/inputgroupaddon')['default'] + const InputIcon: typeof import('primevue/inputicon')['default'] const InputText: typeof import('primevue/inputtext')['default'] const Layout: typeof import('./src/components/icons/Layout.vue')['default'] const LinkIcon: typeof import('./src/components/icons/LinkIcon.vue')['default'] + const Menu: typeof import('primevue/menu')['default'] + const Message: typeof import('primevue/message')['default'] const NotificationDrawer: typeof import('./src/components/NotificationDrawer.vue')['default'] const PageHeader: typeof import('./src/components/dashboard/PageHeader.vue')['default'] + const Paginator: typeof import('primevue/paginator')['default'] 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'] + const Select: typeof import('primevue/select')['default'] const SettingsIcon: typeof import('./src/components/icons/SettingsIcon.vue')['default'] + const Skeleton: typeof import('primevue/skeleton')['default'] const StatsCard: typeof import('./src/components/dashboard/StatsCard.vue')['default'] + const Tag: typeof import('primevue/tag')['default'] const TestIcon: typeof import('./src/components/icons/TestIcon.vue')['default'] const TrashIcon: typeof import('./src/components/icons/TrashIcon.vue')['default'] const Upload: typeof import('./src/components/icons/Upload.vue')['default'] diff --git a/src/components/icons/EllipsisVerticalIcon.vue b/src/components/icons/EllipsisVerticalIcon.vue new file mode 100644 index 0000000..6365193 --- /dev/null +++ b/src/components/icons/EllipsisVerticalIcon.vue @@ -0,0 +1,5 @@ + diff --git a/src/routes/video/components/CardPopover.vue b/src/routes/video/components/CardPopover.vue new file mode 100644 index 0000000..451e222 --- /dev/null +++ b/src/routes/video/components/CardPopover.vue @@ -0,0 +1,139 @@ + + + + diff --git a/src/routes/video/components/VideoGrid.vue b/src/routes/video/components/VideoGrid.vue index 5fcf02f..5320bc9 100644 --- a/src/routes/video/components/VideoGrid.vue +++ b/src/routes/video/components/VideoGrid.vue @@ -3,6 +3,7 @@ import type { ModelVideo } from '@/api/client'; import { formatDate, formatDuration, getStatusSeverity } from '@/lib/utils'; import Card from 'primevue/card'; import Checkbox from 'primevue/checkbox'; +import CardPopover from './CardPopover.vue'; defineProps<{ videos: ModelVideo[]; @@ -30,7 +31,7 @@ const emit = defineEmits<{ +