IP管理时间筛选精确到秒添加过期筛选和显示提取时间字段
This commit is contained in:
@@ -13,6 +13,7 @@ export async function getPageChannel(params: {
|
||||
node_ip?: string
|
||||
expired_at_start?: Date
|
||||
expired_at_end?: Date
|
||||
expired?: boolean
|
||||
}) {
|
||||
return callByUser<PageRecord<Channel>>("/api/admin/channel/page", params)
|
||||
}
|
||||
|
||||
@@ -124,7 +124,7 @@ export default function BalancePage() {
|
||||
className="w-40 flex-none"
|
||||
>
|
||||
<FieldLabel>开始时间</FieldLabel>
|
||||
<Input type="date" {...field} clearable />
|
||||
<Input type="date" {...field} />
|
||||
<FieldError>{fieldState.error?.message}</FieldError>
|
||||
</Field>
|
||||
)}
|
||||
@@ -138,7 +138,7 @@ export default function BalancePage() {
|
||||
className="w-40 flex-none"
|
||||
>
|
||||
<FieldLabel>结束时间</FieldLabel>
|
||||
<Input type="date" {...field} clearable />
|
||||
<Input type="date" {...field} />
|
||||
<FieldError>{fieldState.error?.message}</FieldError>
|
||||
</Field>
|
||||
)}
|
||||
|
||||
@@ -215,7 +215,7 @@ export default function BatchPage() {
|
||||
className="w-40 flex-none"
|
||||
>
|
||||
<FieldLabel>开始时间</FieldLabel>
|
||||
<Input type="date" {...field} clearable />
|
||||
<Input type="date" {...field} />
|
||||
<FieldError>{fieldState.error?.message}</FieldError>
|
||||
</Field>
|
||||
)}
|
||||
@@ -230,7 +230,7 @@ export default function BatchPage() {
|
||||
className="w-40 flex-none"
|
||||
>
|
||||
<FieldLabel>结束时间</FieldLabel>
|
||||
<Input type="date" {...field} clearable />
|
||||
<Input type="date" {...field} />
|
||||
<FieldError>{fieldState.error?.message}</FieldError>
|
||||
</Field>
|
||||
)}
|
||||
|
||||
@@ -315,7 +315,7 @@ export default function BillingPage() {
|
||||
className="w-40 flex-none"
|
||||
>
|
||||
<FieldLabel>开始时间</FieldLabel>
|
||||
<Input type="date" {...field} clearable />
|
||||
<Input type="date" {...field} />
|
||||
<FieldError>{fieldState.error?.message}</FieldError>
|
||||
</Field>
|
||||
)}
|
||||
@@ -330,7 +330,7 @@ export default function BillingPage() {
|
||||
className="w-40 flex-none"
|
||||
>
|
||||
<FieldLabel>结束时间</FieldLabel>
|
||||
<Input type="date" {...field} clearable />
|
||||
<Input type="date" {...field} />
|
||||
<FieldError>{fieldState.error?.message}</FieldError>
|
||||
</Field>
|
||||
)}
|
||||
|
||||
@@ -11,13 +11,15 @@ import { DataTable, useDataTable } from "@/components/data-table"
|
||||
import { Page } from "@/components/page"
|
||||
import { Badge } from "@/components/ui/badge"
|
||||
import { Button } from "@/components/ui/button"
|
||||
import {
|
||||
Field,
|
||||
FieldError,
|
||||
FieldGroup,
|
||||
FieldLabel,
|
||||
} from "@/components/ui/field"
|
||||
import { Field, FieldError, FieldLabel } from "@/components/ui/field"
|
||||
import { Input } from "@/components/ui/input"
|
||||
import {
|
||||
Select,
|
||||
SelectContent,
|
||||
SelectItem,
|
||||
SelectTrigger,
|
||||
SelectValue,
|
||||
} from "@/components/ui/select"
|
||||
import type { Channel } from "@/models/channel"
|
||||
|
||||
type FilterValues = {
|
||||
@@ -29,6 +31,7 @@ type FilterValues = {
|
||||
node_ip?: string
|
||||
expired_at_start?: Date
|
||||
expired_at_end?: Date
|
||||
expired?: boolean
|
||||
}
|
||||
|
||||
const filterSchema = z
|
||||
@@ -41,6 +44,7 @@ const filterSchema = z
|
||||
node_ip: z.string().optional(),
|
||||
expired_at_start: z.string().optional(),
|
||||
expired_at_end: z.string().optional(),
|
||||
expired: z.enum(["all", "expired", "not_expired"]).optional(),
|
||||
})
|
||||
.superRefine((data, ctx) => {
|
||||
if (data.expired_at_start && data.expired_at_end) {
|
||||
@@ -81,6 +85,7 @@ export default function ChannelPage() {
|
||||
node_ip: "",
|
||||
expired_at_start: "",
|
||||
expired_at_end: "",
|
||||
expired: "all",
|
||||
},
|
||||
})
|
||||
|
||||
@@ -100,6 +105,13 @@ export default function ChannelPage() {
|
||||
result.expired_at_start = new Date(filters.expired_at_start)
|
||||
if (filters.expired_at_end)
|
||||
result.expired_at_end = new Date(filters.expired_at_end)
|
||||
if (filters.expired) {
|
||||
if (filters.expired === "expired") {
|
||||
result.expired = true
|
||||
} else if (filters.expired === "not_expired") {
|
||||
result.expired = false
|
||||
}
|
||||
}
|
||||
return getPageChannel({ page, size, ...result })
|
||||
})
|
||||
|
||||
@@ -110,7 +122,7 @@ export default function ChannelPage() {
|
||||
return (
|
||||
<Page>
|
||||
<form onSubmit={onFilter} className="bg-card p-4 rounded-lg">
|
||||
<div className="flex flex-wrap items-end gap-4">
|
||||
<div className="flex items-end flex-wrap gap-4">
|
||||
<Controller
|
||||
name="batch_no"
|
||||
control={control}
|
||||
@@ -201,10 +213,10 @@ export default function ChannelPage() {
|
||||
render={({ field, fieldState }) => (
|
||||
<Field
|
||||
data-invalid={fieldState.invalid}
|
||||
className="w-40 flex-none"
|
||||
className="w-48 flex-none"
|
||||
>
|
||||
<FieldLabel>开始时间</FieldLabel>
|
||||
<Input type="date" {...field} clearable />
|
||||
<Input type="datetime-local" step="1" {...field} />
|
||||
<FieldError>{fieldState.error?.message}</FieldError>
|
||||
</Field>
|
||||
)}
|
||||
@@ -215,17 +227,37 @@ export default function ChannelPage() {
|
||||
render={({ field, fieldState }) => (
|
||||
<Field
|
||||
data-invalid={fieldState.invalid}
|
||||
className="w-40 flex-none"
|
||||
className="w-48 flex-none"
|
||||
>
|
||||
<FieldLabel>结束时间</FieldLabel>
|
||||
<Input type="date" {...field} clearable />
|
||||
<Input type="datetime-local" step="1" {...field} />
|
||||
<FieldError>{fieldState.error?.message}</FieldError>
|
||||
</Field>
|
||||
)}
|
||||
/>
|
||||
<Controller
|
||||
name="expired"
|
||||
control={control}
|
||||
render={({ field, fieldState }) => (
|
||||
<Field
|
||||
data-invalid={fieldState.invalid}
|
||||
className="w-32 flex-none"
|
||||
>
|
||||
<FieldLabel>是否过期</FieldLabel>
|
||||
<Select value={field.value} onValueChange={field.onChange}>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder="请选择" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectItem value="all">全部</SelectItem>
|
||||
<SelectItem value="not_expired">未过期</SelectItem>
|
||||
<SelectItem value="expired">已过期</SelectItem>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
<FieldError>{fieldState.error?.message}</FieldError>
|
||||
</Field>
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<FieldGroup className="flex-row justify-start mt-4 gap-2">
|
||||
<Button type="submit">搜索</Button>
|
||||
<Button
|
||||
type="button"
|
||||
@@ -247,7 +279,7 @@ export default function ChannelPage() {
|
||||
>
|
||||
重置
|
||||
</Button>
|
||||
</FieldGroup>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<Suspense>
|
||||
@@ -296,7 +328,6 @@ export default function ChannelPage() {
|
||||
header: "节点",
|
||||
accessorFn: row => row.ip || row.edge_ref || row.edge_id,
|
||||
},
|
||||
|
||||
{
|
||||
header: "自动配置",
|
||||
cell: ({ row }) => {
|
||||
@@ -361,6 +392,15 @@ export default function ChannelPage() {
|
||||
)
|
||||
},
|
||||
},
|
||||
{
|
||||
header: "提取时间",
|
||||
accessorKey: "created_at",
|
||||
cell: ({ row }) =>
|
||||
format(
|
||||
new Date(row.original.created_at),
|
||||
"yyyy-MM-dd HH:mm:ss",
|
||||
),
|
||||
},
|
||||
{
|
||||
header: "过期时间",
|
||||
accessorKey: "expired_at",
|
||||
|
||||
@@ -206,7 +206,7 @@ export default function CustPage() {
|
||||
render={({ field, fieldState }) => (
|
||||
<Field data-invalid={fieldState.invalid} className="w-40 flex">
|
||||
<FieldLabel>开始时间</FieldLabel>
|
||||
<Input type="date" {...field} clearable />
|
||||
<Input type="date" {...field} />
|
||||
<FieldError>{fieldState.error?.message}</FieldError>
|
||||
</Field>
|
||||
)}
|
||||
@@ -218,7 +218,7 @@ export default function CustPage() {
|
||||
render={({ field, fieldState }) => (
|
||||
<Field data-invalid={fieldState.invalid} className="w-40 flex">
|
||||
<FieldLabel>结束时间</FieldLabel>
|
||||
<Input type="date" {...field} clearable />
|
||||
<Input type="date" {...field} />
|
||||
<FieldError>{fieldState.error?.message}</FieldError>
|
||||
</Field>
|
||||
)}
|
||||
@@ -262,7 +262,6 @@ export default function CustPage() {
|
||||
"yyyy-MM-dd HH:mm:ss",
|
||||
),
|
||||
},
|
||||
// { header: "邮箱", accessorKey: "email" },
|
||||
{
|
||||
header: "客户来源",
|
||||
accessorKey: "source",
|
||||
|
||||
@@ -208,7 +208,7 @@ export default function TradePage() {
|
||||
render={({ field, fieldState }) => (
|
||||
<Field data-invalid={fieldState.invalid} className="w-40 flex">
|
||||
<FieldLabel>开始时间</FieldLabel>
|
||||
<Input type="date" {...field} clearable />
|
||||
<Input type="date" {...field} />
|
||||
<FieldError>{fieldState.error?.message}</FieldError>
|
||||
</Field>
|
||||
)}
|
||||
@@ -220,7 +220,7 @@ export default function TradePage() {
|
||||
render={({ field, fieldState }) => (
|
||||
<Field data-invalid={fieldState.invalid} className="w-40 flex">
|
||||
<FieldLabel>结束时间</FieldLabel>
|
||||
<Input type="date" {...field} clearable />
|
||||
<Input type="date" {...field} />
|
||||
<FieldError>{fieldState.error?.message}</FieldError>
|
||||
</Field>
|
||||
)}
|
||||
|
||||
@@ -20,4 +20,5 @@ export type Channel = {
|
||||
ip: string
|
||||
user?: User
|
||||
resource?: Resource
|
||||
time?: Date
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user