+
+
活动管理
+
+
+
+ {showTypeFilter && (
+
+ {[
+ { label: '全部', value: undefined },
+ { label: 'Official', value: 'official' },
+ { label: 'Party', value: 'party' },
+ ].map(opt => (
+
+ ))}
+
+ )}
+
+
+
+
+
+ 名称
+ 类型
+ 开始时间
+ 报名数
+ 签到数
+ 操作
+
+
+
+ {events.map(event => (
+
+
+ {event.thumbnail
+ ?
+ : }
+
+ {event.name}
+
+
+ {event.type === 'official' ? 'Official' : 'Party'}
+
+
+
+ {new Date(event.start_time).toLocaleDateString('zh-CN')}
+
+ {event.join_count}
+ {event.checkin_count}
+
+
+
+
+
+
+ {isOfficialAdmin(permissionLevel) && (
+
+ )}
+
+
+
+ ))}
+
+
+
+ {totalPages > 1 && (
+
+
+
+ {page}
+ {' '}
+ /
+ {' '}
+ {totalPages}
+
+
+
+ )}
+
+ );
+}
diff --git a/src/stories/admin/events/event-admin-list.stories.tsx b/src/stories/admin/events/event-admin-list.stories.tsx
new file mode 100644
index 0000000..93152cc
--- /dev/null
+++ b/src/stories/admin/events/event-admin-list.stories.tsx
@@ -0,0 +1,44 @@
+import type { Meta, StoryObj } from '@storybook/react-vite';
+import type { AdminEventRow } from '@/components/admin/events/event-admin-list.view';
+import { EventAdminListSkeleton } from '@/components/admin/events/event-admin-list.skeleton';
+import { EventAdminListView } from '@/components/admin/events/event-admin-list.view';
+import { PERMISSION_LEVELS } from '@/lib/permissions';
+import { exampleAdminEvents } from '../../admin.examples';
+
+const meta = {
+ title: 'Admin/Events/EventAdminList',
+ component: EventAdminListView,
+} satisfies Meta