feat(ui): 替换原生下拉控件

This commit is contained in:
2026-05-12 00:39:44 +08:00
parent 84e3f02752
commit 8f953cd6a1
2 changed files with 82 additions and 26 deletions
+21 -20
View File
@@ -6,13 +6,14 @@ import { useEffect, useMemo, useState } from 'react'
import { z } from 'zod'
import { orpc } from '@/client/orpc'
import { MotionCardDiv, MotionHeader, MotionSection, MotionTableRow } from '@/components/motion'
import { Badge, Button, Card, Input, SectionTitle, Select } from '@/components/ui'
import { Badge, Button, Card, Input, SectionTitle, Select, SelectOption } from '@/components/ui'
import type { BatteryInfo, BatteryListSort, PowerStatus } from '@/domain/battery'
import { BATTERY_LIST_SORT, BATTERY_LIST_SORT_VALUES, POWER_STATUS, POWER_STATUS_VALUES } from '@/domain/battery'
const pageSizeOptions = [20, 50, 100] as const
type PageSizeOption = (typeof pageSizeOptions)[number]
const firstPageCursor = '__FIRST_PAGE__'
const allPowerStatusValue = 'all'
const searchFilterSchema = z.preprocess(
(value) => (typeof value === 'string' ? value.trim() || undefined : value),
@@ -78,7 +79,7 @@ function parseSort(value: string): BatteryListSort {
}
function parsePowerStatus(value: string): PowerStatus | undefined {
if (value === '') return undefined
if (value === allPowerStatusValue) return undefined
const parsed = Number(value)
@@ -326,22 +327,22 @@ function BatteriesPage() {
</label>
<Select
id="power-status-select"
value={search.powerStatus ?? ''}
onChange={(e) => {
value={search.powerStatus ?? allPowerStatusValue}
onValueChange={(value) => {
navigate({
search: (prev) => ({
...prev,
powerStatus: parsePowerStatus(e.target.value),
powerStatus: parsePowerStatus(value),
cursor: undefined,
cursors: [],
}),
})
}}
>
<option value=""></option>
<option value={POWER_STATUS.NOT_CHARGING}></option>
<option value={POWER_STATUS.CHARGING}></option>
<option value={POWER_STATUS.FULL}></option>
<SelectOption value={allPowerStatusValue}></SelectOption>
<SelectOption value={POWER_STATUS.NOT_CHARGING}></SelectOption>
<SelectOption value={POWER_STATUS.CHARGING}></SelectOption>
<SelectOption value={POWER_STATUS.FULL}></SelectOption>
</Select>
</div>
@@ -352,21 +353,21 @@ function BatteriesPage() {
<Select
id="sort-select"
value={search.sort}
onChange={(e) => {
onValueChange={(value) => {
navigate({
search: (prev) => ({
...prev,
sort: parseSort(e.target.value),
sort: parseSort(value),
cursor: undefined,
cursors: [],
}),
})
}}
>
<option value={BATTERY_LIST_SORT.CREATED_AT_DESC}></option>
<option value={BATTERY_LIST_SORT.CREATED_AT_ASC}></option>
<option value={BATTERY_LIST_SORT.POWER_DESC}></option>
<option value={BATTERY_LIST_SORT.POWER_ASC}></option>
<SelectOption value={BATTERY_LIST_SORT.CREATED_AT_DESC}></SelectOption>
<SelectOption value={BATTERY_LIST_SORT.CREATED_AT_ASC}></SelectOption>
<SelectOption value={BATTERY_LIST_SORT.POWER_DESC}></SelectOption>
<SelectOption value={BATTERY_LIST_SORT.POWER_ASC}></SelectOption>
</Select>
</div>
@@ -377,20 +378,20 @@ function BatteriesPage() {
<Select
id="page-size-select"
value={search.pageSize}
onChange={(e) => {
onValueChange={(value) => {
navigate({
search: (prev) => ({
...prev,
pageSize: parsePageSize(e.target.value),
pageSize: parsePageSize(value),
cursor: undefined,
cursors: [],
}),
})
}}
>
<option value="20">20 /</option>
<option value="50">50 /</option>
<option value="100">100 /</option>
<SelectOption value="20">20 /</SelectOption>
<SelectOption value="50">50 /</SelectOption>
<SelectOption value="100">100 /</SelectOption>
</Select>
</div>