瀏覽代碼

✨ feat(deps): add react-table dependency

- 添加@tanstack/react-table@8.21.3用于表格功能实现

🔧 chore(deps): adjust package dependencies

- 重新排序open-docxtemplater-image-module-2依赖位置
- 更新pnpm-lock.yaml以反映依赖变更

♻️ refactor(components): unify component import path

- 将admin页面中的UI组件导入路径从@/client/admin/components/ui/统一改为@/client/components/ui/
- 移除TemplateSquare.tsx和Templates.tsx中单元格渲染函数的冗余any类型标注
yourname 3 月之前
父節點
當前提交
3ac08a755f
共有 4 個文件被更改,包括 44 次插入21 次删除
  1. 2 1
      package.json
  2. 22 0
      pnpm-lock.yaml
  3. 13 13
      src/client/admin/pages/Templates.tsx
  4. 7 7
      src/client/home/pages/TemplateSquare.tsx

+ 2 - 1
package.json

@@ -44,6 +44,7 @@
     "@radix-ui/react-toggle-group": "^1.1.10",
     "@radix-ui/react-tooltip": "^1.2.7",
     "@tanstack/react-query": "^5.83.0",
+    "@tanstack/react-table": "^8.21.3",
     "antd": "^5.26.6",
     "axios": "^1.11.0",
     "bcrypt": "^6.0.0",
@@ -55,7 +56,6 @@
     "dayjs": "^1.11.13",
     "debug": "^4.4.1",
     "docxtemplater": "^3.50.0",
-    "open-docxtemplater-image-module-2": "^1.0.2",
     "dotenv": "^17.2.1",
     "embla-carousel-react": "^8.6.0",
     "formdata-node": "^6.0.3",
@@ -69,6 +69,7 @@
     "minio": "^8.0.5",
     "mysql2": "^3.14.2",
     "next-themes": "^0.4.6",
+    "open-docxtemplater-image-module-2": "^1.0.2",
     "pizzip": "^3.2.0",
     "rc-upload": "^4.9.2",
     "react": "^19.1.0",

+ 22 - 0
pnpm-lock.yaml

@@ -110,6 +110,9 @@ importers:
       '@tanstack/react-query':
         specifier: ^5.83.0
         version: 5.83.0(react@19.1.0)
+      '@tanstack/react-table':
+        specifier: ^8.21.3
+        version: 8.21.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       antd:
         specifier: ^5.26.6
         version: 5.26.6(date-fns@4.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -1585,6 +1588,17 @@ packages:
     peerDependencies:
       react: ^18 || ^19
 
+  '@tanstack/react-table@8.21.3':
+    resolution: {integrity: sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==}
+    engines: {node: '>=12'}
+    peerDependencies:
+      react: '>=16.8'
+      react-dom: '>=16.8'
+
+  '@tanstack/table-core@8.21.3':
+    resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==}
+    engines: {node: '>=12'}
+
   '@types/bcrypt@6.0.0':
     resolution: {integrity: sha512-/oJGukuH3D2+D+3H4JWLaAsJ/ji86dhRidzZ/Od7H/i8g+aCmvkeCc6Ni/f9uxGLSQVCRZkX2/lqEFG2BvWtlQ==}
 
@@ -4493,6 +4507,14 @@ snapshots:
       '@tanstack/query-core': 5.83.0
       react: 19.1.0
 
+  '@tanstack/react-table@8.21.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+    dependencies:
+      '@tanstack/table-core': 8.21.3
+      react: 19.1.0
+      react-dom: 19.1.0(react@19.1.0)
+
+  '@tanstack/table-core@8.21.3': {}
+
   '@types/bcrypt@6.0.0':
     dependencies:
       '@types/node': 24.1.0

+ 13 - 13
src/client/admin/pages/Templates.tsx

@@ -1,11 +1,11 @@
 import React, { useState, useEffect } from 'react';
 import { templateClient } from '@/client/api';
 import { DataTable } from '@/client/admin/components/DataTable';
-import { Button } from '@/client/admin/components/ui/button';
-import { Input } from '@/client/admin/components/ui/input';
-import { Label } from '@/client/admin/components/ui/label';
-import { Textarea } from '@/client/admin/components/ui/textarea';
-import { Badge } from '@/client/admin/components/ui/badge';
+import { Button } from '@/client/components/ui/button';
+import { Input } from '@/client/components/ui/input';
+import { Label } from '@/client/components/ui/label';
+import { Textarea } from '@/client/components/ui/textarea';
+import { Badge } from '@/client/components/ui/badge';
 import {
   Dialog,
   DialogContent,
@@ -13,15 +13,15 @@ import {
   DialogHeader,
   DialogTitle,
   DialogTrigger,
-} from '@/client/admin/components/ui/dialog';
+} from '@/client/components/ui/dialog';
 import {
   Select,
   SelectContent,
   SelectItem,
   SelectTrigger,
   SelectValue,
-} from '@/client/admin/components/ui/select';
-import { Switch } from '@/client/admin/components/ui/switch';
+} from '@/client/components/ui/select';
+import { Switch } from '@/client/components/ui/switch';
 import { toast } from 'react-toastify';
 import { Plus, Edit, Trash2, Eye, Download } from 'lucide-react';
 import { MinioUploader } from '@/client/admin/components/MinioUploader';
@@ -162,14 +162,14 @@ const Templates: React.FC = () => {
     {
       accessorKey: 'category',
       header: '分类',
-      cell: ({ row }: any) => (
+      cell: ({ row }) => (
         <Badge variant="outline">{row.getValue('category')}</Badge>
       ),
     },
     {
       accessorKey: 'isFree',
       header: '类型',
-      cell: ({ row }: any) => (
+      cell: ({ row }) => (
         <Badge variant={row.getValue('isFree') ? "default" : "secondary"}>
           {row.getValue('isFree') ? '免费' : '会员'}
         </Badge>
@@ -182,7 +182,7 @@ const Templates: React.FC = () => {
     {
       accessorKey: 'isDisabled',
       header: '状态',
-      cell: ({ row }: any) => (
+      cell: ({ row }) => (
         <Badge variant={row.getValue('isDisabled') ? "destructive" : "default"}>
           {row.getValue('isDisabled') ? '禁用' : '启用'}
         </Badge>
@@ -191,8 +191,8 @@ const Templates: React.FC = () => {
     {
       id: 'actions',
       header: '操作',
-      cell: ({ row }: any) => {
-        const template = row.original;
+      cell: ({ row }) => {
+        const template = row.original as Template;
         return (
           <div className="flex gap-2">
             <Button

+ 7 - 7
src/client/home/pages/TemplateSquare.tsx

@@ -1,12 +1,12 @@
 import React, { useState, useEffect } from 'react';
 import { publicTemplateClient } from '@/client/api';
-import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/client/home/components/ui/card';
-import { Button } from '@/client/home/components/ui/button';
-import { Badge } from '@/client/home/components/ui/badge';
-import { Skeleton } from '@/client/home/components/ui/skeleton';
-import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/client/home/components/ui/select';
-import { Input } from '@/client/home/components/ui/input';
-import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/client/home/components/ui/tabs';
+import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/client/components/ui/card';
+import { Button } from '@/client/components/ui/button';
+import { Badge } from '@/client/components/ui/badge';
+import { Skeleton } from '@/client/components/ui/skeleton';
+import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/client/components/ui/select';
+import { Input } from '@/client/components/ui/input';
+import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/client/components/ui/tabs';
 import { Eye, Download, Star, Search } from 'lucide-react';
 import { useAuth } from '@/client/home/hooks/AuthProvider';
 import { toast } from 'sonner';