Просмотр исходного кода

Merge pull request #1448 from visuddhinanda/agile

wbw 点击弹窗外面,弹窗不消失
visuddhinanda 2 лет назад
Родитель
Сommit
0a411673fc

+ 2 - 1
clients/php/composer.json

@@ -1,7 +1,8 @@
 {
   "require": {
     "grpc/grpc": "v1.57.0",
-    "google/protobuf": "v3.23.2"
+    "google/protobuf": "v3.23.2",
+    "erusev/parsedown": "^1.7"
   },
   "autoload": {
     "psr-4": {

+ 2 - 1
clients/php/morus-server.php

@@ -11,7 +11,8 @@ class Greeter extends \Mint\Morus\V1\MarkdownStub
         $text = $request->getPayload();
         echo 'Received request: ' . $text . PHP_EOL;
         $response = new \Mint\Morus\V1\MarkdownToHtmlResponse();
-        $response->setPayload("Hello <h1>" . $text . "</h1>");
+        $Parsedown = new Parsedown();
+        $response->setPayload($Parsedown->text($text));
         return $response;
     }
 }

+ 34 - 11
dashboard/src/components/template/Wbw/WbwPali.tsx

@@ -20,24 +20,36 @@ import { lookup } from "../../../reducers/command";
 import { useAppSelector } from "../../../hooks";
 import { add, relationAddParam } from "../../../reducers/relation-add";
 import { ArticleMode } from "../../article/Article";
+import { anchor, showWbw } from "../../../reducers/wbw";
 
 const { Paragraph } = Typography;
 interface IWidget {
   data: IWbw;
+  channelId: string;
   display?: TWbwDisplayMode;
   mode?: ArticleMode;
   onSave?: Function;
 }
-const WbwPaliWidget = ({ data, mode, display, onSave }: IWidget) => {
+const WbwPaliWidget = ({ data, channelId, mode, display, onSave }: IWidget) => {
   const [popOpen, setPopOpen] = useState(false);
   const [paliColor, setPaliColor] = useState("unset");
   const [hasComment, setHasComment] = useState(data.hasComment);
   const divShell = useRef<HTMLDivElement>(null);
+  const wbwAnchor = useAppSelector(anchor);
+  const addParam = useAppSelector(relationAddParam);
+  const wordSn = `${data.book}-${data.para}-${data.sn.join("-")}`;
+  useEffect(() => {
+    if (wbwAnchor) {
+      if (wbwAnchor.id !== wordSn || wbwAnchor.channel !== channelId) {
+        popOpenChange(false);
+      }
+    }
+  }, [channelId, wbwAnchor, wordSn]);
+
   /**
    * 处理 relation 链接事件
    * 高亮可能的单词
    */
-  const addParam = useAppSelector(relationAddParam);
   useEffect(() => {
     let grammar = data.case?.value
       ?.replace("#", "$")
@@ -120,7 +132,7 @@ const WbwPaliWidget = ({ data, mode, display, onSave }: IWidget) => {
     data.sn,
   ]);
 
-  const handleClickChange = (open: boolean) => {
+  const popOpenChange = (open: boolean) => {
     if (open) {
       setPaliColor("lightblue");
     } else {
@@ -295,15 +307,26 @@ const WbwPaliWidget = ({ data, mode, display, onSave }: IWidget) => {
             placement={toDivRight > 200 ? "bottom" : "bottomRight"}
             trigger="click"
             open={popOpen}
-            onOpenChange={handleClickChange}
           >
-            {mode === "wbw" ? (
-              paliWord
-            ) : (
-              <span className="edit_icon">
-                <EditOutlined style={{ cursor: "pointer" }} />
-              </span>
-            )}
+            <span
+              onClick={() => {
+                popOpenChange(true);
+                store.dispatch(
+                  showWbw({
+                    id: wordSn,
+                    channel: channelId,
+                  })
+                );
+              }}
+            >
+              {mode === "wbw" ? (
+                paliWord
+              ) : (
+                <span className="edit_icon">
+                  <EditOutlined style={{ cursor: "pointer" }} />
+                </span>
+              )}
+            </span>
           </Popover>
         </span>
         <Space>

+ 4 - 1
dashboard/src/components/template/Wbw/WbwWord.tsx

@@ -101,6 +101,7 @@ export interface IWbwFields {
 export type TWbwDisplayMode = "block" | "inline" | "list";
 interface IWidget {
   data: IWbw;
+  channelId: string;
   display?: TWbwDisplayMode;
   fields?: IWbwFields;
   mode?: ArticleMode;
@@ -110,7 +111,8 @@ interface IWidget {
 }
 const WbwWordWidget = ({
   data,
-  display = "block",
+  channelId,
+  display,
   mode = "edit",
   fields = {
     real: false,
@@ -237,6 +239,7 @@ const WbwWordWidget = ({
         <WbwPali
           key="pali"
           data={wordData}
+          channelId={channelId}
           mode={mode}
           display={display}
           onSave={(e: IWbw, isPublish: boolean) => {

+ 1 - 0
dashboard/src/components/template/WbwSent.tsx

@@ -425,6 +425,7 @@ export const WbwSentCtl = ({
     return (
       <WbwWord
         data={item}
+        channelId={channelId}
         key={id}
         mode={displayMode}
         display={wbwMode}

+ 35 - 0
dashboard/src/reducers/wbw.ts

@@ -0,0 +1,35 @@
+/**
+ * 查字典,添加术语命令
+ */
+import { createSlice, PayloadAction } from "@reduxjs/toolkit";
+
+import type { RootState } from "../store";
+
+export interface ITermCommand {}
+
+export interface IShowWbw {
+  id?: string;
+  channel?: string;
+}
+
+interface IState {
+  anchor?: IShowWbw;
+}
+
+const initialState: IState = {};
+
+export const slice = createSlice({
+  name: "wbw",
+  initialState,
+  reducers: {
+    showWbw: (state, action: PayloadAction<IShowWbw>) => {
+      state.anchor = action.payload;
+    },
+  },
+});
+
+export const { showWbw } = slice.actions;
+
+export const anchor = (state: RootState): IShowWbw | undefined =>
+  state.wbw.anchor;
+export default slice.reducer;

+ 2 - 0
dashboard/src/store.ts

@@ -23,6 +23,7 @@ import rightPanelReducer from "./reducers/right-panel";
 import sentWordsReducer from "./reducers/sent-word";
 import netStatusReducer from "./reducers/net-status";
 import discussionReducer from "./reducers/discussion";
+import wbwReducer from "./reducers/wbw";
 
 const store = configureStore({
   reducer: {
@@ -49,6 +50,7 @@ const store = configureStore({
     sentWords: sentWordsReducer,
     netStatus: netStatusReducer,
     discussion: discussionReducer,
+    wbw: wbwReducer,
   },
 });