feat: add firearm type filter to firearms page

This commit is contained in:
2026-04-06 20:47:44 +08:00
parent 452b807b62
commit feeb44bf6a
+26 -5
View File
@@ -1,7 +1,7 @@
import { useEffect, useState } from "react" import { useEffect, useState } from "react"
import { FirearmApi } from "@/api" import { FirearmApi } from "@/api"
import { Firearm, FirearmType } from "@/types" import { Firearm, FirearmType } from "@/types"
import { Card, Col, Pagination, Row, Tag, Typography } from "antd" import { Card, Col, Pagination, Row, Select, Tag, Typography } from "antd"
const firearmTypeText: Record<FirearmType, string> = { const firearmTypeText: Record<FirearmType, string> = {
RIFLE: "步枪", RIFLE: "步枪",
@@ -14,8 +14,12 @@ const firearmTypeText: Record<FirearmType, string> = {
SPECIAL: "特殊", SPECIAL: "特殊",
} }
const allTypeValue = "ALL"
type FirearmTypeFilter = FirearmType | typeof allTypeValue
export default function FirearmsPage() { export default function FirearmsPage() {
const [page, setPage] = useState<number>(1) const [page, setPage] = useState<number>(1)
const [typeFilter, setTypeFilter] = useState<FirearmTypeFilter>(allTypeValue)
const [firearms, setFirearms] = useState<Firearm[]>([]) const [firearms, setFirearms] = useState<Firearm[]>([])
const [total, setTotal] = useState<number>(0) const [total, setTotal] = useState<number>(0)
@@ -25,14 +29,32 @@ export default function FirearmsPage() {
size: 12, size: 12,
sortBy: "id", sortBy: "id",
direction: "ASC", direction: "ASC",
type: typeFilter === allTypeValue ? undefined : typeFilter,
}).then((pagedData) => { }).then((pagedData) => {
setFirearms(pagedData.items) setFirearms(pagedData.items)
setTotal(pagedData.totalElements) setTotal(pagedData.totalElements)
}) })
}, [page]) }, [page, typeFilter])
return ( return (
<> <>
<div className="mb-4 flex justify-end">
<Select<FirearmTypeFilter>
className="w-full sm:w-64"
value={typeFilter}
options={[
{ value: allTypeValue, label: "全部类型" },
...Object.entries(firearmTypeText).map(([value, label]) => ({
value,
label,
})),
]}
onChange={(nextType) => {
setPage(1)
setTypeFilter(nextType)
}}
/>
</div>
<div className="mb-6"> <div className="mb-6">
<Row gutter={[16, 16]}> <Row gutter={[16, 16]}>
{firearms.map((firearm) => ( {firearms.map((firearm) => (
@@ -47,13 +69,12 @@ export default function FirearmsPage() {
<div className="flex flex-col gap-3"> <div className="flex flex-col gap-3">
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">
<Tag color="blue">{firearmTypeText[firearm.type]}</Tag> <Tag color="blue">{firearmTypeText[firearm.type]}</Tag>
<Typography.Text type="secondary">ID: {firearm.id}</Typography.Text>
</div> </div>
<Typography.Text> <Typography.Text>
<strong></strong> <strong></strong>
{firearm.level} {firearm.level}
</Typography.Text> </Typography.Text>
<Typography.Paragraph className="!mb-0" type="secondary" ellipsis={{ rows: 3 }}> <Typography.Paragraph style={{ marginBottom: 0 }} type="secondary" ellipsis={{ rows: 3 }}>
{firearm.review || "暂无描述"} {firearm.review || "暂无描述"}
</Typography.Paragraph> </Typography.Paragraph>
</div> </div>