SearchControl.tsx 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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. excludeUserPages: boolean,
  12. excludeTrashPages: boolean,
  13. onSearchInvoked: (data: {keyword: string}) => boolean,
  14. onExcludeUserPagesSwitched?: () => void,
  15. onExcludeTrashPagesSwitched?: () => void,
  16. }
  17. const SearchControl: FC <Props> = (props: Props) => {
  18. const [isFileterOptionModalShown, setIsFileterOptionModalShown] = useState(false);
  19. // Temporaly workaround for lint error
  20. // later needs to be fixed: SearchControl to typescript componet
  21. const SearchPageFormTypeAny : any = SearchPageForm;
  22. const { t } = useTranslation('');
  23. const switchExcludeUserPagesHandler = () => {
  24. if (props.onExcludeUserPagesSwitched != null) {
  25. props.onExcludeUserPagesSwitched();
  26. }
  27. };
  28. const switchExcludeTrashPagesHandler = () => {
  29. if (props.onExcludeTrashPagesSwitched != null) {
  30. props.onExcludeTrashPagesSwitched();
  31. }
  32. };
  33. const onDeleteSelectedPageHandler = () => {
  34. console.log('onDeleteSelectedPageHandler is called');
  35. // TODO: implement this function to delete selected pages.
  36. // https://estoc.weseek.co.jp/redmine/issues/77525
  37. };
  38. const onCheckAllPagesInvoked = (nextCheckboxState:CheckboxType) => {
  39. console.log(`onCheckAllPagesInvoked is called with arg ${nextCheckboxState}`);
  40. // Todo: set the checkboxState, isChecked, and indeterminate value of checkbox element according to the passed argument
  41. // https://estoc.weseek.co.jp/redmine/issues/77525
  42. // setting checkbox to indeterminate is required to use of useRef to access checkbox element.
  43. // ref: https://getbootstrap.com/docs/4.5/components/forms/#checkboxes
  44. };
  45. const openSearchOptionModalHandler = () => {
  46. setIsFileterOptionModalShown(true);
  47. };
  48. const closeSearchOptionModalHandler = () => {
  49. setIsFileterOptionModalShown(false);
  50. };
  51. const onRetrySearchInvoked = () => {
  52. if (props.onSearchInvoked != null) {
  53. props.onSearchInvoked({ keyword: props.searchingKeyword });
  54. }
  55. };
  56. const rednerSearchOptionModal = () => {
  57. return (
  58. <SearchOptionModal
  59. isOpen={isFileterOptionModalShown || false}
  60. onClickFilteringSearchResult={onRetrySearchInvoked}
  61. onClose={closeSearchOptionModalHandler}
  62. onExcludeUserPagesSwitched={switchExcludeUserPagesHandler}
  63. onExcludeTrashPagesSwitched={switchExcludeTrashPagesHandler}
  64. excludeUserPages={props.excludeUserPages}
  65. excludeTrashPages={props.excludeTrashPages}
  66. />
  67. );
  68. };
  69. return (
  70. <div className="position-sticky fixed-top">
  71. <div className="search-page-nav d-flex py-3 align-items-center">
  72. <div className="flex-grow-1 mx-4">
  73. <SearchPageFormTypeAny
  74. keyword={props.searchingKeyword}
  75. appContainer={props.appContainer}
  76. onSearchFormChanged={props.onSearchInvoked}
  77. />
  78. </div>
  79. <div className="mr-4">
  80. {/* TODO: replace the following button */}
  81. <button type="button">related pages</button>
  82. </div>
  83. </div>
  84. {/* TODO: replace the following elements deleteAll button , relevance button and include specificPath button component */}
  85. <div className="search-control d-flex align-items-center py-2 border-bottom border-gray">
  86. <div className="d-flex mr-auto ml-4">
  87. {/* Todo: design will be fixed in #80324. Function will be implemented in #77525 */}
  88. <DeleteSelectedPageGroup
  89. checkboxState={'' || CheckboxType.NONE_CHECKED} // Todo: change the left value to appropriate value
  90. onClickInvoked={onDeleteSelectedPageHandler}
  91. onCheckInvoked={onCheckAllPagesInvoked}
  92. />
  93. </div>
  94. {/** filter option */}
  95. <div className="d-lg-none mr-4">
  96. <button
  97. type="button"
  98. className="btn"
  99. onClick={openSearchOptionModalHandler}
  100. >
  101. <i className="icon-equalizer"></i>
  102. </button>
  103. </div>
  104. <div className="d-none d-lg-flex align-items-center mr-3">
  105. <div className="border border-gray mr-3">
  106. <label className="px-3 py-2 mb-0 d-flex align-items-center" htmlFor="flexCheckDefault">
  107. <input
  108. className="mr-2"
  109. type="checkbox"
  110. id="flexCheckDefault"
  111. onClick={switchExcludeUserPagesHandler}
  112. />
  113. {t('Include Subordinated Target Page', { target: '/user' })}
  114. </label>
  115. </div>
  116. <div className="border border-gray">
  117. <label className="px-3 py-2 mb-0 d-flex align-items-center" htmlFor="flexCheckChecked">
  118. <input
  119. className="mr-2"
  120. type="checkbox"
  121. id="flexCheckChecked"
  122. onClick={switchExcludeTrashPagesHandler}
  123. />
  124. {t('Include Subordinated Target Page', { target: '/trash' })}
  125. </label>
  126. </div>
  127. </div>
  128. </div>
  129. {rednerSearchOptionModal()}
  130. </div>
  131. );
  132. };
  133. export default SearchControl;