Explorar o código

:sparkles: 被删除的文章如果含有目录,显示删除线

visuddhinanda %!s(int64=3) %!d(string=hai) anos
pai
achega
791830085b

+ 1 - 0
dashboard/src/components/anthology/AnthologyTocTree.tsx

@@ -26,6 +26,7 @@ const Widget = ({ anthologyId, onSelect, onArticleSelect }: IWidget) => {
             key: item.article_id ? item.article_id : item.title,
             key: item.article_id ? item.article_id : item.title,
             title: item.title,
             title: item.title,
             level: item.level,
             level: item.level,
+            deletedAt: item.deleted_at,
           };
           };
         });
         });
         setTocData(toc);
         setTocData(toc);

+ 1 - 0
dashboard/src/components/anthology/EditableTocTree.tsx

@@ -27,6 +27,7 @@ const Widget = ({ anthologyId, onSelect }: IWidget) => {
             key: item.article_id ? item.article_id : item.title,
             key: item.article_id ? item.article_id : item.title,
             title: item.title,
             title: item.title,
             level: item.level,
             level: item.level,
+            deletedAt: item.deleted_at,
           };
           };
         });
         });
         setTocData(toc);
         setTocData(toc);

+ 1 - 0
dashboard/src/components/api/Article.ts

@@ -128,6 +128,7 @@ export interface IArticleMapRequest {
   level: number;
   level: number;
   title: string;
   title: string;
   children?: number;
   children?: number;
+  deleted_at?: string;
 }
 }
 export interface IArticleMapListResponse {
 export interface IArticleMapListResponse {
   ok: boolean;
   ok: boolean;

+ 15 - 1
dashboard/src/components/article/EditableTree.tsx

@@ -1,6 +1,6 @@
 import React, { useState } from "react";
 import React, { useState } from "react";
 import { useEffect } from "react";
 import { useEffect } from "react";
-import { Tree } from "antd";
+import { Tree, Typography } from "antd";
 import type { DataNode, TreeProps } from "antd/es/tree";
 import type { DataNode, TreeProps } from "antd/es/tree";
 import { Key } from "antd/lib/table/interface";
 import { Key } from "antd/lib/table/interface";
 import {
 import {
@@ -11,10 +11,13 @@ import {
 import { Button, Divider, Space } from "antd";
 import { Button, Divider, Space } from "antd";
 import { useIntl } from "react-intl";
 import { useIntl } from "react-intl";
 
 
+const { Text } = Typography;
+
 interface TreeNodeData {
 interface TreeNodeData {
   key: string;
   key: string;
   title: string | React.ReactNode;
   title: string | React.ReactNode;
   children: TreeNodeData[];
   children: TreeNodeData[];
+  deletedAt?: string;
   level: number;
   level: number;
 }
 }
 export type ListNodeData = {
 export type ListNodeData = {
@@ -22,6 +25,7 @@ export type ListNodeData = {
   title: string | React.ReactNode;
   title: string | React.ReactNode;
   level: number;
   level: number;
   children?: number;
   children?: number;
+  deletedAt?: string;
 };
 };
 
 
 var tocActivePath: TreeNodeData[] = [];
 var tocActivePath: TreeNodeData[] = [];
@@ -47,6 +51,7 @@ function tocGetTreeData(articles: ListNodeData[], active = "") {
       title: element.title,
       title: element.title,
       children: [],
       children: [],
       level: element.level,
       level: element.level,
+      deletedAt: element.deletedAt,
     };
     };
     /*
     /*
 		if (active == element.article) {
 		if (active == element.article) {
@@ -283,6 +288,15 @@ const Widget = ({
           }
           }
         }}
         }}
         treeData={gData}
         treeData={gData}
+        titleRender={(node: TreeNodeData) => {
+          return node.deletedAt ? (
+            <Text delete disabled>
+              {node.title}
+            </Text>
+          ) : (
+            <>{node.title}</>
+          );
+        }}
       />
       />
     </>
     </>
   );
   );

+ 22 - 10
dashboard/src/components/article/TocTree.tsx

@@ -1,15 +1,18 @@
-import { Tree } from "antd";
-
-import type { DataNode, TreeProps } from "antd/es/tree";
+import { Tree, Typography } from "antd";
+import type { TreeProps } from "antd/es/tree";
 import { useEffect, useState } from "react";
 import { useEffect, useState } from "react";
+
 import type { ListNodeData } from "./EditableTree";
 import type { ListNodeData } from "./EditableTree";
 import PaliText from "../template/Wbw/PaliText";
 import PaliText from "../template/Wbw/PaliText";
 
 
-interface TreeNodeData {
+const { Text } = Typography;
+
+export interface TreeNodeData {
   key: string;
   key: string;
   title: string | React.ReactNode;
   title: string | React.ReactNode;
   children?: TreeNodeData[];
   children?: TreeNodeData[];
   level: number;
   level: number;
+  deletedAt?: string;
 }
 }
 
 
 function tocGetTreeData(
 function tocGetTreeData(
@@ -36,6 +39,7 @@ function tocGetTreeData(
       key: element.key,
       key: element.key,
       title: element.title,
       title: element.title,
       level: element.level,
       level: element.level,
+      deletedAt: element.deletedAt,
     };
     };
 
 
     if (newNode.level > iCurrLevel) {
     if (newNode.level > iCurrLevel) {
@@ -119,12 +123,20 @@ const Widget = ({ treeData, expandedKey, onSelect }: IWidgetTocTree) => {
       defaultExpandedKeys={expanded}
       defaultExpandedKeys={expanded}
       defaultSelectedKeys={expanded}
       defaultSelectedKeys={expanded}
       blockNode
       blockNode
-      titleRender={(node: DataNode) => {
-        if (typeof node.title === "string") {
-          return <PaliText text={node.title} />;
-        } else {
-          return <>{node.title}</>;
-        }
+      titleRender={(node: TreeNodeData) => {
+        const currNode =
+          typeof node.title === "string" ? (
+            <PaliText text={node.title} />
+          ) : (
+            <>{node.title}</>
+          );
+        return node.deletedAt ? (
+          <Text delete disabled>
+            {currNode}
+          </Text>
+        ) : (
+          <>{currNode}</>
+        );
       }}
       }}
     />
     />
   );
   );