EditableTreeNode.tsx 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { Button, message, Space, Typography } from "antd";
  2. import { useState } from "react";
  3. import { PlusOutlined } from "@ant-design/icons";
  4. import type { TreeNodeData } from "./EditableTree"
  5. const { Text } = Typography;
  6. interface IWidget {
  7. node: TreeNodeData;
  8. onAdd?: Function;
  9. onTitleClick?: Function;
  10. }
  11. const EditableTreeNodeWidget = ({ node, onAdd, onTitleClick }: IWidget) => {
  12. const [showNodeMenu, setShowNodeMenu] = useState(false);
  13. const [loading, setLoading] = useState(false);
  14. const title = (
  15. <Text type={node.status === 10 ? "secondary" : undefined}>
  16. {node.title_text ? node.title_text : node.title}
  17. </Text>
  18. );
  19. const TitleText = () =>
  20. node.deletedAt ? (
  21. <Text delete disabled>
  22. {title}
  23. </Text>
  24. ) : (
  25. <Text
  26. onClick={(e: React.MouseEvent<HTMLElement, MouseEvent>) => {
  27. if (typeof onTitleClick !== "undefined") {
  28. onTitleClick(e);
  29. }
  30. }}
  31. >
  32. {title}
  33. </Text>
  34. );
  35. const Menu = () => (
  36. <Space style={{ visibility: showNodeMenu ? "visible" : "hidden" }}>
  37. <Button
  38. loading={loading}
  39. size="middle"
  40. icon={<PlusOutlined />}
  41. type="text"
  42. onClick={async () => {
  43. if (typeof onAdd !== "undefined") {
  44. setLoading(true);
  45. const ok = await onAdd();
  46. setLoading(false);
  47. if (!ok) {
  48. message.error("error");
  49. }
  50. }
  51. }}
  52. />
  53. </Space>
  54. );
  55. return (
  56. <Space
  57. onMouseEnter={() => setShowNodeMenu(true)}
  58. onMouseLeave={() => setShowNodeMenu(false)}
  59. >
  60. <TitleText />
  61. <Menu />
  62. </Space>
  63. );
  64. };
  65. export default EditableTreeNodeWidget;