Release v0.1

This commit is contained in:
2025-11-12 23:33:46 +08:00

View File

@@ -1,5 +1,5 @@
import React from 'react'; import React from 'react';
import { Layout, Typography, Table, Grid, InputNumber, Button, Space, Tag, message, Modal, Dropdown, Input } from 'antd'; import { Layout, Typography, Table, Grid, InputNumber, Button, Space, Tag, message, Modal, Dropdown, Input, Select } from 'antd';
import type { FormInstance } from 'antd'; import type { FormInstance } from 'antd';
import type { ColumnsType, ColumnType } from 'antd/es/table'; import type { ColumnsType, ColumnType } from 'antd/es/table';
import type { FilterDropdownProps } from 'antd/es/table/interface'; import type { FilterDropdownProps } from 'antd/es/table/interface';
@@ -477,7 +477,7 @@ function buildNumberRangeFilter(dataIndex: keyof Resource, label: string): Colum
onClick={() => { onClick={() => {
const key = `${localMin ?? ''}:${localMax ?? ''}`; const key = `${localMin ?? ''}:${localMax ?? ''}`;
setSelectedKeys?.([key]); setSelectedKeys?.([key]);
confirm?.(); confirm?.({ closeDropdown: true });
}} }}
> >
@@ -485,8 +485,11 @@ function buildNumberRangeFilter(dataIndex: keyof Resource, label: string): Colum
<Button <Button
size="small" size="small"
onClick={() => { onClick={() => {
setLocalMin(undefined);
setLocalMax(undefined);
setSelectedKeys?.([]); setSelectedKeys?.([]);
clearFilters?.(); clearFilters?.();
confirm?.({ closeDropdown: true });
}} }}
> >
@@ -509,6 +512,64 @@ function buildNumberRangeFilter(dataIndex: keyof Resource, label: string): Colum
} as ColumnType<Resource>; } as ColumnType<Resource>;
} }
// 枚举筛选下拉(用于性别等枚举类列)
function buildEnumFilter(dataIndex: keyof Resource, label: string, options: Array<{ label: string; value: string }>): ColumnType<Resource> {
return {
title: label,
dataIndex,
key: String(dataIndex),
filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }: FilterDropdownProps) => {
const [val, setVal] = React.useState<string | undefined>(
(selectedKeys && selectedKeys[0] ? String(selectedKeys[0]) : undefined)
);
return (
<div className="byte-table-custom-filter" style={{ padding: 8 }}>
<Space direction="vertical" style={{ width: 200 }}>
<Select
allowClear
placeholder={`请选择${label}`}
value={val}
onChange={(v) => setVal(v)}
options={options}
style={{ width: '100%' }}
/>
<Space>
<Button
type="primary"
size="small"
icon={<SearchOutlined />}
onClick={() => {
setSelectedKeys?.(val ? [val] : []);
confirm?.({ closeDropdown: true });
}}
>
</Button>
<Button
size="small"
onClick={() => {
setVal(undefined);
setSelectedKeys?.([]);
clearFilters?.();
confirm?.({ closeDropdown: true });
}}
>
</Button>
</Space>
</Space>
</div>
);
},
onFilter: (filterValue: React.Key | boolean, record: Resource) =>
String((record as any)[dataIndex]) === String(filterValue),
render: (g: string) => {
const color = g === '男' ? 'blue' : g === '女' ? 'magenta' : 'default';
return <Tag color={color}>{g}</Tag>;
},
} as ColumnType<Resource>;
}
type Props = { inputOpen?: boolean; onCloseInput?: () => void; containerEl?: HTMLElement | null }; type Props = { inputOpen?: boolean; onCloseInput?: () => void; containerEl?: HTMLElement | null };
const ResourceList: React.FC<Props> = ({ inputOpen = false, onCloseInput, containerEl }) => { const ResourceList: React.FC<Props> = ({ inputOpen = false, onCloseInput, containerEl }) => {
@@ -649,21 +710,11 @@ const ResourceList: React.FC<Props> = ({ inputOpen = false, onCloseInput, contai
// 非移动端显示更多列 // 非移动端显示更多列
...(!isMobile ...(!isMobile
? [ ? [
{ buildEnumFilter('gender', '性别', [
title: '性别', { label: '男', value: '男' },
dataIndex: 'gender', { label: '女', value: '女' },
key: 'gender', { label: '其他/保密', value: '其他/保密' },
filters: [ ]),
{ text: '男', value: '男' },
{ text: '女', value: '女' },
{ text: '其他/保密', value: '其他/保密' },
],
onFilter: (value: React.Key | boolean, record: Resource) => String(record.gender) === String(value),
render: (g: string) => {
const color = g === '男' ? 'blue' : g === '女' ? 'magenta' : 'default';
return <Tag color={color}>{g}</Tag>;
},
},
buildNumberRangeFilter('age', '年龄'), buildNumberRangeFilter('age', '年龄'),
buildNumberRangeFilter('height', '身高'), buildNumberRangeFilter('height', '身高'),
{ {