fix(daily): fix multiselect

This commit is contained in:
zhangheng
2026-05-11 18:28:26 +08:00
parent 332d6ab5f1
commit a1565dc18e
8 changed files with 1090 additions and 86 deletions

View File

@@ -9,6 +9,8 @@ import {
useAllUserStore,
usePermissionStore,
} from "@/components/label/store/auth"
import { formatUserTreeOptions } from "@/components/tree-select/libs/util"
import { VirtualTreeSelect } from "@/components/tree-select/tree"
import {
Button,
Group,
@@ -46,42 +48,6 @@ function toTimeWithSeconds(value?: string) {
return value.length === 5 ? `${value}:00` : value
}
type LeaderTreeNode = {
title?: string
value?: string | number
children?: LeaderTreeNode[]
}
function flattenLeaderTree(
nodes: LeaderTreeNode[],
prefixTitle: string[] = []
): Array<{ label: string; value: string }> {
const result: Array<{ label: string; value: string }> = []
nodes.forEach((node) => {
const title = node.title ?? ""
const nextPrefix = title ? [...prefixTitle, title] : prefixTitle
const children = node.children ?? []
const hasChildren = children.length > 0
const valueRaw = node.value
if (hasChildren) {
result.push(...flattenLeaderTree(children, nextPrefix))
return
}
if (valueRaw === undefined || valueRaw === null) return
if (typeof valueRaw === "string" && valueRaw.includes("-")) return
result.push({
label: nextPrefix.join(" / "),
value: String(valueRaw),
})
})
return result
}
function HourRightSection() {
return (
<Text size="xs" c="dimmed">
@@ -181,9 +147,10 @@ export default function DailyReportModal(props: {
const user_name = usePermissionStore((s) => s.user_name)
const treeData = useAllUserStore((s) => s.treeData)
const leaderOptions = useMemo(() => {
return flattenLeaderTree(treeData ?? [])
}, [treeData])
const leaderOptions = useMemo(
() => formatUserTreeOptions(treeData ?? []),
[treeData]
)
const form = useForm({
initialValues: getEmptyFormValues(user_name),
@@ -419,16 +386,15 @@ export default function DailyReportModal(props: {
form.setFieldValue("project_id", value ?? "")
}
/>
<Select
label="任务组长"
<VirtualTreeSelect
mode="single"
data={leaderOptions}
searchable
clearable
{...form.getInputProps("leader_uid")}
value={form.values.leader_uid || null}
onChange={(value) =>
form.setFieldValue("leader_uid", value ?? "")
}
label="任务组长"
/>
<Select
label="工作类别"

View File

@@ -38,6 +38,8 @@ import {
IconSearch,
} from "@tabler/icons-react"
import { formatUserTreeOptions } from "@/components/tree-select/libs/util"
import { VirtualTreeSelect } from "@/components/tree-select/tree"
import { DateInput } from "@mantine/dates"
import dayjs from "dayjs"
import "dayjs/locale/zh-cn"
@@ -56,42 +58,6 @@ import {
} from "./config"
import classes from "./page.module.css"
type LeaderTreeNode = {
title?: string
value?: string | number
children?: LeaderTreeNode[]
}
function flattenLeaderTree(
nodes: LeaderTreeNode[],
prefixTitle: string[] = []
): Array<{ label: string; value: string }> {
const result: Array<{ label: string; value: string }> = []
nodes.forEach((node) => {
const title = node.title ?? ""
const nextPrefix = title ? [...prefixTitle, title] : prefixTitle
const children = node.children ?? []
const hasChildren = children.length > 0
const valueRaw = node.value
if (hasChildren) {
result.push(...flattenLeaderTree(children, nextPrefix))
return
}
if (valueRaw === undefined || valueRaw === null) return
if (typeof valueRaw === "string" && valueRaw.includes("-")) return
result.push({
label: nextPrefix.join(" / "),
value: String(valueRaw),
})
})
return result
}
function weekDayText(day: number) {
const list = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"]
return list[day] ?? "-"
@@ -129,9 +95,10 @@ function InlineFilterField({
export default function PersonReportPage() {
const treeData = useAllUserStore((s) => s.treeData)
const leaderOptions = useMemo(() => {
return flattenLeaderTree(treeData ?? [])
}, [treeData])
const leaderOptions = useMemo(
() => formatUserTreeOptions(treeData ?? []),
[treeData]
)
const defaultFilters = useMemo(() => {
return {
@@ -618,11 +585,9 @@ export default function PersonReportPage() {
<Collapse in={searchExpanded} transitionDuration={150} animateOpacity>
<div className={classes.filterExpandedGrid}>
<InlineFilterField label="任务组长">
<MultiSelect
<VirtualTreeSelect
mode="multiple"
data={leaderOptions}
searchable
clearable
placeholder="请选择组长"
value={filters.leader_uid}
onChange={(v) => setFilters((s) => ({ ...s, leader_uid: v }))}
/>