|
|
@@ -9,14 +9,15 @@ import { IPageSearchResultData } from '../../interfaces/search';
|
|
|
|
|
|
|
|
|
import loggerFactory from '~/utils/logger';
|
|
|
+import { IPageHasId } from '~/interfaces/page';
|
|
|
|
|
|
const logger = loggerFactory('growi:searchResultList');
|
|
|
|
|
|
type PageItemControlProps = {
|
|
|
- page: IPageSearchResultData,
|
|
|
+ page: IPageHasId,
|
|
|
}
|
|
|
|
|
|
-const PageItemControl: FC<PageItemControlProps> = (props: {page: IPageSearchResultData}) => {
|
|
|
+const PageItemControl: FC<PageItemControlProps> = (props: {page: IPageHasId}) => {
|
|
|
|
|
|
const { page } = props;
|
|
|
const { t } = useTranslation('');
|
|
|
@@ -68,19 +69,19 @@ const PageItemControl: FC<PageItemControlProps> = (props: {page: IPageSearchResu
|
|
|
};
|
|
|
|
|
|
type Props = {
|
|
|
- page: ISearchedPage,
|
|
|
+ page: IPageSearchResultData,
|
|
|
isSelected: boolean,
|
|
|
onClickInvoked?: (pageId: string) => void,
|
|
|
}
|
|
|
|
|
|
const SearchResultListItem: FC<Props> = (props:Props) => {
|
|
|
- const { page, isSelected } = props;
|
|
|
+ const { page: { pageData, pageMeta }, isSelected } = props;
|
|
|
|
|
|
// Add prefix 'id_' in pageId, because scrollspy of bootstrap doesn't work when the first letter of id attr of target component is numeral.
|
|
|
- const pageId = `#${page._id}`;
|
|
|
+ const pageId = `#${pageData._id}`;
|
|
|
|
|
|
- const dPagePath = new DevidedPagePath(page.path, false, true);
|
|
|
- const pagePathElem = <PagePathLabel page={page} isFormerOnly />;
|
|
|
+ const dPagePath = new DevidedPagePath(pageData.path, false, true);
|
|
|
+ const pagePathElem = <PagePathLabel page={pageData} isFormerOnly />;
|
|
|
|
|
|
const onClickInvoked = (pageId) => {
|
|
|
if (props.onClickInvoked != null) {
|
|
|
@@ -89,11 +90,11 @@ const SearchResultListItem: FC<Props> = (props:Props) => {
|
|
|
};
|
|
|
|
|
|
return (
|
|
|
- <li key={page._id} className={`page-list-li search-page-item w-100 border-bottom px-4 list-group-item-action ${isSelected ? 'active' : ''}`}>
|
|
|
+ <li key={pageData._id} className={`page-list-li search-page-item w-100 border-bottom px-4 list-group-item-action ${isSelected ? 'active' : ''}`}>
|
|
|
<a
|
|
|
className="d-block pt-3"
|
|
|
href={pageId}
|
|
|
- onClick={() => onClickInvoked(page._id)}
|
|
|
+ onClick={() => onClickInvoked(pageData._id)}
|
|
|
>
|
|
|
<div className="d-flex">
|
|
|
{/* checkbox */}
|
|
|
@@ -109,26 +110,23 @@ const SearchResultListItem: FC<Props> = (props:Props) => {
|
|
|
<div className="d-flex my-1 align-items-center">
|
|
|
{/* page title */}
|
|
|
<h3 className="mb-0">
|
|
|
- <UserPicture user={page.lastUpdateUser} />
|
|
|
+ <UserPicture user={pageData.lastUpdateUser} />
|
|
|
<span className="mx-2">{dPagePath.latter}</span>
|
|
|
</h3>
|
|
|
{/* page meta */}
|
|
|
<div className="d-flex mx-2">
|
|
|
- <PageListMeta page={page} />
|
|
|
+ <PageListMeta pageData={pageData} pageMeta={pageMeta} />
|
|
|
</div>
|
|
|
{/* doropdown icon includes page control buttons */}
|
|
|
<div className="ml-auto">
|
|
|
- <PageItemControl page={page} />
|
|
|
+ <PageItemControl page={pageData} />
|
|
|
</div>
|
|
|
</div>
|
|
|
<div className="my-2">
|
|
|
<Clamp
|
|
|
lines={2}
|
|
|
>
|
|
|
- {page.snippet
|
|
|
- ? <div className="mt-1">page.snippet</div>
|
|
|
- : <div className="mt-1" dangerouslySetInnerHTML={{ __html: page.elasticSearchResult.snippet }}></div>
|
|
|
- }
|
|
|
+ {pageMeta.elasticSearchResult && <div className="mt-1" dangerouslySetInnerHTML={{ __html: pageMeta.elasticSearchResult.snippet }}></div>}
|
|
|
</Clamp>
|
|
|
</div>
|
|
|
</div>
|