SearchControl.tsx 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import React, { FC, useState } from 'react';
  2. import { useTranslation } from 'react-i18next';
  3. import SearchPageForm from './SearchPageForm';
  4. import AppContainer from '../../client/services/AppContainer';
  5. import DeleteSelectedPageGroup from './DeleteSelectedPageGroup';
  6. import SearchOptionModal from './SearchOptionModal';
  7. import { CheckboxType } from '../../interfaces/search';
  8. type Props = {
  9. searchingKeyword: string,
  10. appContainer: AppContainer,
  11. searchResultCount: number,
  12. selectAllCheckboxType: CheckboxType,
  13. onClickDeleteAllButton?: () => void
  14. onClickSelectAllCheckbox?: (nextSelectAllCheckboxType: CheckboxType) => void,
  15. excludeUserPages: boolean,
  16. excludeTrashPages: boolean,
  17. onSearchInvoked: (data: {keyword: string}) => boolean,
  18. onExcludeUserPagesSwitched?: () => void,
  19. onExcludeTrashPagesSwitched?: () => void,
  20. }
  21. const SearchControl: FC <Props> = (props: Props) => {
  22. const [isFileterOptionModalShown, setIsFileterOptionModalShown] = useState(false);
  23. // Temporaly workaround for lint error
  24. // later needs to be fixed: SearchControl to typescript componet
  25. const SearchPageFormTypeAny : any = SearchPageForm;
  26. const { t } = useTranslation('');
  27. const { searchResultCount } = props;
  28. const switchExcludeUserPagesHandler = () => {
  29. if (props.onExcludeUserPagesSwitched != null) {
  30. props.onExcludeUserPagesSwitched();
  31. }
  32. };
  33. const switchExcludeTrashPagesHandler = () => {
  34. if (props.onExcludeTrashPagesSwitched != null) {
  35. props.onExcludeTrashPagesSwitched();
  36. }
  37. };
  38. const openSearchOptionModalHandler = () => {
  39. setIsFileterOptionModalShown(true);
  40. };
  41. const closeSearchOptionModalHandler = () => {
  42. setIsFileterOptionModalShown(false);
  43. };
  44. const onRetrySearchInvoked = () => {
  45. if (props.onSearchInvoked != null) {
  46. props.onSearchInvoked({ keyword: props.searchingKeyword });
  47. }
  48. };
  49. const rednerSearchOptionModal = () => {
  50. return (
  51. <SearchOptionModal
  52. isOpen={isFileterOptionModalShown || false}
  53. onClickFilteringSearchResult={onRetrySearchInvoked}
  54. onClose={closeSearchOptionModalHandler}
  55. onExcludeUserPagesSwitched={switchExcludeUserPagesHandler}
  56. onExcludeTrashPagesSwitched={switchExcludeTrashPagesHandler}
  57. excludeUserPages={props.excludeUserPages}
  58. excludeTrashPages={props.excludeTrashPages}
  59. />
  60. );
  61. };
  62. return (
  63. <>
  64. <div className="search-page-nav d-flex py-3 align-items-center">
  65. <div className="flex-grow-1 mx-4">
  66. <SearchPageFormTypeAny
  67. keyword={props.searchingKeyword}
  68. appContainer={props.appContainer}
  69. onSearchFormChanged={props.onSearchInvoked}
  70. />
  71. </div>
  72. <div className="mr-4">
  73. {/* TODO: replace the following button */}
  74. <button type="button">related pages</button>
  75. </div>
  76. </div>
  77. {/* TODO: replace the following elements deleteAll button , relevance button and include specificPath button component */}
  78. <div className="d-flex align-items-center py-3 border-bottom border-gray">
  79. <div className="d-flex mr-auto ml-3">
  80. {/* Todo: design will be fixed in #80324. Function will be implemented in #77525 */}
  81. <DeleteSelectedPageGroup
  82. isSelectAllCheckboxDisabled={searchResultCount === 0}
  83. selectAllCheckboxType={props.selectAllCheckboxType}
  84. onClickDeleteAllButton={props.onClickDeleteAllButton}
  85. onClickSelectAllCheckbox={props.onClickSelectAllCheckbox}
  86. />
  87. </div>
  88. {/** filter option */}
  89. <div className="d-lg-none mr-4">
  90. <button
  91. type="button"
  92. className="btn"
  93. onClick={openSearchOptionModalHandler}
  94. >
  95. <i className="icon-equalizer"></i>
  96. </button>
  97. </div>
  98. <div className="d-none d-lg-flex align-items-center mr-3">
  99. <div className="border border-gray mr-3">
  100. <label className="px-3 py-2 mb-0 d-flex align-items-center" htmlFor="flexCheckDefault">
  101. <input
  102. className="mr-2"
  103. type="checkbox"
  104. id="flexCheckDefault"
  105. onClick={switchExcludeUserPagesHandler}
  106. />
  107. {t('Include Subordinated Target Page', { target: '/user' })}
  108. </label>
  109. </div>
  110. <div className="border border-gray">
  111. <label className="px-3 py-2 mb-0 d-flex align-items-center" htmlFor="flexCheckChecked">
  112. <input
  113. className="mr-2"
  114. type="checkbox"
  115. id="flexCheckChecked"
  116. onClick={switchExcludeTrashPagesHandler}
  117. />
  118. {t('Include Subordinated Target Page', { target: '/trash' })}
  119. </label>
  120. </div>
  121. </div>
  122. </div>
  123. {rednerSearchOptionModal()}
  124. </>
  125. );
  126. };
  127. export default SearchControl;