* feat: jumping from the chunk list page to the file list page keeps the original page number. * feat: jump to the file upload page and reset the file list page number to 1tags/v0.1.0
| import { KnowledgeSearchParams } from '@/constants/knowledge'; | import { KnowledgeSearchParams } from '@/constants/knowledge'; | ||||
| import { useLocation, useSearchParams } from 'umi'; | |||||
| import { useCallback } from 'react'; | |||||
| import { useLocation, useNavigate, useSearchParams } from 'umi'; | |||||
| export enum SegmentIndex { | export enum SegmentIndex { | ||||
| Second = '2', | Second = '2', | ||||
| currentQueryParameters.get(KnowledgeSearchParams.KnowledgeId) || '', | currentQueryParameters.get(KnowledgeSearchParams.KnowledgeId) || '', | ||||
| }; | }; | ||||
| }; | }; | ||||
| export const useNavigateWithFromState = () => { | |||||
| const navigate = useNavigate(); | |||||
| return useCallback( | |||||
| (path: string) => { | |||||
| navigate(path, { state: { from: path } }); | |||||
| }, | |||||
| [navigate], | |||||
| ); | |||||
| }; | 
| import styles from './index.less'; | import styles from './index.less'; | ||||
| import { useNavigateWithFromState } from '@/hooks/routeHook'; | |||||
| import { useCallback, useMemo } from 'react'; | import { useCallback, useMemo } from 'react'; | ||||
| import { useLocation, useNavigate } from 'umi'; | |||||
| import { useLocation } from 'umi'; | |||||
| const { Header } = Layout; | const { Header } = Layout; | ||||
| const { | const { | ||||
| token: { colorBgContainer }, | token: { colorBgContainer }, | ||||
| } = theme.useToken(); | } = theme.useToken(); | ||||
| const navigate = useNavigate(); | |||||
| const navigate = useNavigateWithFromState(); | |||||
| const { pathname } = useLocation(); | const { pathname } = useLocation(); | ||||
| const tagsData = useMemo( | const tagsData = useMemo( | 
| }; | }; | ||||
| const handleGithubCLick = () => { | const handleGithubCLick = () => { | ||||
| window.open('https://github.com/infiniflow/infinity', 'target'); | |||||
| window.open('https://github.com/infiniflow/ragflow', 'target'); | |||||
| }; | }; | ||||
| const RightToolBar = () => { | const RightToolBar = () => { | 
| removeChunk(); | removeChunk(); | ||||
| }, [removeChunk]); | }, [removeChunk]); | ||||
| const handleEnabledClick = () => { | |||||
| const handleEnabledClick = useCallback(() => { | |||||
| switchChunk(1); | switchChunk(1); | ||||
| }; | |||||
| const handleDisabledClick = () => { | |||||
| }, [switchChunk]); | |||||
| const handleDisabledClick = useCallback(() => { | |||||
| switchChunk(0); | switchChunk(0); | ||||
| }; | |||||
| }, [switchChunk]); | |||||
| const items: MenuProps['items'] = useMemo(() => { | const items: MenuProps['items'] = useMemo(() => { | ||||
| return [ | return [ | ||||
| ), | ), | ||||
| }, | }, | ||||
| ]; | ]; | ||||
| }, [checked, handleSelectAllCheck, handleDelete]); | |||||
| }, [ | |||||
| checked, | |||||
| handleSelectAllCheck, | |||||
| handleDelete, | |||||
| handleEnabledClick, | |||||
| handleDisabledClick, | |||||
| ]); | |||||
| const content = ( | const content = ( | ||||
| <Menu style={{ width: 200 }} items={items} selectable={false} /> | <Menu style={{ width: 200 }} items={items} selectable={false} /> | 
| showQuickJumper: true, | showQuickJumper: true, | ||||
| total: kFModel.total, | total: kFModel.total, | ||||
| showSizeChanger: true, | showSizeChanger: true, | ||||
| current: kFModel.pagination.currentPage, | |||||
| current: kFModel.pagination.current, | |||||
| pageSize: kFModel.pagination.pageSize, | pageSize: kFModel.pagination.pageSize, | ||||
| pageSizeOptions: [1, 2, 10, 20, 50, 100], | pageSizeOptions: [1, 2, 10, 20, 50, 100], | ||||
| onChange: onPageChange, | onChange: onPageChange, | 
| return data; | return data; | ||||
| }, | }, | ||||
| }, | }, | ||||
| subscriptions: { | |||||
| setup({ dispatch, history }) { | |||||
| history.listen(({ location }) => { | |||||
| const state: { from: string } = (location.state ?? { | |||||
| from: '', | |||||
| }) as { from: string }; | |||||
| if ( | |||||
| state.from === '/knowledge' || // TODO: Just directly determine whether the current page is on the knowledge list page. | |||||
| location.pathname === '/knowledge/dataset/upload' | |||||
| ) { | |||||
| dispatch({ | |||||
| type: 'kFModel/setPagination', | |||||
| payload: { current: 1, pageSize: 10 }, | |||||
| }); | |||||
| } | |||||
| console.info(location); | |||||
| }); | |||||
| }, | |||||
| }, | |||||
| }; | }; | ||||
| export default model; | export default model; | 
| import { useKnowledgeBaseId } from '@/hooks/knowledgeHook'; | import { useKnowledgeBaseId } from '@/hooks/knowledgeHook'; | ||||
| import { useSecondPathName, useThirdPathName } from '@/hooks/routeHook'; | |||||
| import { | |||||
| useNavigateWithFromState, | |||||
| useSecondPathName, | |||||
| useThirdPathName, | |||||
| } from '@/hooks/routeHook'; | |||||
| import { Breadcrumb } from 'antd'; | import { Breadcrumb } from 'antd'; | ||||
| import { ItemType } from 'antd/es/breadcrumb/Breadcrumb'; | import { ItemType } from 'antd/es/breadcrumb/Breadcrumb'; | ||||
| import { useCallback, useEffect, useMemo } from 'react'; | |||||
| import { Link, Outlet, useDispatch, useLocation, useNavigate } from 'umi'; | |||||
| import { useEffect, useMemo } from 'react'; | |||||
| import { Link, Outlet, useDispatch, useLocation } from 'umi'; | |||||
| import Siderbar from './components/knowledge-sidebar'; | import Siderbar from './components/knowledge-sidebar'; | ||||
| import { | import { | ||||
| KnowledgeDatasetRouteKey, | KnowledgeDatasetRouteKey, | ||||
| const KnowledgeAdding = () => { | const KnowledgeAdding = () => { | ||||
| const dispatch = useDispatch(); | const dispatch = useDispatch(); | ||||
| const navigate = useNavigate(); | |||||
| const knowledgeBaseId = useKnowledgeBaseId(); | const knowledgeBaseId = useKnowledgeBaseId(); | ||||
| const location = useLocation(); | const location = useLocation(); | ||||
| const datasetActiveKey: KnowledgeDatasetRouteKey = | const datasetActiveKey: KnowledgeDatasetRouteKey = | ||||
| useThirdPathName() as KnowledgeDatasetRouteKey; | useThirdPathName() as KnowledgeDatasetRouteKey; | ||||
| const gotoList = useCallback(() => { | |||||
| navigate('/knowledge'); | |||||
| }, [navigate]); | |||||
| const gotoList = useNavigateWithFromState(); | |||||
| const breadcrumbItems: ItemType[] = useMemo(() => { | const breadcrumbItems: ItemType[] = useMemo(() => { | ||||
| const items: ItemType[] = [ | const items: ItemType[] = [ | ||||
| { | { | ||||
| title: <a onClick={gotoList}>Knowledge Base</a>, | |||||
| title: <a onClick={() => gotoList('/knowledge')}>Knowledge Base</a>, | |||||
| }, | }, | ||||
| { | { | ||||
| title: datasetActiveKey ? ( | title: datasetActiveKey ? ( | 
| }; | }; | ||||
| const handleCardClick = () => { | const handleCardClick = () => { | ||||
| navigate(`/knowledge/${KnowledgeRouteKey.Dataset}?id=${item.id}`); | |||||
| navigate(`/knowledge/${KnowledgeRouteKey.Dataset}?id=${item.id}`, { | |||||
| state: { from: 'list' }, | |||||
| }); | |||||
| }; | }; | ||||
| return ( | return ( |