This commit is contained in:
ditiqi 2025-02-27 22:06:26 +08:00
parent 49d3f613fc
commit e6e2050ce1
3 changed files with 60 additions and 54 deletions

View File

@ -1,4 +1,4 @@
import { Input, Layout, Avatar, Button, Dropdown } from "antd";
import { Input, Button } from "antd";
import {
EditFilled,
PlusOutlined,
@ -10,7 +10,6 @@ import { useNavigate, useParams, useSearchParams } from "react-router-dom";
import { UserMenu } from "./UserMenu/UserMenu";
import { NavigationMenu } from "./NavigationMenu";
import { useMainContext } from "./MainProvider";
import { Header } from "antd/es/layout/layout";
export function MainHeader() {
const { isAuthenticated, user } = useAuth();

View File

@ -3,12 +3,11 @@ import NodeMenu from "./NodeMenu";
import { api, usePost } from "@nice/client";
import {
ObjectType,
PathDto,
postDetailSelect,
PostDto,
PostType,
Prisma,
RolePerms,
Taxonomy,
} from "@nice/common";
import TermSelect from "../../models/term/term-select";
import DepartmentSelect from "../../models/department/department-select";
@ -19,45 +18,12 @@ import MindElixir from "mind-elixir";
import { useTusUpload } from "@web/src/hooks/useTusUpload";
import { useNavigate } from "react-router-dom";
import { useAuth } from "@web/src/providers/auth-provider";
const MIND_OPTIONS = {
direction: MindElixir.SIDE,
draggable: true,
contextMenu: true,
toolBar: true,
nodeMenu: true,
keypress: true,
locale: "zh_CN" as const,
theme: {
name: "Latte",
palette: [
"#dd7878",
"#ea76cb",
"#8839ef",
"#e64553",
"#fe640b",
"#df8e1d",
"#40a02b",
"#209fb5",
"#1e66f5",
"#7287fd",
],
cssVar: {
"--main-color": "#444446",
"--main-bgcolor": "#ffffff",
"--color": "#777777",
"--bgcolor": "#f6f6f6",
"--panel-color": "#444446",
"--panel-bgcolor": "#ffffff",
"--panel-border-color": "#eaeaea",
},
},
};
import { MIND_OPTIONS } from "./constant";
export default function MindEditor({ id }: { id?: string }) {
const containerRef = useRef<HTMLDivElement>(null);
const [instance, setInstance] = useState<MindElixirInstance | null>(null);
const { isAuthenticated, user, hasSomePermissions } = useAuth();
const { data: post, isLoading }: { data: PostDto; isLoading: boolean } =
const { data: post, isLoading }: { data: PathDto; isLoading: boolean } =
api.post.findFirst.useQuery({
where: {
id,
@ -66,9 +32,9 @@ export default function MindEditor({ id }: { id?: string }) {
});
const canEdit: boolean = useMemo(() => {
//登录了且是作者、超管、无id新建模式
const isAuth = isAuthenticated && user?.id == post?.author.id
return !Boolean(id) || isAuth || hasSomePermissions(RolePerms.MANAGE_ANY_POST);
}, [user])
const isAuth = isAuthenticated && user?.id === post?.author?.id;
return !!id || isAuth || hasSomePermissions(RolePerms.MANAGE_ANY_POST);
}, [user]);
const navigate = useNavigate();
const { create, update } = usePost();
const { data: taxonomies } = api.taxonomy.getAll.useQuery({
@ -91,16 +57,15 @@ export default function MindEditor({ id }: { id?: string }) {
form.setFieldsValue(formData);
}
}, [post, form, instance, id]);
useEffect(() => {
if (!containerRef.current) return;
const mind = new MindElixir({
...MIND_OPTIONS,
el: containerRef.current,
before:{
beginEdit(){
return canEdit
}
before: {
beginEdit() {
return canEdit;
},
},
draggable: canEdit, // 禁用拖拽
contextMenu: canEdit, // 禁用右键菜单
@ -116,7 +81,9 @@ export default function MindEditor({ id }: { id?: string }) {
if ((!id || post) && instance) {
containerRef.current.hidden = false;
instance.toCenter();
instance.refresh((post as any)?.meta);
if (post?.meta?.nodeData) {
instance.refresh(post?.meta);
}
}
}, [id, post, instance]);
const handleSave = async () => {
@ -178,16 +145,14 @@ export default function MindEditor({ id }: { id?: string }) {
}
console.log(result);
},
(error) => { },
(error) => {},
`mind-thumb-${new Date().toString()}`
);
};
return (
<div className="grid grid-cols-1 flex-col w-[90vw] my-5 h-[90vh] border rounded-lg mx-auto">
{canEdit && taxonomies && (
<Form
form={form}
className=" bg-white p-4 ">
<Form form={form} className=" bg-white p-4 ">
<div className="flex items-center justify-between gap-4">
<div className="flex items-center gap-4">
{taxonomies.map((tax, index) => (
@ -214,13 +179,21 @@ export default function MindEditor({ id }: { id?: string }) {
/>
</Form.Item>
</div>
<Button ghost type="primary" onSubmit={(e) => e.preventDefault()} onClick={handleSave}>
<Button
ghost
type="primary"
onSubmit={(e) => e.preventDefault()}
onClick={handleSave}>
{id ? "更新" : "保存"}
</Button>
</div>
</Form>
)}
<div ref={containerRef} className="mind-editor" onContextMenu={(e)=>e.preventDefault()} />
<div
ref={containerRef}
className="mind-editor"
onContextMenu={(e) => e.preventDefault()}
/>
{canEdit && instance && <NodeMenu mind={instance} />}
{isLoading && (
<div

View File

@ -0,0 +1,34 @@
import MindElixir from "mind-elixir";
export const MIND_OPTIONS = {
direction: MindElixir.SIDE,
draggable: true,
contextMenu: true,
toolBar: true,
nodeMenu: true,
keypress: true,
locale: "zh_CN" as const,
theme: {
name: "Latte",
palette: [
"#dd7878",
"#ea76cb",
"#8839ef",
"#e64553",
"#fe640b",
"#df8e1d",
"#40a02b",
"#209fb5",
"#1e66f5",
"#7287fd",
],
cssVar: {
"--main-color": "#444446",
"--main-bgcolor": "#ffffff",
"--color": "#777777",
"--bgcolor": "#f6f6f6",
"--panel-color": "#444446",
"--panel-bgcolor": "#ffffff",
"--panel-border-color": "#eaeaea",
},
},
};