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 ( <> ); };