feat(own): add filter
This commit is contained in:
@@ -18,13 +18,27 @@ import {
|
|||||||
getPersistedPageSizeOptions,
|
getPersistedPageSizeOptions,
|
||||||
resolvePageSizeWithinOptions,
|
resolvePageSizeWithinOptions,
|
||||||
} from "@/components/setting/pageSize"
|
} from "@/components/setting/pageSize"
|
||||||
import { Button, Group, Stack, Text, UnstyledButton } from "@mantine/core"
|
import {
|
||||||
|
Button,
|
||||||
|
Group,
|
||||||
|
Select,
|
||||||
|
Stack,
|
||||||
|
Text,
|
||||||
|
UnstyledButton,
|
||||||
|
} from "@mantine/core"
|
||||||
import { IconRefresh } from "@tabler/icons-react"
|
import { IconRefresh } from "@tabler/icons-react"
|
||||||
import { DataTableColumn } from "mantine-datatable"
|
import { DataTableColumn } from "mantine-datatable"
|
||||||
import { useCallback, useEffect, useMemo, useState } from "react"
|
import { useCallback, useEffect, useMemo, useState } from "react"
|
||||||
import classes from "../page.module.css"
|
import classes from "../page.module.css"
|
||||||
|
|
||||||
const DEFAULT_RECORDS_PER_PAGE_OPTIONS = [10, 15, 20, 50]
|
const DEFAULT_RECORDS_PER_PAGE_OPTIONS = [10, 15, 20, 50]
|
||||||
|
const REJECTED_FILTER_OPTIONS = [
|
||||||
|
{ value: "all", label: "全部" },
|
||||||
|
{ value: "true", label: "是" },
|
||||||
|
{ value: "false", label: "否" },
|
||||||
|
] as const
|
||||||
|
|
||||||
|
type RejectedFilterValue = (typeof REJECTED_FILTER_OPTIONS)[number]["value"]
|
||||||
|
|
||||||
export default function PersonalTaskTable() {
|
export default function PersonalTaskTable() {
|
||||||
const user_name = usePermissionStore((s) => s.user_name)
|
const user_name = usePermissionStore((s) => s.user_name)
|
||||||
@@ -47,6 +61,8 @@ export default function PersonalTaskTable() {
|
|||||||
const [totalItems, setTotalItems] = useState(0)
|
const [totalItems, setTotalItems] = useState(0)
|
||||||
const [records, setRecords] = useState<Task.SimpleTaskItem[]>([])
|
const [records, setRecords] = useState<Task.SimpleTaskItem[]>([])
|
||||||
const [loading, setLoading] = useState(false)
|
const [loading, setLoading] = useState(false)
|
||||||
|
const [rejectedFilter, setRejectedFilter] =
|
||||||
|
useState<RejectedFilterValue>("all")
|
||||||
|
|
||||||
const totalPages = useMemo(() => {
|
const totalPages = useMemo(() => {
|
||||||
return Math.max(1, Math.ceil(totalItems / pageSize))
|
return Math.max(1, Math.ceil(totalItems / pageSize))
|
||||||
@@ -59,13 +75,15 @@ export default function PersonalTaskTable() {
|
|||||||
const res = await getUserTaskList({
|
const res = await getUserTaskList({
|
||||||
page_number: page,
|
page_number: page,
|
||||||
page_size: pageSize,
|
page_size: pageSize,
|
||||||
|
rejected:
|
||||||
|
rejectedFilter === "all" ? undefined : rejectedFilter === "true",
|
||||||
})
|
})
|
||||||
setRecords(res?.simple_task_list ?? [])
|
setRecords(res?.simple_task_list ?? [])
|
||||||
setTotalItems(res?.total_items ?? 0)
|
setTotalItems(res?.total_items ?? 0)
|
||||||
} finally {
|
} finally {
|
||||||
setLoading(false)
|
setLoading(false)
|
||||||
}
|
}
|
||||||
}, [page, pageSize, user_name])
|
}, [page, pageSize, rejectedFilter, user_name])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
load()
|
load()
|
||||||
@@ -198,7 +216,32 @@ export default function PersonalTaskTable() {
|
|||||||
<Stack className={classes.dashboardSection}>
|
<Stack className={classes.dashboardSection}>
|
||||||
<SettingListHeader
|
<SettingListHeader
|
||||||
title="我的任务"
|
title="我的任务"
|
||||||
count={`共 ${totalItems} 条记录`}
|
count={
|
||||||
|
<Group gap="sm" align="center" wrap="wrap">
|
||||||
|
<Text span inherit>
|
||||||
|
共 {totalItems} 条记录
|
||||||
|
</Text>
|
||||||
|
<Group gap={6} align="center" wrap="wrap">
|
||||||
|
<Text span inherit>
|
||||||
|
是否返工
|
||||||
|
</Text>
|
||||||
|
<Select
|
||||||
|
data={REJECTED_FILTER_OPTIONS}
|
||||||
|
value={rejectedFilter}
|
||||||
|
onChange={(value) => {
|
||||||
|
if (!value) return
|
||||||
|
setRejectedFilter(value as RejectedFilterValue)
|
||||||
|
setPage(1)
|
||||||
|
}}
|
||||||
|
allowDeselect={false}
|
||||||
|
checkIconPosition="right"
|
||||||
|
size="xs"
|
||||||
|
w={112}
|
||||||
|
className={classes.dashboardHeaderSelect}
|
||||||
|
/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
}
|
||||||
actions={
|
actions={
|
||||||
<SettingHeaderActions>
|
<SettingHeaderActions>
|
||||||
<Button
|
<Button
|
||||||
|
|||||||
@@ -129,6 +129,25 @@
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dashboardHeaderSelect :global(.mantine-Input-input) {
|
||||||
|
min-height: 28px;
|
||||||
|
border-color: #e5e6eb;
|
||||||
|
border-radius: 4px;
|
||||||
|
background: #ffffff;
|
||||||
|
color: #1d2129;
|
||||||
|
font-size: 12px;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboardHeaderSelect :global(.mantine-Input-input:focus) {
|
||||||
|
border-color: #1874ff;
|
||||||
|
box-shadow: 0 0 0 2px rgba(24, 116, 255, 0.12);
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboardHeaderSelect :global(.mantine-Input-section) {
|
||||||
|
color: #86909c;
|
||||||
|
}
|
||||||
|
|
||||||
.dashboardFilterBar {
|
.dashboardFilterBar {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: minmax(0, 1fr) auto;
|
grid-template-columns: minmax(0, 1fr) auto;
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ export const getTaskWorkFlow = (id: number) => {
|
|||||||
export const getUserTaskList = (params: {
|
export const getUserTaskList = (params: {
|
||||||
page_size: number
|
page_size: number
|
||||||
page_number: number
|
page_number: number
|
||||||
|
rejected?: boolean
|
||||||
}) => {
|
}) => {
|
||||||
return httpFetch<Task.ResGetUserTaskList>({
|
return httpFetch<Task.ResGetUserTaskList>({
|
||||||
url: BASE_LABEL_API + `/api/v1/label_server/task/list_by_user`,
|
url: BASE_LABEL_API + `/api/v1/label_server/task/list_by_user`,
|
||||||
|
|||||||
@@ -459,6 +459,8 @@ export function SettingListHeader({
|
|||||||
actions,
|
actions,
|
||||||
className,
|
className,
|
||||||
}: SettingListHeaderProps) {
|
}: SettingListHeaderProps) {
|
||||||
|
const isPlainCount = typeof count === "string" || typeof count === "number"
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Group
|
<Group
|
||||||
justify="space-between"
|
justify="space-between"
|
||||||
@@ -469,7 +471,11 @@ export function SettingListHeader({
|
|||||||
<Group gap="xs">
|
<Group gap="xs">
|
||||||
<Text className={classes.listHeaderTitle}>{title}</Text>
|
<Text className={classes.listHeaderTitle}>{title}</Text>
|
||||||
{count !== undefined ? (
|
{count !== undefined ? (
|
||||||
|
isPlainCount ? (
|
||||||
<Text className={classes.listHeaderCount}>{count}</Text>
|
<Text className={classes.listHeaderCount}>{count}</Text>
|
||||||
|
) : (
|
||||||
|
<div className={classes.listHeaderCount}>{count}</div>
|
||||||
|
)
|
||||||
) : null}
|
) : null}
|
||||||
</Group>
|
</Group>
|
||||||
{actions}
|
{actions}
|
||||||
|
|||||||
Reference in New Issue
Block a user