v0.9.7
parent
d621fd8d24
commit
e09f94b043
|
|
@ -4,6 +4,7 @@ import { Layout, Menu, Button, Modal, Input, Space, Tooltip, Dropdown, Upload, S
|
||||||
import {
|
import {
|
||||||
FileOutlined,
|
FileOutlined,
|
||||||
FolderOutlined,
|
FolderOutlined,
|
||||||
|
FolderOpenOutlined,
|
||||||
PlusOutlined,
|
PlusOutlined,
|
||||||
DeleteOutlined,
|
DeleteOutlined,
|
||||||
EditOutlined,
|
EditOutlined,
|
||||||
|
|
@ -923,11 +924,15 @@ function DocumentEditor() {
|
||||||
)
|
)
|
||||||
|
|
||||||
if (!node.isLeaf) {
|
if (!node.isLeaf) {
|
||||||
|
const isOpen = openKeys.includes(node.key)
|
||||||
|
const folderIconStyle = isSelected ? { color: '#1890ff' } : undefined
|
||||||
// 目录 - 通过className和style控制选中样式
|
// 目录 - 通过className和style控制选中样式
|
||||||
return {
|
return {
|
||||||
key: node.key,
|
key: node.key,
|
||||||
label: labelContent,
|
label: labelContent,
|
||||||
icon: <FolderOutlined style={isSelected ? { color: '#1890ff' } : {}} />,
|
icon: isOpen
|
||||||
|
? <FolderOpenOutlined style={folderIconStyle} />
|
||||||
|
: <FolderOutlined style={folderIconStyle} />,
|
||||||
children: node.children ? convertTreeToMenuItems(node.children) : [],
|
children: node.children ? convertTreeToMenuItems(node.children) : [],
|
||||||
className: isSelected ? 'folder-selected' : '',
|
className: isSelected ? 'folder-selected' : '',
|
||||||
onTitleClick: () => {
|
onTitleClick: () => {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import { useState, useEffect, useRef, useMemo } from 'react'
|
import { useState, useEffect, useRef, useMemo } from 'react'
|
||||||
import { useParams, useNavigate, useSearchParams } from 'react-router-dom'
|
import { useParams, useNavigate, useSearchParams } from 'react-router-dom'
|
||||||
import { Layout, Menu, Spin, FloatButton, Button, Tooltip, message, Anchor, Modal, Input, Space, Dropdown, Empty, Switch } from 'antd'
|
import { Layout, Menu, Spin, FloatButton, Button, Tooltip, message, Anchor, Modal, Input, Space, Dropdown, Empty, Switch } from 'antd'
|
||||||
import { VerticalAlignTopOutlined, ShareAltOutlined, MenuFoldOutlined, MenuUnfoldOutlined, FileTextOutlined, FolderOutlined, FilePdfOutlined, CopyOutlined, LockOutlined, CloudDownloadOutlined, CloudUploadOutlined, DownOutlined, SearchOutlined, ArrowLeftOutlined, MenuOutlined, ReloadOutlined } from '@ant-design/icons'
|
import { VerticalAlignTopOutlined, ShareAltOutlined, MenuFoldOutlined, MenuUnfoldOutlined, FileTextOutlined, FolderOutlined, FolderOpenOutlined, FilePdfOutlined, CopyOutlined, LockOutlined, CloudDownloadOutlined, CloudUploadOutlined, DownOutlined, SearchOutlined, ArrowLeftOutlined, MenuOutlined, ReloadOutlined } from '@ant-design/icons'
|
||||||
import ReactMarkdown from 'react-markdown'
|
import ReactMarkdown from 'react-markdown'
|
||||||
import remarkGfm from 'remark-gfm'
|
import remarkGfm from 'remark-gfm'
|
||||||
import rehypeRaw from 'rehype-raw'
|
import rehypeRaw from 'rehype-raw'
|
||||||
|
|
@ -306,11 +306,12 @@ function DocumentPage() {
|
||||||
)
|
)
|
||||||
|
|
||||||
if (!node.isLeaf) {
|
if (!node.isLeaf) {
|
||||||
|
const isOpen = openKeys.includes(node.key)
|
||||||
// 目录
|
// 目录
|
||||||
return {
|
return {
|
||||||
key: node.key,
|
key: node.key,
|
||||||
label: labelNode,
|
label: labelNode,
|
||||||
icon: <FolderOutlined />,
|
icon: isOpen ? <FolderOpenOutlined /> : <FolderOutlined />,
|
||||||
onTitleClick: () => setSelectedNodeKey(node.key),
|
onTitleClick: () => setSelectedNodeKey(node.key),
|
||||||
children: node.children ? convertTreeToMenuItems(node.children) : [],
|
children: node.children ? convertTreeToMenuItems(node.children) : [],
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import { useState, useEffect, useRef, useMemo } from 'react'
|
import { useState, useEffect, useRef, useMemo } from 'react'
|
||||||
import { useParams, useSearchParams, useNavigate } from 'react-router-dom'
|
import { useParams, useSearchParams, useNavigate } from 'react-router-dom'
|
||||||
import { Layout, Menu, Spin, Button, Modal, Input, Drawer, Anchor, Empty, Tooltip } from 'antd'
|
import { Layout, Menu, Spin, Button, Modal, Input, Drawer, Anchor, Empty, Tooltip } from 'antd'
|
||||||
import { MenuFoldOutlined, MenuUnfoldOutlined, FileTextOutlined, FolderOutlined, FilePdfOutlined, LockOutlined, MenuOutlined, CloseOutlined } from '@ant-design/icons'
|
import { MenuFoldOutlined, MenuUnfoldOutlined, FileTextOutlined, FolderOutlined, FolderOpenOutlined, FilePdfOutlined, LockOutlined, MenuOutlined, CloseOutlined } from '@ant-design/icons'
|
||||||
import ReactMarkdown from 'react-markdown'
|
import ReactMarkdown from 'react-markdown'
|
||||||
import remarkGfm from 'remark-gfm'
|
import remarkGfm from 'remark-gfm'
|
||||||
import rehypeHighlight from 'rehype-highlight'
|
import rehypeHighlight from 'rehype-highlight'
|
||||||
|
|
@ -45,6 +45,7 @@ function ProjectSharePage() {
|
||||||
const [projectInfo, setProjectInfo] = useState(null)
|
const [projectInfo, setProjectInfo] = useState(null)
|
||||||
const [fileTree, setFileTree] = useState([])
|
const [fileTree, setFileTree] = useState([])
|
||||||
const [selectedFile, setSelectedFile] = useState('')
|
const [selectedFile, setSelectedFile] = useState('')
|
||||||
|
const [selectedNodeKey, setSelectedNodeKey] = useState('')
|
||||||
const [markdownContent, setMarkdownContent] = useState('')
|
const [markdownContent, setMarkdownContent] = useState('')
|
||||||
const [loading, setLoading] = useState(false)
|
const [loading, setLoading] = useState(false)
|
||||||
const [openKeys, setOpenKeys] = useState([])
|
const [openKeys, setOpenKeys] = useState([])
|
||||||
|
|
@ -264,10 +265,12 @@ function ProjectSharePage() {
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
)
|
)
|
||||||
if (!node.isLeaf) {
|
if (!node.isLeaf) {
|
||||||
|
const isOpen = openKeys.includes(node.key)
|
||||||
return {
|
return {
|
||||||
key: node.key,
|
key: node.key,
|
||||||
label: labelNode,
|
label: labelNode,
|
||||||
icon: <FolderOutlined />,
|
icon: isOpen ? <FolderOpenOutlined /> : <FolderOutlined />,
|
||||||
|
onTitleClick: () => setSelectedNodeKey(node.key),
|
||||||
children: node.children ? convertTreeToMenuItems(node.children) : [],
|
children: node.children ? convertTreeToMenuItems(node.children) : [],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -296,6 +299,7 @@ function ProjectSharePage() {
|
||||||
|
|
||||||
const openSharedFile = (key) => {
|
const openSharedFile = (key) => {
|
||||||
setSelectedFile(key)
|
setSelectedFile(key)
|
||||||
|
setSelectedNodeKey(key)
|
||||||
|
|
||||||
const parts = key.split('/')
|
const parts = key.split('/')
|
||||||
const allParentPaths = []
|
const allParentPaths = []
|
||||||
|
|
@ -346,7 +350,10 @@ function ProjectSharePage() {
|
||||||
window.open(exportProjectSharePDF(shareCode, selectedFile), '_blank')
|
window.open(exportProjectSharePDF(shareCode, selectedFile), '_blank')
|
||||||
}
|
}
|
||||||
|
|
||||||
const menuItems = useMemo(() => convertTreeToMenuItems(filteredTreeData), [filteredTreeData])
|
const menuItems = useMemo(
|
||||||
|
() => convertTreeToMenuItems(filteredTreeData),
|
||||||
|
[filteredTreeData, openKeys]
|
||||||
|
)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="preview-page">
|
<div className="preview-page">
|
||||||
|
|
@ -391,7 +398,7 @@ function ProjectSharePage() {
|
||||||
{menuItems.length > 0 ? (
|
{menuItems.length > 0 ? (
|
||||||
<Menu
|
<Menu
|
||||||
mode="inline"
|
mode="inline"
|
||||||
selectedKeys={[selectedFile]}
|
selectedKeys={selectedNodeKey ? [selectedNodeKey] : []}
|
||||||
openKeys={openKeys}
|
openKeys={openKeys}
|
||||||
onOpenChange={setOpenKeys}
|
onOpenChange={setOpenKeys}
|
||||||
items={menuItems}
|
items={menuItems}
|
||||||
|
|
@ -426,7 +433,7 @@ function ProjectSharePage() {
|
||||||
{menuItems.length > 0 ? (
|
{menuItems.length > 0 ? (
|
||||||
<Menu
|
<Menu
|
||||||
mode="inline"
|
mode="inline"
|
||||||
selectedKeys={[selectedFile]}
|
selectedKeys={selectedNodeKey ? [selectedNodeKey] : []}
|
||||||
openKeys={openKeys}
|
openKeys={openKeys}
|
||||||
onOpenChange={setOpenKeys}
|
onOpenChange={setOpenKeys}
|
||||||
items={menuItems}
|
items={menuItems}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import { useState, useEffect } from 'react'
|
import { useState, useEffect } from 'react'
|
||||||
import { useNavigate } from 'react-router-dom'
|
import { useNavigate } from 'react-router-dom'
|
||||||
import { Card, Empty, Modal, Form, Input, Row, Col, Space, Button, Switch, message, Select, Table, Tag, Pagination } from 'antd'
|
import { Card, Empty, Modal, Form, Input, Row, Col, Space, Button, Switch, message, Select, Table, Tag, Pagination } from 'antd'
|
||||||
import { PlusOutlined, FolderOutlined, TeamOutlined, EyeOutlined, CopyOutlined, DeleteOutlined, EditOutlined, FileOutlined, GithubOutlined, CheckOutlined, SwapOutlined } from '@ant-design/icons'
|
import { PlusOutlined, FolderOutlined, TeamOutlined, EyeOutlined, CopyOutlined, DeleteOutlined, EditOutlined, FileOutlined, GithubOutlined, CheckOutlined, SwapOutlined, SettingOutlined } from '@ant-design/icons'
|
||||||
import { getMyProjects, getOwnedProjects, getSharedProjects, createProject, deleteProject, updateProject, getProjectMembers, addProjectMember, removeProjectMember, getGitRepos, createGitRepo, updateGitRepo, deleteGitRepo, transferProject } from '@/api/project'
|
import { getMyProjects, getOwnedProjects, getSharedProjects, createProject, deleteProject, updateProject, getProjectMembers, addProjectMember, removeProjectMember, getGitRepos, createGitRepo, updateGitRepo, deleteGitRepo, transferProject } from '@/api/project'
|
||||||
import { getProjectShareInfo, updateProjectShareSettings } from '@/api/share'
|
import { getProjectShareInfo, updateProjectShareSettings } from '@/api/share'
|
||||||
import { getUserList } from '@/api/users'
|
import { getUserList } from '@/api/users'
|
||||||
|
|
@ -599,7 +599,7 @@ function ProjectList({ type = 'my' }) {
|
||||||
className="project-card"
|
className="project-card"
|
||||||
onClick={() => handleOpenProject(project.id)}
|
onClick={() => handleOpenProject(project.id)}
|
||||||
actions={type === 'my' ? [
|
actions={type === 'my' ? [
|
||||||
<EditOutlined key="edit" onClick={(e) => handleEdit(e, project)} />,
|
<SettingOutlined key="settings" onClick={(e) => handleEdit(e, project)} />,
|
||||||
<GithubOutlined key="git" onClick={(e) => handleGitSettings(e, project)} />,
|
<GithubOutlined key="git" onClick={(e) => handleGitSettings(e, project)} />,
|
||||||
<TeamOutlined key="members" onClick={(e) => handleMembers(e, project)} />,
|
<TeamOutlined key="members" onClick={(e) => handleMembers(e, project)} />,
|
||||||
] : [
|
] : [
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue