SearchMethodMenuItem.tsx 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import React from 'react';
  2. import { DevidedPagePath } from '@growi/core/dist/models';
  3. import { useTranslation } from 'next-i18next';
  4. import { useCurrentPagePath } from '~/stores/page';
  5. import type { GetItemProps } from '../interfaces/downshift';
  6. import { SearchMenuItem } from './SearchMenuItem';
  7. type Props = {
  8. activeIndex: number | null
  9. searchKeyword: string
  10. getItemProps: GetItemProps
  11. }
  12. export const SearchMethodMenuItem = (props: Props): JSX.Element => {
  13. const {
  14. activeIndex, searchKeyword, getItemProps,
  15. } = props;
  16. const { t } = useTranslation('commons');
  17. const { data: currentPagePath } = useCurrentPagePath();
  18. const dPagePath = (new DevidedPagePath(currentPagePath ?? '', true, true));
  19. const currentPageName = `
  20. ${(!(dPagePath.isRoot || dPagePath.isFormerRoot) ? '...' : '')}/${(dPagePath.isRoot ? '' : `${dPagePath.latter}/`)}
  21. `;
  22. const shouldShowMenuItem = searchKeyword.trim().length > 0;
  23. return (
  24. <div>
  25. { shouldShowMenuItem && (
  26. <div data-testid="search-all-menu-item">
  27. <SearchMenuItem
  28. index={0}
  29. isActive={activeIndex === 0}
  30. getItemProps={getItemProps}
  31. url={`/_search?q=${searchKeyword}`}
  32. >
  33. <span className="material-symbols-outlined fs-4 me-3 p-0">search</span>
  34. <div className="w-100 d-flex align-items-md-center flex-md-row align-items-start flex-column">
  35. <span className="text-break me-auto">{searchKeyword}</span>
  36. <span className="small text-body-tertiary">{t('search_method_menu_item.search_in_all')}</span>
  37. </div>
  38. </SearchMenuItem>
  39. </div>
  40. )}
  41. <div data-testid="search-prefix-menu-item">
  42. <SearchMenuItem
  43. index={shouldShowMenuItem ? 1 : 0}
  44. isActive={activeIndex === (shouldShowMenuItem ? 1 : 0)}
  45. getItemProps={getItemProps}
  46. url={`/_search?q=prefix:${currentPagePath} ${searchKeyword}`}
  47. >
  48. <span className="material-symbols-outlined fs-4 me-3 p-0">search</span>
  49. <div className="w-100 d-flex align-items-md-center flex-md-row align-items-start flex-column">
  50. <code className="text-break">{currentPageName}</code>
  51. <span className="ms-md-2 text-break me-auto">{searchKeyword}</span>
  52. <span className="small text-body-tertiary">{t('search_method_menu_item.only_children_of_this_tree')}</span>
  53. </div>
  54. </SearchMenuItem>
  55. </div>
  56. { shouldShowMenuItem && (
  57. <SearchMenuItem
  58. index={2}
  59. isActive={activeIndex === 2}
  60. getItemProps={getItemProps}
  61. url={`/_search?q="${searchKeyword}"`}
  62. >
  63. <span className="material-symbols-outlined fs-4 me-3 p-0">search</span>
  64. <div className="w-100 d-flex align-items-md-center flex-md-row align-items-start flex-column">
  65. <span className="text-break me-auto">{`"${searchKeyword}"`}</span>
  66. <span className="small text-body-tertiary">{t('search_method_menu_item.exact_mutch')}</span>
  67. </div>
  68. </SearchMenuItem>
  69. ) }
  70. </div>
  71. );
  72. };