fix(daily): fix multiselect
This commit is contained in:
@@ -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="工作类别"
|
||||
|
||||
@@ -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 }))}
|
||||
/>
|
||||
|
||||
Reference in New Issue
Block a user