|
|
@@ -24,10 +24,14 @@ import { OperateAllControl } from './SearchPage/OperateAllControl';
|
|
|
import { IReturnSelectedPageIds, SearchPageBase, usePageDeleteModalForBulkDeletion } from './SearchPage2/SearchPageBase';
|
|
|
import { MenuItemType } from './Common/Dropdown/PageItemControl';
|
|
|
import { LegacyPrivatePagesMigrationModal } from './LegacyPrivatePagesMigrationModal';
|
|
|
+import SearchControl from './SearchPage/SearchControl';
|
|
|
+import { useSWRxV5MigrationStatus } from '~/stores/page-listing';
|
|
|
|
|
|
|
|
|
// TODO: replace with "customize:showPageLimitationS"
|
|
|
-const INITIAL_PAGIONG_SIZE = 20;
|
|
|
+const INITIAL_PAGING_SIZE = 20;
|
|
|
+
|
|
|
+const initQ = '/';
|
|
|
|
|
|
|
|
|
/**
|
|
|
@@ -43,6 +47,11 @@ type SearchResultListHeadProps = {
|
|
|
|
|
|
const SearchResultListHead = React.memo((props: SearchResultListHeadProps): JSX.Element => {
|
|
|
const { t } = useTranslation();
|
|
|
+ const { data: migrationStatus } = useSWRxV5MigrationStatus();
|
|
|
+
|
|
|
+ if (migrationStatus == null) {
|
|
|
+ return <></>;
|
|
|
+ }
|
|
|
|
|
|
const {
|
|
|
searchResult, offset, pagingSize,
|
|
|
@@ -53,7 +62,9 @@ const SearchResultListHead = React.memo((props: SearchResultListHeadProps): JSX.
|
|
|
const leftNum = offset + 1;
|
|
|
const rightNum = offset + hitsCount;
|
|
|
|
|
|
- if (total === 0) {
|
|
|
+ const isSuccess = migrationStatus.migratablePagesCount === 0;
|
|
|
+
|
|
|
+ if (isSuccess) {
|
|
|
return (
|
|
|
<div className="card border-success mt-3">
|
|
|
<div className="card-body">
|
|
|
@@ -125,22 +136,27 @@ export const PrivateLegacyPages = (props: Props): JSX.Element => {
|
|
|
} = props;
|
|
|
|
|
|
|
|
|
+ const [keyword, setKeyword] = useState<string>(initQ);
|
|
|
const [offset, setOffset] = useState<number>(0);
|
|
|
- const [limit, setLimit] = useState<number>(INITIAL_PAGIONG_SIZE);
|
|
|
+ const [limit, setLimit] = useState<number>(INITIAL_PAGING_SIZE);
|
|
|
|
|
|
const [isControlEnabled, setControlEnabled] = useState(false);
|
|
|
|
|
|
const selectAllControlRef = useRef<ISelectableAndIndeterminatable|null>(null);
|
|
|
const searchPageBaseRef = useRef<ISelectableAll & IReturnSelectedPageIds|null>(null);
|
|
|
|
|
|
- // TODOT: replace '/' with keyword
|
|
|
- const { data, conditions, mutate } = useSWRxSearch('/', 'PrivateLegacyPages', {
|
|
|
+ const { data, conditions, mutate } = useSWRxSearch(keyword, 'PrivateLegacyPages', {
|
|
|
offset,
|
|
|
limit,
|
|
|
includeUserPages: true,
|
|
|
includeTrashPages: false,
|
|
|
});
|
|
|
|
|
|
+ const searchInvokedHandler = useCallback((_keyword: string) => {
|
|
|
+ setKeyword(_keyword);
|
|
|
+ setOffset(0);
|
|
|
+ }, []);
|
|
|
+
|
|
|
const { open: openModal, close: closeModal } = useLegacyPrivatePagesMigrationModal();
|
|
|
|
|
|
const selectAllCheckboxChangedHandler = useCallback((isChecked: boolean) => {
|
|
|
@@ -227,42 +243,53 @@ export const PrivateLegacyPages = (props: Props): JSX.Element => {
|
|
|
|
|
|
const hitsCount = data?.meta.hitsCount;
|
|
|
|
|
|
- const searchControl = useMemo(() => {
|
|
|
+ const searchControlAllAction = useMemo(() => {
|
|
|
const isCheckboxDisabled = hitsCount === 0;
|
|
|
|
|
|
return (
|
|
|
- <div className="shadow-sm">
|
|
|
- <div className="search-control d-flex align-items-center py-md-2 py-3 px-md-4 px-3 border-bottom border-gray">
|
|
|
- <div className="d-flex pl-md-2">
|
|
|
- <OperateAllControl
|
|
|
- ref={selectAllControlRef}
|
|
|
- isCheckboxDisabled={isCheckboxDisabled}
|
|
|
- onCheckboxChanged={selectAllCheckboxChangedHandler}
|
|
|
- >
|
|
|
- <UncontrolledButtonDropdown>
|
|
|
- <DropdownToggle caret color="outline-primary" disabled={!isControlEnabled}>
|
|
|
- {t('private_legacy_pages.bulk_operation')}
|
|
|
- </DropdownToggle>
|
|
|
- <DropdownMenu>
|
|
|
- <DropdownItem onClick={convertMenuItemClickedHandler}>
|
|
|
- <i className="icon-fw icon-refresh"></i>
|
|
|
- {t('private_legacy_pages.convert_all_selected_pages')}
|
|
|
- </DropdownItem>
|
|
|
- <DropdownItem onClick={deleteAllButtonClickedHandler}>
|
|
|
- <span className="text-danger">
|
|
|
- <i className="icon-fw icon-trash"></i>
|
|
|
- {t('search_result.delete_all_selected_page')}
|
|
|
- </span>
|
|
|
- </DropdownItem>
|
|
|
- </DropdownMenu>
|
|
|
- </UncontrolledButtonDropdown>
|
|
|
- </OperateAllControl>
|
|
|
- </div>
|
|
|
+ <div className="search-control d-flex align-items-center">
|
|
|
+ <div className="d-flex pl-md-2">
|
|
|
+ <OperateAllControl
|
|
|
+ ref={selectAllControlRef}
|
|
|
+ isCheckboxDisabled={isCheckboxDisabled}
|
|
|
+ onCheckboxChanged={selectAllCheckboxChangedHandler}
|
|
|
+ >
|
|
|
+ <UncontrolledButtonDropdown>
|
|
|
+ <DropdownToggle caret color="outline-primary" disabled={!isControlEnabled}>
|
|
|
+ {t('private_legacy_pages.bulk_operation')}
|
|
|
+ </DropdownToggle>
|
|
|
+ <DropdownMenu>
|
|
|
+ <DropdownItem onClick={convertMenuItemClickedHandler}>
|
|
|
+ <i className="icon-fw icon-refresh"></i>
|
|
|
+ {t('private_legacy_pages.convert_all_selected_pages')}
|
|
|
+ </DropdownItem>
|
|
|
+ <DropdownItem onClick={deleteAllButtonClickedHandler}>
|
|
|
+ <span className="text-danger">
|
|
|
+ <i className="icon-fw icon-trash"></i>
|
|
|
+ {t('search_result.delete_all_selected_page')}
|
|
|
+ </span>
|
|
|
+ </DropdownItem>
|
|
|
+ </DropdownMenu>
|
|
|
+ </UncontrolledButtonDropdown>
|
|
|
+ </OperateAllControl>
|
|
|
</div>
|
|
|
</div>
|
|
|
);
|
|
|
}, [convertMenuItemClickedHandler, deleteAllButtonClickedHandler, hitsCount, isControlEnabled, selectAllCheckboxChangedHandler, t]);
|
|
|
|
|
|
+ const searchControl = useMemo(() => {
|
|
|
+ return (
|
|
|
+ <SearchControl
|
|
|
+ isSearchServiceReachable
|
|
|
+ isEnableSort={false}
|
|
|
+ isEnableFilter={false}
|
|
|
+ initialSearchConditions={{ keyword: initQ, limit: INITIAL_PAGING_SIZE }}
|
|
|
+ onSearchInvoked={searchInvokedHandler}
|
|
|
+ allControl={searchControlAllAction}
|
|
|
+ />
|
|
|
+ );
|
|
|
+ }, [searchInvokedHandler, searchControlAllAction]);
|
|
|
+
|
|
|
const searchResultListHead = useMemo(() => {
|
|
|
if (data == null) {
|
|
|
return <></>;
|