Browse Source

Merge pull request #1781 from visuddhinanda/agile

只有title的时候不显示链接
visuddhinanda 2 years ago
parent
commit
499866d6ce

+ 24 - 4
dashboard/src/components/article/TypePage.tsx

@@ -5,11 +5,14 @@ import { IPageNavData, IPageNavResponse } from "../api/Article";
 
 import { ArticleMode, ArticleType } from "./Article";
 import "./article.css";
-import { message } from "antd";
+import { Alert, message } from "antd";
 
 import { bookName } from "../fts/book_name";
 import TypePali from "./TypePali";
 import NavigateButton from "./NavigateButton";
+import ArticleSkeleton from "./ArticleSkeleton";
+import ErrorResult from "../general/ErrorResult";
+import { useIntl } from "react-intl";
 
 interface IParam {
   articleId?: string;
@@ -48,6 +51,10 @@ const TypeTermWidget = ({
 
   const [paramPali, setParamPali] = useState<IParam>();
   const [nav, setNav] = useState<IPageNavData>();
+  const [errorCode, setErrorCode] = useState<number>();
+  const [errorMessage, setErrorMessage] = useState<string>();
+  const [pageInfo, setPageInfo] = useState<string>();
+  const intl = useIntl();
 
   useEffect(() => {
     if (typeof articleId === "undefined") {
@@ -66,7 +73,13 @@ const TypeTermWidget = ({
     const url = `/v2/nav-page/${pageParam[0].toUpperCase()}-${booksId}-${
       pageParam[2]
     }-${pageParam[3]}`;
-
+    setPageInfo(
+      `版本:` +
+        intl.formatMessage({
+          id: `labels.page.number.type.` + pageParam[0].toUpperCase(),
+        }) +
+        ` 书名:${pageParam[1]} 卷号:${pageParam[2]} 页码:${pageParam[3]}`
+    );
     console.log("url", url);
     get<IPageNavResponse>(url)
       .then((json) => {
@@ -93,11 +106,16 @@ const TypeTermWidget = ({
       .finally(() => {})
       .catch((e) => {
         console.error(e);
+        setErrorCode(e);
+        if (e === 404) {
+          setErrorMessage(`该页面不存在。页面信息:${pageInfo}`);
+        }
       });
-  }, [articleId, channelId, mode]);
+  }, [articleId, channelId, intl, mode, pageInfo]);
 
   return (
     <div>
+      {pageInfo ? <Alert message={pageInfo} type="info" closable /> : undefined}
       {paramPali ? (
         <>
           <TypePali
@@ -145,8 +163,10 @@ const TypeTermWidget = ({
             }}
           />
         </>
+      ) : errorCode ? (
+        <ErrorResult code={errorCode} message={errorMessage} />
       ) : (
-        <>loading</>
+        <ArticleSkeleton />
       )}
     </div>
   );

+ 1 - 1
dashboard/src/components/general/ErrorResult.tsx

@@ -35,7 +35,7 @@ const ErrorResultWidget = ({ code, message }: IWidget) => {
     <Result
       status={strStatus}
       title={strTitle}
-      subTitle="Sorry, something went wrong."
+      subTitle={message ? message : "Sorry, something went wrong."}
     />
   );
 };

+ 8 - 3
dashboard/src/components/template/Article.tsx

@@ -15,6 +15,7 @@ interface IWidgetChapterCtl {
   title?: React.ReactNode;
   focus?: string | null;
   style?: TDisplayStyle;
+  modalExtra?: React.ReactNode;
 }
 
 export const ArticleCtl = ({
@@ -24,6 +25,7 @@ export const ArticleCtl = ({
   title,
   focus,
   style = "modal",
+  modalExtra,
 }: IWidgetChapterCtl) => {
   const [isModalOpen, setIsModalOpen] = useState(false);
   const showModal = () => {
@@ -81,9 +83,12 @@ export const ArticleCtl = ({
                 }}
               >
                 <Text>{aTitle}</Text>
-                <Link to={articleLink} target="_blank">
-                  {"新窗口打开"}
-                </Link>
+                <Text>
+                  {modalExtra}
+                  <Link to={articleLink} target="_blank">
+                    {"新窗口打开"}
+                  </Link>
+                </Text>
               </div>
             }
             open={isModalOpen}

+ 49 - 22
dashboard/src/components/template/QuoteLink.tsx

@@ -1,13 +1,16 @@
-import { bookName as _bookName } from "../fts/book_name";
+import { Typography } from "antd";
+
 import { ArticleCtl, TDisplayStyle } from "./Article";
 import { IWidgetTermCtl, TermCtl } from "./Term";
+import { useEffect, useState } from "react";
+
+const { Text } = Typography;
 
 interface IWidgetQuoteLinkCtl {
   type: string;
-  bookName: string;
-  bookNameLocal?: string;
-  volume: string;
-  page: string;
+  bookName?: string;
+  volume?: number;
+  page?: number;
   style: TDisplayStyle;
   book?: number;
   para?: number;
@@ -17,7 +20,6 @@ interface IWidgetQuoteLinkCtl {
 const QuoteLinkCtl = ({
   type,
   bookName,
-  bookNameLocal,
   volume,
   page,
   style,
@@ -26,26 +28,51 @@ const QuoteLinkCtl = ({
   term,
   title,
 }: IWidgetQuoteLinkCtl) => {
+  const [validPage, setValidPage] = useState(false);
+  const [tpl, setTpl] = useState<string>();
   let textShow = ` ${volume}.${page}`;
 
+  useEffect(() => {
+    if (
+      typeof type !== "undefined" &&
+      typeof bookName !== "undefined" &&
+      typeof volume !== "undefined" &&
+      typeof page !== "undefined"
+    ) {
+      setValidPage(true);
+      setTpl(
+        `{{ql|type=${type}|bookname=${bookName}|volume=${volume}|page=${page}}}`
+      );
+    }
+  }, [bookName, page, type, volume]);
+
   return (
     <>
-      <ArticleCtl
-        title={
-          title ? (
-            title
-          ) : (
-            <>
-              <TermCtl {...term} compact={true} />
-              {textShow}
-            </>
-          )
-        }
-        type={"page"}
-        focus={book && para ? `${book}-${para}` : undefined}
-        id={`${type}_${bookName}_${volume}_${page}`}
-        style={style}
-      />
+      {validPage ? (
+        <ArticleCtl
+          title={
+            title ? (
+              title
+            ) : (
+              <>
+                <TermCtl {...term} compact={true} />
+                {textShow}
+              </>
+            )
+          }
+          type={"page"}
+          focus={book && para ? `${book}-${para}` : undefined}
+          id={`${type}_${bookName}_${volume}_${page}`}
+          style={style}
+          modalExtra={
+            <Text style={{ marginRight: 8 }} copyable={{ text: tpl }}>
+              复制模版
+            </Text>
+          }
+        />
+      ) : (
+        <Text>{title}</Text>
+      )}
     </>
   );
 };

+ 5 - 5
dashboard/src/locales/zh-Hans/label.ts

@@ -19,11 +19,11 @@ const items = {
   "labels.recent-scan": "最近打开",
   "labels.icp": "ICP:",
   "labels.no.login": "尚未登录",
-  "labels.page.number.type.M": "缅文版",
-  "labels.page.number.type.T": "泰文版",
-  "labels.page.number.type.P": "PTS版",
-  "labels.page.number.type.V": "印度内观中心版",
-  "labels.page.number.type.O": "其他",
+  "labels.page.number.type.M": "缅文版页码",
+  "labels.page.number.type.T": "泰文版页码",
+  "labels.page.number.type.P": "PTS版页码",
+  "labels.page.number.type.V": "印度内观中心版页码",
+  "labels.page.number.type.O": "其他页码",
   "labels.page.number.type.para": "缅文段落",
   "labels.curr.paragraph.only": "仅显示此段",
   "labels.curr.paragraph.open": "在新标签页打开",