SearchPageLayout.tsx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import React, { FC } from 'react';
  2. import { useTranslation } from 'react-i18next';
  3. type SearchResultMeta = {
  4. took : number,
  5. total : number,
  6. results: number
  7. }
  8. type Props = {
  9. SearchControl: React.FunctionComponent,
  10. SearchResultList: React.FunctionComponent,
  11. SearchResultContent: React.FunctionComponent,
  12. searchResultMeta: SearchResultMeta,
  13. searchingKeyword: string,
  14. initialPagingLimit: number,
  15. onPagingLimitChanged: (limit: number) => void
  16. }
  17. const SearchPageLayout: FC<Props> = (props: Props) => {
  18. const { t } = useTranslation('');
  19. const {
  20. SearchResultList, SearchControl, SearchResultContent, searchResultMeta, searchingKeyword,
  21. } = props;
  22. return (
  23. <div className="content-main">
  24. <div className="search-result row" id="search-result">
  25. <div className="col-lg-6 page-list border boder-gray search-result-list px-0" id="search-result-list">
  26. <nav><SearchControl></SearchControl></nav>
  27. <div className="d-flex align-items-center justify-content-between mt-1 mb-3">
  28. <div className="search-result-meta text-nowrap mr-3">
  29. <span className="font-weight-light">{t('search_result.result_meta')} </span>
  30. <span className="h5">{`"${searchingKeyword}"`}</span>
  31. {/* Todo: replace "1-10" to the appropriate value */}
  32. <span className="ml-3">1-10 / {searchResultMeta.total || 0}</span>
  33. </div>
  34. <div className="input-group search-result-select-group">
  35. <div className="input-group-prepend">
  36. <label className="input-group-text text-secondary" htmlFor="inputGroupSelect01">{t('search_result.number_of_list_to_display')}</label>
  37. </div>
  38. <select className="custom-select" id="inputGroupSelect01" onChange={(e) => { props.onPagingLimitChanged(Number(e.target.value)) }}>
  39. {[20, 50, 100, 200].map((limit) => {
  40. return <option selected={limit === props.initialPagingLimit} value={limit}>{limit}{t('search_result.page_number_unit')}</option>;
  41. })}
  42. </select>
  43. </div>
  44. </div>
  45. <div className="page-list">
  46. <ul className="page-list-ul page-list-ul-flat nav nav-pills"><SearchResultList></SearchResultList></ul>
  47. </div>
  48. </div>
  49. <div className="col-lg-6 d-none d-lg-block search-result-content">
  50. <SearchResultContent></SearchResultContent>
  51. </div>
  52. </div>
  53. </div>
  54. );
  55. };
  56. export default SearchPageLayout;