diff --git a/src/pages/company/project/detail/index.jsx b/src/pages/company/project/detail/index.jsx
index ce35943..fd8382a 100644
--- a/src/pages/company/project/detail/index.jsx
+++ b/src/pages/company/project/detail/index.jsx
@@ -11,8 +11,7 @@ import {
message,
Select,
DatePicker,
- Typography,
- Spin
+ Typography
} from 'antd';
import {
ArrowLeftOutlined,
@@ -259,179 +258,177 @@ export default function ProjectDetail() {
return (
-
-
-
-
- {id ? (isEdit ? "编辑专案" : "查看专案") : "新建专案"}
-
-
- {id
- ? isEdit
- ? "请修改专案信息"
- : "专案详情"
- : "请填写专案信息"}
-
-
-
- }
- onClick={() => navigate("/company/project")}
- >
- 返回
-
- {!isView && (
- }
- onClick={() => form.submit()}
- loading={loading}
- >
- 保存
-
- )}
-
+
+
+
+ {id ? (isEdit ? "编辑专案" : "查看专案") : "新建专案"}
+
+
+ {id
+ ? isEdit
+ ? "请修改专案信息"
+ : "专案详情"
+ : "请填写专案信息"}
+
- }
- >
-
+ }
+ >
+
-
-
+ 专案描述}
+ >
+
+
+
+
+
+
+ 专案资源
+
+ }
+ bordered={false}
+ >
+
+ {/* */}
+
+
+
+
+
);
}
diff --git a/src/pages/company/project/index.jsx b/src/pages/company/project/index.jsx
index 074719a..51423b4 100644
--- a/src/pages/company/project/index.jsx
+++ b/src/pages/company/project/index.jsx
@@ -1,10 +1,11 @@
import React, { useEffect, useState } from 'react';
-import { Card, Table, Button, message, Popconfirm, Tag, Space, Select } from 'antd';
-import { PlusOutlined, EditOutlined, DeleteOutlined, EyeOutlined } from '@ant-design/icons';
+import { Card, Table, Button, message, Popconfirm, Tag, Space, Select, Tooltip } from 'antd';
+import { PlusOutlined, EditOutlined, DeleteOutlined, EyeOutlined, ShareAltOutlined } from '@ant-design/icons';
import { useResources } from "@/hooks/resource/useResource";
import { useNavigate } from "react-router-dom";
import { supabase } from "@/config/supabase";
import dayjs from 'dayjs';
+import { useCopyToClipboard } from 'react-use';
const ProjectPage = () => {
const navigate = useNavigate();
@@ -19,6 +20,7 @@ const ProjectPage = () => {
const [tasks, setTasks] = useState([]);
const [loadingTasks, setLoadingTasks] = useState(false);
const [selectedTask, setSelectedTask] = useState(null);
+ const [state, copyToClipboard] = useCopyToClipboard();
const {
resources: projects,
@@ -164,46 +166,67 @@ const ProjectPage = () => {
title: "操作",
key: "action",
fixed: "right",
- render: (_, record) => (
-
- }
- onClick={() => navigate(`/company/projectView/${record.id}`)}
- className="dark:text-gray-300 dark:hover:text-blue-400"
- >
- 查看
-
- }
- onClick={() => navigate(`/company/projectInfo/${record.id}?edit=true`)}
- className="dark:text-gray-300 dark:hover:text-blue-400"
- >
- 编辑
-
- handleDelete(record.id)}
- okText="确定"
- cancelText="取消"
- okButtonProps={{ danger: true }}
- >
- }
- className="dark:hover:text-red-400"
+ render: (_, record) => {
+ return (
+
+ }
+ onClick={() => navigate(`/company/projectView/${record.id}`)}
+ className="dark:text-gray-300 dark:hover:text-blue-400"
>
- 删除
+ 查看
-
-
- ),
+
+ }
+ onClick={() => {
+ const viewUrl = `${window.location.origin}/company/projectView/${record.id}`;
+ copyToClipboard(viewUrl);
+ if (!state.error) {
+ message.success('链接已复制到剪贴板');
+ } else {
+ message.error('复制失败,请手动复制');
+ }
+ }}
+ className="dark:text-gray-300 dark:hover:text-blue-400"
+ >
+ 分享
+
+
+ }
+ onClick={() => navigate(`/company/projectInfo/${record.id}?edit=true`)}
+ className="dark:text-gray-300 dark:hover:text-blue-400"
+ >
+ 编辑
+
+ handleDelete(record.id)}
+ okText="确定"
+ cancelText="取消"
+ okButtonProps={{ danger: true }}
+ >
+ }
+ className="dark:hover:text-red-400"
+ >
+ 删除
+
+
+
+ );
+ },
},
];
diff --git a/src/pages/company/project/info.jsx b/src/pages/company/project/info.jsx
index 1b7f18e..c096fc5 100644
--- a/src/pages/company/project/info.jsx
+++ b/src/pages/company/project/info.jsx
@@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react';
-import { useParams } from 'react-router-dom';
+import { useParams, useNavigate } from 'react-router-dom';
import { supabase } from "@/config/supabase";
import { Spin, Tag, Empty, Button, Modal, Form, Input, Collapse, message, Upload,Tabs, Select, Divider } from 'antd';
import { PlusOutlined, FolderOpenOutlined, ClockCircleOutlined, InboxOutlined } from '@ant-design/icons';
@@ -8,6 +8,7 @@ import {supabaseService}from '@/hooks/supabaseService'
const type="project"
export default function ProjectInfo() {
const { id } = useParams();
+ const navigate = useNavigate();
const [loading, setLoading] = useState(true);
const [projectData, setProjectData] = useState(null);
const [form] = Form.useForm();
@@ -496,7 +497,10 @@ export default function ProjectInfo() {
-
+
+
+
+
);
+ // 加载状态展示
if (loading) {
return (
-
-
+
);
}
- if (!projectData) {
+ // 无项目数据状态(包括无 ID 和未找到项目)
+ if (!projectData || !id) {
return (
-
-
+
+
+ 未找到项目信息
+ navigate(-1)}
+ className="bg-blue-50 text-blue-600 hover:bg-blue-100 border-none
+ transition-colors duration-200"
+ >
+ 返回上一页
+
+
+ }
+ />
);
}