From fb6d99266e4e26a3117ee9314a73c0c6cf5836a4 Mon Sep 17 00:00:00 2001 From: wangziqi Date: Mon, 6 Jul 2026 14:36:03 +0800 Subject: [PATCH] feat: add date range filter to Occupancies, status filter to Tenants --- apps/admin/src/pages/Occupancies/index.tsx | 9 ++++++--- apps/admin/src/pages/Tenants/index.tsx | 21 ++++++++++++++------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/apps/admin/src/pages/Occupancies/index.tsx b/apps/admin/src/pages/Occupancies/index.tsx index ecc7e9e..bbbc895 100644 --- a/apps/admin/src/pages/Occupancies/index.tsx +++ b/apps/admin/src/pages/Occupancies/index.tsx @@ -29,6 +29,7 @@ import { import dayjs from 'dayjs'; import api from '../../api'; import PermissionButton from '../../components/PermissionButton'; +const { RangePicker } = DatePicker; const OccupanciesPage: React.FC = () => { const [data, setData] = useState([]); @@ -43,8 +44,9 @@ const OccupanciesPage: React.FC = () => { const [autoDeposit, setAutoDeposit] = useState(true); const [depositAmount, setDepositAmount] = useState(500); const [searchText, setSearchText] = useState(''); - const [selectedRowKeys, setSelectedRowKeys] = useState([]); + const [dateRange, setDateRange] = useState<[dayjs.Dayjs | null, dayjs.Dayjs | null] | null>(null); const [batchCheckOutModal, setBatchCheckOutModal] = useState(false); + const [selectedRowKeys, setSelectedRowKeys] = useState([]); const [checkInForm] = Form.useForm(); const [checkOutForm] = Form.useForm(); const [transferForm] = Form.useForm(); @@ -54,7 +56,7 @@ const OccupanciesPage: React.FC = () => { setLoading(true); try { const [occ, stu, rm, tn]: any[] = await Promise.all([ - api.get('/occupancies', { params: { active: showActive ? 'true' : undefined } }), + api.get('/occupancies', { params: { active: showActive ? 'true' : undefined, dateFrom: dateRange?.[0]?.format('YYYY-MM-DD'), dateTo: dateRange?.[1]?.format('YYYY-MM-DD') } }), api.get('/students'), api.get('/rooms/overview'), api.get('/tenants'), @@ -72,7 +74,7 @@ const OccupanciesPage: React.FC = () => { useEffect(() => { fetchData(); setSelectedRowKeys([]); - }, [showActive]); + }, [showActive, dateRange]); const filteredData = useMemo(() => { if (!searchText) return data; @@ -275,6 +277,7 @@ const OccupanciesPage: React.FC = () => { allowClear style={{ width: 200 }} /> + { setDateRange(dates ? [dates[0], dates[1]] : null); }} placeholder={['入住开始', '入住结束']} style={{ width: 240 }} /> { const [editing, setEditing] = useState(null); const [form] = Form.useForm(); const [searchText, setSearchText] = useState(''); + const [filterStatus, setFilterStatus] = useState(undefined); const filteredData = useMemo(() => { - if (!searchText) return data; - const s = searchText.toLowerCase(); - return data.filter( - (d: any) => d.name?.toLowerCase().includes(s) || d.contact?.toLowerCase().includes(s), - ); - }, [data, searchText]); + let result = data; + if (searchText) { + const s = searchText.toLowerCase(); + result = result.filter((d: Record) => + (typeof d.name === 'string' && d.name.toLowerCase().includes(s)) || + (typeof d.contact === 'string' && d.contact.toLowerCase().includes(s))); + } + if (filterStatus) result = result.filter((d: Record) => d.status === filterStatus); + return result; + }, [data, searchText, filterStatus]); const fetchData = async () => { setLoading(true); @@ -165,6 +170,8 @@ const TenantsPage: React.FC = () => { if (!e.target.value) setSearchText(''); }} /> +