import React, {
useCallback, useMemo, useRef, useState,
} from 'react';
import { useTranslation } from 'react-i18next';
import {
UncontrolledButtonDropdown, DropdownToggle, DropdownMenu, DropdownItem,
} from 'reactstrap';
import { IFormattedSearchResult } from '~/interfaces/search';
import AppContainer from '~/client/services/AppContainer';
import { ISelectableAll, ISelectableAndIndeterminatable } from '~/client/interfaces/selectable-all';
import { toastSuccess } from '~/client/util/apiNotification';
import {
ISearchConfigurations, useSWRxNamedQuerySearch,
} from '~/stores/search';
import { ILegacyPrivatePage, useLegacyPrivatePagesMigrationModal } from '~/stores/modal';
import PaginationWrapper from './PaginationWrapper';
import { OperateAllControl } from './SearchPage/OperateAllControl';
import { IReturnSelectedPageIds, SearchPageBase } from './SearchPage2/SearchPageBase';
import { MenuItemType } from './Common/Dropdown/PageItemControl';
import { LegacyPrivatePagesMigrationModal } from './LegacyPrivatePagesMigrationModal';
// TODO: replace with "customize:showPageLimitationS"
const INITIAL_PAGIONG_SIZE = 20;
/**
* SearchResultListHead
*/
type SearchResultListHeadProps = {
searchResult: IFormattedSearchResult,
offset: number,
pagingSize: number,
onPagingSizeChanged: (size: number) => void,
}
const SearchResultListHead = React.memo((props: SearchResultListHeadProps): JSX.Element => {
const { t } = useTranslation();
const {
searchResult, offset, pagingSize,
onPagingSizeChanged,
} = props;
const { took, total, hitsCount } = searchResult.meta;
const leftNum = offset + 1;
const rightNum = offset + hitsCount;
if (total === 0) {
return (
{t('private_legacy_pages.nopages_title')}
{t('private_legacy_pages.nopages_desc1')}
{/* eslint-disable-next-line react/no-danger */}
);
}
return (
<>
{t('search_result.result_meta')}
{`${leftNum}-${rightNum}`} / {total}
{ took != null && (
({took}ms)
) }
{t('private_legacy_pages.alert_title')}
{t('private_legacy_pages.alert_desc1', { delete_all_selected_page: t('search_result.delete_all_selected_page') })}
{/* eslint-disable-next-line react/no-danger */}
>
);
});
/**
* LegacyPage
*/
type Props = {
appContainer: AppContainer,
}
export const PrivateLegacyPages = (props: Props): JSX.Element => {
const { t } = useTranslation();
const {
appContainer,
} = props;
const [configurationsByPagination, setConfigurationsByPagination] = useState>({
limit: INITIAL_PAGIONG_SIZE,
});
const [isControlEnabled, setControlEnabled] = useState(false);
const selectAllControlRef = useRef(null);
const searchPageBaseRef = useRef(null);
const { data, conditions, mutate } = useSWRxNamedQuerySearch('PrivateLegacyPages', {
limit: INITIAL_PAGIONG_SIZE,
...configurationsByPagination,
});
const { open: openModal, close: closeModal } = useLegacyPrivatePagesMigrationModal();
const selectAllCheckboxChangedHandler = useCallback((isChecked: boolean) => {
const instance = searchPageBaseRef.current;
if (instance == null) {
return;
}
if (isChecked) {
instance.selectAll();
setControlEnabled(true);
}
else {
instance.deselectAll();
setControlEnabled(false);
}
}, []);
const selectedPagesByCheckboxesChangedHandler = useCallback((selectedCount: number, totalCount: number) => {
const instance = selectAllControlRef.current;
if (instance == null) {
return;
}
if (selectedCount === 0) {
instance.deselect();
setControlEnabled(false);
}
else if (selectedCount === totalCount) {
instance.select();
setControlEnabled(true);
}
else {
instance.setIndeterminate();
setControlEnabled(true);
}
}, []);
const convertMenuItemClickedHandler = useCallback(() => {
if (data == null) {
return;
}
const instance = searchPageBaseRef.current;
if (instance == null || instance.getSelectedPageIds == null) {
return;
}
const selectedPageIds = instance.getSelectedPageIds();
if (selectedPageIds.size === 0) {
return;
}
const selectedPages = data.data
.filter(pageWithMeta => selectedPageIds.has(pageWithMeta.pageData._id))
.map(pageWithMeta => ({ pageId: pageWithMeta.pageData._id, path: pageWithMeta.pageData.path } as ILegacyPrivatePage));
openModal(
selectedPages,
() => {
toastSuccess('success');
closeModal();
mutate();
},
);
}, [data, mutate, openModal, closeModal]);
const pagingNumberChangedHandler = useCallback((activePage: number) => {
const currentLimit = configurationsByPagination.limit ?? INITIAL_PAGIONG_SIZE;
setConfigurationsByPagination({
...configurationsByPagination,
offset: (activePage - 1) * currentLimit,
});
}, [configurationsByPagination]);
const { offset, limit } = conditions;
const searchControl = useMemo(() => {
return (
{t('private_legacy_pages.bulk_operation')}
{t('private_legacy_pages.convert_all_selected_pages')}
{ /* TODO: implement */ }}>
{t('search_result.delete_all_selected_page')}
);
}, [convertMenuItemClickedHandler, isControlEnabled, selectAllCheckboxChangedHandler, t]);
const searchResultListHead = useMemo(() => {
if (data == null) {
return <>>;
}
return (
{}}
/>
);
}, [data, limit, offset]);
const searchPager = useMemo(() => {
// when pager is not needed
if (data == null || data.meta.hitsCount === data.meta.total) {
return <>>;
}
const { total } = data.meta;
const { offset, limit } = conditions;
return (
);
}, [conditions, configurationsByPagination?.limit, data, pagingNumberChangedHandler]);
return (
<>
>
);
};