|
@@ -11,12 +11,14 @@ import SearchPageLayout from './SearchPage/SearchPageLayout';
|
|
|
import SearchResultContent from './SearchPage/SearchResultContent';
|
|
import SearchResultContent from './SearchPage/SearchResultContent';
|
|
|
import SearchResultList from './SearchPage/SearchResultList';
|
|
import SearchResultList from './SearchPage/SearchResultList';
|
|
|
import SearchControl from './SearchPage/SearchControl';
|
|
import SearchControl from './SearchPage/SearchControl';
|
|
|
|
|
+import PageDeleteModal from './PageDeleteModal';
|
|
|
|
|
+
|
|
|
|
|
+import { CheckboxType } from '../interfaces/search';
|
|
|
|
|
|
|
|
export const specificPathNames = {
|
|
export const specificPathNames = {
|
|
|
user: '/user',
|
|
user: '/user',
|
|
|
trash: '/trash',
|
|
trash: '/trash',
|
|
|
};
|
|
};
|
|
|
-
|
|
|
|
|
class SearchPage extends React.Component {
|
|
class SearchPage extends React.Component {
|
|
|
|
|
|
|
|
constructor(props) {
|
|
constructor(props) {
|
|
@@ -30,12 +32,15 @@ class SearchPage extends React.Component {
|
|
|
searchResults: [],
|
|
searchResults: [],
|
|
|
searchResultMeta: {},
|
|
searchResultMeta: {},
|
|
|
focusedSearchResultData: null,
|
|
focusedSearchResultData: null,
|
|
|
- selectedPages: new Set(),
|
|
|
|
|
|
|
+ selectedPagesIdList: new Set(),
|
|
|
searchResultCount: 0,
|
|
searchResultCount: 0,
|
|
|
activePage: 1,
|
|
activePage: 1,
|
|
|
pagingLimit: this.props.appContainer.config.pageLimitationL,
|
|
pagingLimit: this.props.appContainer.config.pageLimitationL,
|
|
|
excludeUserPages: true,
|
|
excludeUserPages: true,
|
|
|
excludeTrashPages: true,
|
|
excludeTrashPages: true,
|
|
|
|
|
+ selectAllCheckboxType: CheckboxType.NONE_CHECKED,
|
|
|
|
|
+ isDeleteConfirmModalShown: false,
|
|
|
|
|
+ deleteTargetPageIds: new Set(),
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
this.changeURL = this.changeURL.bind(this);
|
|
this.changeURL = this.changeURL.bind(this);
|
|
@@ -47,6 +52,9 @@ class SearchPage extends React.Component {
|
|
|
this.switchExcludeTrashPagesHandler = this.switchExcludeTrashPagesHandler.bind(this);
|
|
this.switchExcludeTrashPagesHandler = this.switchExcludeTrashPagesHandler.bind(this);
|
|
|
this.onPagingNumberChanged = this.onPagingNumberChanged.bind(this);
|
|
this.onPagingNumberChanged = this.onPagingNumberChanged.bind(this);
|
|
|
this.onPagingLimitChanged = this.onPagingLimitChanged.bind(this);
|
|
this.onPagingLimitChanged = this.onPagingLimitChanged.bind(this);
|
|
|
|
|
+ this.deleteSinglePageButtonHandler = this.deleteSinglePageButtonHandler.bind(this);
|
|
|
|
|
+ this.deleteAllPagesButtonHandler = this.deleteAllPagesButtonHandler.bind(this);
|
|
|
|
|
+ this.closeDeleteConfirmModalHandler = this.closeDeleteConfirmModalHandler.bind(this);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
componentDidMount() {
|
|
componentDidMount() {
|
|
@@ -187,13 +195,65 @@ class SearchPage extends React.Component {
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- toggleCheckBox = (page) => {
|
|
|
|
|
- if (this.state.selectedPages.has(page)) {
|
|
|
|
|
- this.state.selectedPages.delete(page);
|
|
|
|
|
|
|
+ toggleCheckBox = (pageId) => {
|
|
|
|
|
+ const { selectedPagesIdList } = this.state;
|
|
|
|
|
+
|
|
|
|
|
+ if (selectedPagesIdList.has(pageId)) {
|
|
|
|
|
+ selectedPagesIdList.delete(pageId);
|
|
|
|
|
+ }
|
|
|
|
|
+ else {
|
|
|
|
|
+ selectedPagesIdList.add(pageId);
|
|
|
|
|
+ }
|
|
|
|
|
+ switch (selectedPagesIdList.size) {
|
|
|
|
|
+ case 0:
|
|
|
|
|
+ return this.setState({ selectAllCheckboxType: CheckboxType.NONE_CHECKED });
|
|
|
|
|
+ case this.state.searchResults.length:
|
|
|
|
|
+ return this.setState({ selectAllCheckboxType: CheckboxType.ALL_CHECKED });
|
|
|
|
|
+ default:
|
|
|
|
|
+ return this.setState({ selectAllCheckboxType: CheckboxType.INDETERMINATE });
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ toggleAllCheckBox = (nextSelectAllCheckboxType) => {
|
|
|
|
|
+ const { selectedPagesIdList, searchResults } = this.state;
|
|
|
|
|
+ if (nextSelectAllCheckboxType === CheckboxType.NONE_CHECKED) {
|
|
|
|
|
+ selectedPagesIdList.clear();
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
- this.state.selectedPages.add(page);
|
|
|
|
|
|
|
+ searchResults.forEach((page) => {
|
|
|
|
|
+ selectedPagesIdList.add(page.pageData._id);
|
|
|
|
|
+ });
|
|
|
}
|
|
}
|
|
|
|
|
+ this.setState({
|
|
|
|
|
+ selectedPagesIdList,
|
|
|
|
|
+ selectAllCheckboxType: nextSelectAllCheckboxType,
|
|
|
|
|
+ });
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ getSelectedPagesToDelete() {
|
|
|
|
|
+ const filteredPages = this.state.searchResults.filter((page) => {
|
|
|
|
|
+ return Array.from(this.state.deleteTargetPageIds).find(id => id === page.pageData._id);
|
|
|
|
|
+ });
|
|
|
|
|
+ return filteredPages.map(page => ({
|
|
|
|
|
+ pageId: page.pageData._id,
|
|
|
|
|
+ revisionId: page.pageData.revision,
|
|
|
|
|
+ path: page.pageData.path,
|
|
|
|
|
+ }));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ deleteSinglePageButtonHandler(pageId) {
|
|
|
|
|
+ this.setState({ deleteTargetPageIds: new Set([pageId]) });
|
|
|
|
|
+ this.setState({ isDeleteConfirmModalShown: true });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ deleteAllPagesButtonHandler() {
|
|
|
|
|
+ if (this.state.selectedPagesIdList.size === 0) { return }
|
|
|
|
|
+ this.setState({ deleteTargetPageIds: this.state.selectedPagesIdList });
|
|
|
|
|
+ this.setState({ isDeleteConfirmModalShown: true });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ closeDeleteConfirmModalHandler() {
|
|
|
|
|
+ this.setState({ isDeleteConfirmModalShown: false });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
renderSearchResultContent = () => {
|
|
renderSearchResultContent = () => {
|
|
@@ -212,13 +272,14 @@ class SearchPage extends React.Component {
|
|
|
<SearchResultList
|
|
<SearchResultList
|
|
|
pages={this.state.searchResults || []}
|
|
pages={this.state.searchResults || []}
|
|
|
focusedSearchResultData={this.state.focusedSearchResultData}
|
|
focusedSearchResultData={this.state.focusedSearchResultData}
|
|
|
- selectedPages={this.state.selectedPages || []}
|
|
|
|
|
|
|
+ selectedPagesIdList={this.state.selectedPagesIdList || []}
|
|
|
searchResultCount={this.state.searchResultCount}
|
|
searchResultCount={this.state.searchResultCount}
|
|
|
activePage={this.state.activePage}
|
|
activePage={this.state.activePage}
|
|
|
pagingLimit={this.state.pagingLimit}
|
|
pagingLimit={this.state.pagingLimit}
|
|
|
- onClickInvoked={this.selectPage}
|
|
|
|
|
- onChangedInvoked={this.toggleCheckBox}
|
|
|
|
|
|
|
+ onClickSearchResultItem={this.selectPage}
|
|
|
|
|
+ onClickCheckbox={this.toggleCheckBox}
|
|
|
onPagingNumberChanged={this.onPagingNumberChanged}
|
|
onPagingNumberChanged={this.onPagingNumberChanged}
|
|
|
|
|
+ onClickDeleteButton={this.deleteSinglePageButtonHandler}
|
|
|
/>
|
|
/>
|
|
|
);
|
|
);
|
|
|
}
|
|
}
|
|
@@ -227,8 +288,12 @@ class SearchPage extends React.Component {
|
|
|
return (
|
|
return (
|
|
|
<SearchControl
|
|
<SearchControl
|
|
|
searchingKeyword={this.state.searchingKeyword}
|
|
searchingKeyword={this.state.searchingKeyword}
|
|
|
|
|
+ searchResultCount={this.state.searchResultCount || 0}
|
|
|
appContainer={this.props.appContainer}
|
|
appContainer={this.props.appContainer}
|
|
|
onSearchInvoked={this.onSearchInvoked}
|
|
onSearchInvoked={this.onSearchInvoked}
|
|
|
|
|
+ onClickSelectAllCheckbox={this.toggleAllCheckBox}
|
|
|
|
|
+ selectAllCheckboxType={this.state.selectAllCheckboxType}
|
|
|
|
|
+ onClickDeleteAllButton={this.deleteAllPagesButtonHandler}
|
|
|
onExcludeUserPagesSwitched={this.switchExcludeUserPagesHandler}
|
|
onExcludeUserPagesSwitched={this.switchExcludeUserPagesHandler}
|
|
|
onExcludeTrashPagesSwitched={this.switchExcludeTrashPagesHandler}
|
|
onExcludeTrashPagesSwitched={this.switchExcludeTrashPagesHandler}
|
|
|
excludeUserPages={this.state.excludeUserPages}
|
|
excludeUserPages={this.state.excludeUserPages}
|
|
@@ -251,6 +316,11 @@ class SearchPage extends React.Component {
|
|
|
initialPagingLimit={this.props.appContainer.config.pageLimitationL || 50}
|
|
initialPagingLimit={this.props.appContainer.config.pageLimitationL || 50}
|
|
|
>
|
|
>
|
|
|
</SearchPageLayout>
|
|
</SearchPageLayout>
|
|
|
|
|
+ <PageDeleteModal
|
|
|
|
|
+ isOpen={this.state.isDeleteConfirmModalShown}
|
|
|
|
|
+ onClose={this.closeDeleteConfirmModalHandler}
|
|
|
|
|
+ pages={this.getSelectedPagesToDelete()}
|
|
|
|
|
+ />
|
|
|
</div>
|
|
</div>
|
|
|
);
|
|
);
|
|
|
}
|
|
}
|