Commit dbcd6907 authored by Vũ Đình Nguyên's avatar Vũ Đình Nguyên

update component filter

parent ee2ee642
...@@ -7,12 +7,7 @@ import { Button } from '@/components/ui/button' ...@@ -7,12 +7,7 @@ import { Button } from '@/components/ui/button'
type Category = { id: string; title: string } type Category = { id: string; title: string }
const MOCK_CATEGORIES: Category[] = [
{ id: 'topic', title: 'Chuyên đề' },
{ id: 'training', title: 'Tập huấn NSDLĐ' },
{ id: 'law', title: 'Xây dựng và Phổ biến pháp luật' },
{ id: 'trade', title: 'Xúc tiến thương mại và Đầu tư' }
]
type FilterPayload = { type FilterPayload = {
upcoming: boolean upcoming: boolean
...@@ -22,14 +17,20 @@ type FilterPayload = { ...@@ -22,14 +17,20 @@ type FilterPayload = {
fromDate: string fromDate: string
toDate: string toDate: string
} }
export const EventFilter: React.FC<{
export const EventFilter: React.FC<{ onFilter?: (payload: FilterPayload) => void; onReset?: () => void }> = ({ onFilter, onReset }) => { categories?: Category[]
onFilter?: (payload: FilterPayload) => void
onReset?: () => void
}> = ({ categories: categoriesProp, onFilter, onReset }) => {
const [upcoming, setUpcoming] = useState(false) const [upcoming, setUpcoming] = useState(false)
const [past, setPast] = useState(false) const [past, setPast] = useState(false)
const [query, setQuery] = useState('') const [query, setQuery] = useState('')
// Use categories passed via props if available; otherwise use an empty array
const categoriesList = categoriesProp ?? []
const [categories, setCategories] = useState<Record<string, boolean>>(() => { const [categories, setCategories] = useState<Record<string, boolean>>(() => {
const map: Record<string, boolean> = {} const map: Record<string, boolean> = {}
MOCK_CATEGORIES.forEach((c) => (map[c.id] = false)) categoriesList.forEach((c) => (map[c.id] = false))
return map return map
}) })
const [fromDate, setFromDate] = useState('') const [fromDate, setFromDate] = useState('')
...@@ -85,14 +86,16 @@ export const EventFilter: React.FC<{ onFilter?: (payload: FilterPayload) => void ...@@ -85,14 +86,16 @@ export const EventFilter: React.FC<{ onFilter?: (payload: FilterPayload) => void
/> />
</div> </div>
{categoriesList && categoriesList.length > 0 && (
<div className="mb-4"> <div className="mb-4">
{MOCK_CATEGORIES.map((c) => ( {categoriesList.map((c) => (
<label key={c.id} className="flex items-center gap-2 mb-2"> <label key={c.id} className="flex items-center gap-2 mb-2">
<Checkbox checked={!!categories[c.id]} onCheckedChange={() => toggleCategory(c.id)} /> <Checkbox checked={!!categories[c.id]} onCheckedChange={() => toggleCategory(c.id)} />
<span className="text-sm">{c.title}</span> <span className="text-sm">{c.title}</span>
</label> </label>
))} ))}
</div> </div>
)}
<div className="mb-4"> <div className="mb-4">
<Label className="block text-sm mb-1">Từ ngày:</Label> <Label className="block text-sm mb-1">Từ ngày:</Label>
......
...@@ -4,7 +4,6 @@ import ListCategory from "@app/dai-dien-gioi-chu/components/list-category"; ...@@ -4,7 +4,6 @@ import ListCategory from "@app/dai-dien-gioi-chu/components/list-category";
import { EVENT_CATEGORIES } from "@constants/categories"; import { EVENT_CATEGORIES } from "@constants/categories";
import EventFilter from "@app/dai-dien-gioi-chu/components/event-filter"; import EventFilter from "@app/dai-dien-gioi-chu/components/event-filter";
import NewsContent from "@app/dai-dien-gioi-chu/components/card-news"; import NewsContent from "@app/dai-dien-gioi-chu/components/card-news";
// ...existing code...
import { Pagination } from "@components/base/pagination"; import { Pagination } from "@components/base/pagination";
import Image from "next/image"; import Image from "next/image";
import { useGetEvents } from '@api/endpoints/event' import { useGetEvents } from '@api/endpoints/event'
...@@ -14,8 +13,8 @@ import { GetNewsResponseType } from "@api/types/NewsPage.type"; ...@@ -14,8 +13,8 @@ import { GetNewsResponseType } from "@api/types/NewsPage.type";
import { PATHS } from "@constants/paths"; import { PATHS } from "@constants/paths";
import { Spinner } from "@components/ui/spinner"; import { Spinner } from "@components/ui/spinner";
export default function Page() { export default function Page() {
const [submitSearch] = useState("");
const [page, setPage] = useState(1); const [page, setPage] = useState(1);
const [filtersString, setFiltersString] = useState<string | undefined>('')
const pageSize = 5; const pageSize = 5;
const { data: allData, isLoading } = useGetEvents<EventApiResponse>({ const { data: allData, isLoading } = useGetEvents<EventApiResponse>({
...@@ -23,7 +22,7 @@ export default function Page() { ...@@ -23,7 +22,7 @@ export default function Page() {
currentPage: String(page), currentPage: String(page),
sortField: 'start_time', sortField: 'start_time',
sortOrder: 'ASC', sortOrder: 'ASC',
filters: submitSearch ? `title @=${submitSearch},start_time>${new Date()}` : `start_time>${new Date()}`, filters: filtersString ?? undefined,
}); });
return ( return (
<div className="min-h-screen container mx-auto p-4"> <div className="min-h-screen container mx-auto p-4">
...@@ -61,7 +60,37 @@ export default function Page() { ...@@ -61,7 +60,37 @@ export default function Page() {
{/* Sidebar */} {/* Sidebar */}
<aside className="space-y-6"> <aside className="space-y-6">
<EventFilter /> <EventFilter
onFilter={(payload) => {
const parts: string[] = []
// query
if (payload.query) parts.push(`title @=${payload.query}`)
const nowIso = new Date().toISOString()
// upcoming / past
if (payload.upcoming && !payload.past) {
parts.push(`start_time>${nowIso}`)
} else if (payload.past && !payload.upcoming) {
parts.push(`start_time<=${nowIso}`)
}
if (payload.fromDate) {
const fromIso = new Date(payload.fromDate).toISOString()
parts.push(`created_at>=${fromIso}`)
}
if (payload.toDate) {
const toIso = new Date(payload.toDate).toISOString()
parts.push(`created_at<=${toIso}`)
}
const filters = parts.length > 0 ? parts.join(',') : undefined
setFiltersString(filters)
setPage(1)
}}
onReset={() => {
setFiltersString(undefined)
setPage(1)
}}
/>
<div className="bg-white border rounded-md overflow-hidden"> <div className="bg-white border rounded-md overflow-hidden">
<div className="w-full h-56 relative bg-gray-100"> <div className="w-full h-56 relative bg-gray-100">
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment