Browse Source

:art: 搜索定位

Vanessa 2 years ago
parent
commit
860ea7442a
4 changed files with 18 additions and 13 deletions
  1. 1 0
      app/src/constants.ts
  2. 1 1
      app/src/protyle/util/onGet.ts
  3. 8 6
      app/src/search/index.ts
  4. 8 6
      app/src/search/spread.ts

+ 1 - 0
app/src/constants.ts

@@ -52,6 +52,7 @@ export abstract class Constants {
     public static readonly CB_GET_UNUNDO = "cb-get-unundo"; // 不需要记录历史
     public static readonly CB_GET_SCROLL = "cb-get-scroll"; // 滚动到指定位置
     public static readonly CB_GET_CONTEXT = "cb-get-context"; // 包含上下文
+    public static readonly CB_GET_HTML = "cb-get-html"; // 直接渲染,不需要再 /api/block/getDocInfo,否则搜索表格无法定位
 
     // localstorage
     public static readonly LOCAL_SEARCHEDATA = "local-searchedata";

+ 1 - 1
app/src/protyle/util/onGet.ts

@@ -77,7 +77,7 @@ export const onGet = (data: IWebSocketData, protyle: IProtyle, action: string[]
     }
 
     // 防止动态加载加载过多的内容
-    if (action.includes(Constants.CB_GET_APPEND) || action.includes(Constants.CB_GET_BEFORE)) {
+    if (action.includes(Constants.CB_GET_APPEND) || action.includes(Constants.CB_GET_BEFORE) || action.includes(Constants.CB_GET_HTML)) {
         setHTML({
             content: html,
             action,

+ 8 - 6
app/src/search/index.ts

@@ -187,7 +187,7 @@ export class Search extends Model {
                     mode: foldResponse.data ? 0 : 3,
                     size: foldResponse.data ? Constants.SIZE_GET_MAX : Constants.SIZE_GET,
                 }, getResponse => {
-                    onGet(getResponse, this.protyle.protyle, foldResponse.data ? [Constants.CB_GET_ALL] : [Constants.CB_GET_HL]);
+                    onGet(getResponse, this.protyle.protyle, foldResponse.data ? [Constants.CB_GET_ALL, Constants.CB_GET_HTML] : [Constants.CB_GET_HL, Constants.CB_GET_HTML]);
                     const matchElement = this.protyle.protyle.wysiwyg.element.querySelector(`div[data-node-id="${id}"] span[data-type="search-mark"]`);
                     if (matchElement) {
                         matchElement.scrollIntoView();
@@ -196,17 +196,19 @@ export class Search extends Model {
             } else {
                 this.protyle = new Protyle(this.element.querySelector("#searchPreview") as HTMLElement, {
                     blockId: id,
-                    action: foldResponse.data ? [Constants.CB_GET_HL, Constants.CB_GET_ALL] : [Constants.CB_GET_HL, Constants.CB_GET_CONTEXT],
+                    action: foldResponse.data ? [Constants.CB_GET_HL, Constants.CB_GET_ALL, Constants.CB_GET_HTML] : [Constants.CB_GET_HL, Constants.CB_GET_CONTEXT, Constants.CB_GET_HTML],
                     key: value,
                     render: {
                         gutter: true,
                         breadcrumbDocName: true,
                     },
                     after: () => {
-                        const matchElement = this.protyle.protyle.wysiwyg.element.querySelector(`div[data-node-id="${id}"] span[data-type="search-mark"]`);
-                        if (matchElement) {
-                            matchElement.scrollIntoView();
-                        }
+                        setTimeout(() => {
+                            const matchElement = this.protyle.protyle.wysiwyg.element.querySelector(`div[data-node-id="${id}"] span[data-type="search-mark"]`);
+                            if (matchElement) {
+                                matchElement.scrollIntoView();
+                            }
+                        }, Constants.TIMEOUT_SEARCH);
                     }
                 });
             }

+ 8 - 6
app/src/search/spread.ts

@@ -643,17 +643,19 @@ const getArticle = (options: {
         if (!protyle) {
             protyle = new Protyle(options.dialog.element.querySelector("#searchPreview") as HTMLElement, {
                 blockId: options.id,
-                action: foldResponse.data ? [Constants.CB_GET_HL, Constants.CB_GET_ALL] : [Constants.CB_GET_HL, Constants.CB_GET_CONTEXT],
+                action: foldResponse.data ? [Constants.CB_GET_HL, Constants.CB_GET_ALL, Constants.CB_GET_HTML] : [Constants.CB_GET_HL, Constants.CB_GET_CONTEXT, Constants.CB_GET_HTML],
                 key: options.k,
                 render: {
                     gutter: true,
                     breadcrumbDocName: true
                 },
                 after: () => {
-                    const matchElement = protyle.protyle.wysiwyg.element.querySelector(`div[data-node-id="${options.id}"] span[data-type="search-mark"]`);
-                    if (matchElement) {
-                        matchElement.scrollIntoView();
-                    }
+                    setTimeout(() => {
+                        const matchElement = protyle.protyle.wysiwyg.element.querySelector(`div[data-node-id="${options.id}"] span[data-type="search-mark"]`);
+                        if (matchElement) {
+                            matchElement.scrollIntoView();
+                        }
+                    }, Constants.TIMEOUT_SEARCH);
                 }
             });
         } else {
@@ -665,7 +667,7 @@ const getArticle = (options: {
                 mode: foldResponse.data ? 0 : 3,
                 size: foldResponse.data ? Constants.SIZE_GET_MAX : Constants.SIZE_GET,
             }, getResponse => {
-                onGet(getResponse, protyle.protyle, foldResponse.data ? [Constants.CB_GET_ALL] : [Constants.CB_GET_HL]);
+                onGet(getResponse, protyle.protyle, foldResponse.data ? [Constants.CB_GET_ALL, Constants.CB_GET_HTML] : [Constants.CB_GET_HL, Constants.CB_GET_HTML]);
                 const matchElement = protyle.protyle.wysiwyg.element.querySelector(`div[data-node-id="${options.id}"] span[data-type="search-mark"]`);
                 if (matchElement) {
                     matchElement.scrollIntoView();