stevenfukase hace 4 años
padre
commit
5037174c9d

+ 8 - 15
packages/app/src/components/SearchPage/SearchResultList.tsx

@@ -1,40 +1,33 @@
 import React, { FC } from 'react';
 import React, { FC } from 'react';
 import SearchResultListItem from './SearchResultListItem';
 import SearchResultListItem from './SearchResultListItem';
-import { IPageHasId } from '../../interfaces/page';
 import PaginationWrapper from '../PaginationWrapper';
 import PaginationWrapper from '../PaginationWrapper';
+import { IPageSearchResultData } from '../../interfaces/search';
 
 
-// TOOD: retrieve bookmark count and add it to the following type
-export type ISearchedPage = IPageHasId & {
-  snippet: string,
-  elasticSearchResult: {
-    snippet: string,
-    matchedPath: string,
-  },
-};
 
 
 type Props = {
 type Props = {
-  pages: ISearchedPage[],
-  selectedPages: ISearchedPage[],
+  pages: IPageSearchResultData[],
+  selectedPages: IPageSearchResultData[],
   onClickInvoked?: (pageId: string) => void,
   onClickInvoked?: (pageId: string) => void,
   searchResultCount?: number,
   searchResultCount?: number,
   activePage?: number,
   activePage?: number,
   pagingLimit?: number,
   pagingLimit?: number,
   onPagingNumberChanged?: (activePage: number) => void,
   onPagingNumberChanged?: (activePage: number) => void,
-  focusedPage?: ISearchedPage,
+  focusedPage?: IPageSearchResultData,
 }
 }
 
 
 const SearchResultList: FC<Props> = (props:Props) => {
 const SearchResultList: FC<Props> = (props:Props) => {
+  console.log(props);
   const { focusedPage } = props;
   const { focusedPage } = props;
-  const focusedPageId = focusedPage != null && focusedPage._id != null ? focusedPage._id : '';
+  const focusedPageId = (focusedPage !== undefined && focusedPage.pageData !== undefined ? focusedPage.pageData._id : '';
   return (
   return (
     <>
     <>
       {props.pages.map((page) => {
       {props.pages.map((page) => {
         return (
         return (
           <SearchResultListItem
           <SearchResultListItem
-            key={page._id}
+            key={page.pageData._id}
             page={page}
             page={page}
             onClickInvoked={props.onClickInvoked}
             onClickInvoked={props.onClickInvoked}
-            isSelected={page._id === focusedPageId || false}
+            isSelected={page.pageData._id === focusedPageId || false}
           />
           />
         );
         );
       })}
       })}

+ 4 - 3
packages/app/src/components/SearchPage/SearchResultListItem.tsx

@@ -5,17 +5,18 @@ import Clamp from 'react-multiline-clamp';
 import { useTranslation } from 'react-i18next';
 import { useTranslation } from 'react-i18next';
 import { UserPicture, PageListMeta, PagePathLabel } from '@growi/ui';
 import { UserPicture, PageListMeta, PagePathLabel } from '@growi/ui';
 import { DevidedPagePath } from '@growi/core';
 import { DevidedPagePath } from '@growi/core';
-import { ISearchedPage } from './SearchResultList';
+import { IPageSearchResultData } from '../../interfaces/search';
+
 
 
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
 
 
 const logger = loggerFactory('growi:searchResultList');
 const logger = loggerFactory('growi:searchResultList');
 
 
 type PageItemControlProps = {
 type PageItemControlProps = {
-  page: ISearchedPage,
+  page: IPageSearchResultData,
 }
 }
 
 
-const PageItemControl: FC<PageItemControlProps> = (props: {page: ISearchedPage}) => {
+const PageItemControl: FC<PageItemControlProps> = (props: {page: IPageSearchResultData}) => {
 
 
   const { page } = props;
   const { page } = props;
   const { t } = useTranslation('');
   const { t } = useTranslation('');

+ 10 - 0
packages/app/src/interfaces/search.ts

@@ -1,5 +1,15 @@
+import { IPageHasId } from './page';
+
 export enum CheckboxType {
 export enum CheckboxType {
   NONE_CHECKED = 'noneChecked',
   NONE_CHECKED = 'noneChecked',
   INDETERMINATE = 'indeterminate',
   INDETERMINATE = 'indeterminate',
   ALL_CHECKED = 'allChecked',
   ALL_CHECKED = 'allChecked',
 }
 }
+
+export type IPageSearchResultData = {
+  pageData: IPageHasId,
+  pageMeta: {
+    bookmarkCount: number,
+    snippet: string,
+  },
+}

+ 21 - 22
packages/app/src/server/routes/search.js

@@ -152,35 +152,34 @@ module.exports = function(crowi, app) {
 
 
       const ids = esResult.data.map((page) => { return page._id });
       const ids = esResult.data.map((page) => { return page._id });
       const findResult = await Page.findListByPageIds(ids);
       const findResult = await Page.findListByPageIds(ids);
-      // add tags and elasticSearch data to page
-      findResult.pages.map((page) => {
-        const data = esResult.data.find((data) => {
-          return page.id === data._id;
-        });
-        page._doc.tags = data._source.tag_names;
-        page._doc.bookmarkCount = data._source.bookmark_count || 0;
-        page._doc.elasticSearchResult = data.elasticSearchResult;
-        return page;
-      });
 
 
-      findResult.pages.map((page) => {
+      // add tags data to page
+      findResult.pages.map((pageData) => {
         const data = esResult.data.find((data) => {
         const data = esResult.data.find((data) => {
-          return page.id === data._id;
+          return pageData.id === data._id;
         });
         });
-
-        page.bookmarkCount = data._source.bookmark_count || 0;
-        page.elasticSearchResult = data.elasticSearchResult;
-        return page;
+        pageData._doc.tags = data._source.tag_names;
+        return pageData;
       });
       });
-      console.log('findResult', findResult);
+
       result.meta = esResult.meta;
       result.meta = esResult.meta;
       result.totalCount = findResult.totalCount;
       result.totalCount = findResult.totalCount;
       result.data = findResult.pages
       result.data = findResult.pages
-        .map((page) => {
-          if (page.lastUpdateUser != null && page.lastUpdateUser instanceof User) {
-            page.lastUpdateUser = serializeUserSecurely(page.lastUpdateUser);
+        .map((pageData) => {
+          if (pageData.lastUpdateUser != null && pageData.lastUpdateUser instanceof User) {
+            pageData.lastUpdateUser = serializeUserSecurely(pageData.lastUpdateUser);
           }
           }
-          return page;
+
+          const data = esResult.data.find((data) => {
+            return pageData.id === data._id;
+          });
+
+          const pageMeta = {
+            bookmarkCount: data._source.bookmark_count || 0,
+            elasticSearchResult: data.elasticSearchResult,
+          };
+
+          return { pageData, pageMeta };
         })
         })
         .sort((page1, page2) => {
         .sort((page1, page2) => {
           // note: this do not consider NaN
           // note: this do not consider NaN
@@ -190,7 +189,7 @@ module.exports = function(crowi, app) {
     catch (err) {
     catch (err) {
       return res.json(ApiResponse.error(err));
       return res.json(ApiResponse.error(err));
     }
     }
-    console.log('result', result);
+    console.log(JSON.stringify(result, null, 2));
     return res.json(ApiResponse.success(result));
     return res.json(ApiResponse.success(result));
   };
   };