mirror of
https://github.com/ant-design/ant-design.git
synced 2025-06-07 17:44:35 +08:00
Filter Icon of Table (#5293)
* Filter Icon of Table + close #5287 + add `isFiltered` props for mark dataSource is filterd + improve CustomFilter Demo * fix doc * update * custome filter icon * custome filter icon
This commit is contained in:
parent
8409cff8db
commit
15e6133867
@ -15,6 +15,7 @@ export interface ColumnProps<T> {
|
|||||||
width?: string | number;
|
width?: string | number;
|
||||||
className?: string;
|
className?: string;
|
||||||
fixed?: boolean | ('left' | 'right');
|
fixed?: boolean | ('left' | 'right');
|
||||||
|
filterIcon?: React.ReactNode;
|
||||||
filteredValue?: any[];
|
filteredValue?: any[];
|
||||||
sortOrder?: boolean | ('ascend' | 'descend');
|
sortOrder?: boolean | ('ascend' | 'descend');
|
||||||
children?: ColumnProps<T>[];
|
children?: ColumnProps<T>[];
|
||||||
|
@ -862,7 +862,8 @@ exports[`renders ./components/table/demo/custom-filter-panel.md correctly 1`] =
|
|||||||
<span>
|
<span>
|
||||||
Name
|
Name
|
||||||
<i
|
<i
|
||||||
class="anticon anticon-filter ant-dropdown-trigger"
|
class="anticon anticon-smile-o ant-table-filter-icon ant-dropdown-trigger"
|
||||||
|
style="color:#aaa;"
|
||||||
title="筛选"
|
title="筛选"
|
||||||
/>
|
/>
|
||||||
</span>
|
</span>
|
||||||
|
@ -14,7 +14,7 @@ title:
|
|||||||
Implement a customized column search example via `filterDropdown`, `filterDropdownVisible` and `filterDropdownVisibleChange`.
|
Implement a customized column search example via `filterDropdown`, `filterDropdownVisible` and `filterDropdownVisibleChange`.
|
||||||
|
|
||||||
````jsx
|
````jsx
|
||||||
import { Table, Input, Button } from 'antd';
|
import { Table, Input, Button, Icon } from 'antd';
|
||||||
|
|
||||||
const data = [{
|
const data = [{
|
||||||
key: '1',
|
key: '1',
|
||||||
@ -43,6 +43,7 @@ class App extends React.Component {
|
|||||||
filterDropdownVisible: false,
|
filterDropdownVisible: false,
|
||||||
data,
|
data,
|
||||||
searchText: '',
|
searchText: '',
|
||||||
|
filtered: false,
|
||||||
};
|
};
|
||||||
onInputChange = (e) => {
|
onInputChange = (e) => {
|
||||||
this.setState({ searchText: e.target.value });
|
this.setState({ searchText: e.target.value });
|
||||||
@ -52,6 +53,7 @@ class App extends React.Component {
|
|||||||
const reg = new RegExp(searchText, 'gi');
|
const reg = new RegExp(searchText, 'gi');
|
||||||
this.setState({
|
this.setState({
|
||||||
filterDropdownVisible: false,
|
filterDropdownVisible: false,
|
||||||
|
filtered: !!searchText,
|
||||||
data: data.map((record) => {
|
data: data.map((record) => {
|
||||||
const match = record.name.match(reg);
|
const match = record.name.match(reg);
|
||||||
if (!match) {
|
if (!match) {
|
||||||
@ -78,6 +80,7 @@ class App extends React.Component {
|
|||||||
filterDropdown: (
|
filterDropdown: (
|
||||||
<div className="custom-filter-dropdown">
|
<div className="custom-filter-dropdown">
|
||||||
<Input
|
<Input
|
||||||
|
ref={ele => this.searchInput = ele}
|
||||||
placeholder="Search name"
|
placeholder="Search name"
|
||||||
value={this.state.searchText}
|
value={this.state.searchText}
|
||||||
onChange={this.onInputChange}
|
onChange={this.onInputChange}
|
||||||
@ -86,8 +89,9 @@ class App extends React.Component {
|
|||||||
<Button type="primary" onClick={this.onSearch}>Search</Button>
|
<Button type="primary" onClick={this.onSearch}>Search</Button>
|
||||||
</div>
|
</div>
|
||||||
),
|
),
|
||||||
|
filterIcon: <Icon type="smile-o" style={{ color: this.state.filtered ? '#108ee9' : '#aaa' }} />,
|
||||||
filterDropdownVisible: this.state.filterDropdownVisible,
|
filterDropdownVisible: this.state.filterDropdownVisible,
|
||||||
onFilterDropdownVisibleChange: visible => this.setState({ filterDropdownVisible: visible }),
|
onFilterDropdownVisibleChange: visible => this.setState({ filterDropdownVisible: visible }, () => this.searchInput.focus()),
|
||||||
}, {
|
}, {
|
||||||
title: 'Age',
|
title: 'Age',
|
||||||
dataIndex: 'age',
|
dataIndex: 'age',
|
||||||
|
@ -19,6 +19,7 @@ export interface FilterMenuProps {
|
|||||||
filterDropdownVisible?: boolean,
|
filterDropdownVisible?: boolean,
|
||||||
onFilterDropdownVisibleChange?: (visible: boolean) => any,
|
onFilterDropdownVisibleChange?: (visible: boolean) => any,
|
||||||
fixed?: boolean | string,
|
fixed?: boolean | string,
|
||||||
|
filterIcon?: React.ReactNode;
|
||||||
};
|
};
|
||||||
confirmFilter: (column: Object, selectedKeys: string[]) => any;
|
confirmFilter: (column: Object, selectedKeys: string[]) => any;
|
||||||
prefixCls: string;
|
prefixCls: string;
|
||||||
@ -168,6 +169,18 @@ export default class FilterMenu extends React.Component<FilterMenuProps, any> {
|
|||||||
this.setState({ keyPathOfSelectedItem });
|
this.setState({ keyPathOfSelectedItem });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
renderFilterIcon = () => {
|
||||||
|
const { column, locale, prefixCls } = this.props;
|
||||||
|
const filterIcon = column.filterIcon as any;
|
||||||
|
const dropdownSelectedClass = this.props.selectedKeys.length > 0 ? `${prefixCls}-selected` : '';
|
||||||
|
|
||||||
|
return filterIcon ? React.cloneElement(filterIcon as any, {
|
||||||
|
title: locale.filterTitle,
|
||||||
|
className: classNames(filterIcon.className, {
|
||||||
|
[`${prefixCls}-icon`]: true,
|
||||||
|
}),
|
||||||
|
}) : <Icon title={locale.filterTitle} type="filter" className={dropdownSelectedClass} />;
|
||||||
|
}
|
||||||
render() {
|
render() {
|
||||||
const { column, locale, prefixCls, dropdownPrefixCls } = this.props;
|
const { column, locale, prefixCls, dropdownPrefixCls } = this.props;
|
||||||
// default multiple selection in filter dropdown
|
// default multiple selection in filter dropdown
|
||||||
@ -209,9 +222,6 @@ export default class FilterMenu extends React.Component<FilterMenuProps, any> {
|
|||||||
</FilterDropdownMenuWrapper>
|
</FilterDropdownMenuWrapper>
|
||||||
);
|
);
|
||||||
|
|
||||||
const dropdownSelectedClass = (this.props.selectedKeys.length > 0)
|
|
||||||
? `${prefixCls}-selected` : '';
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Dropdown
|
<Dropdown
|
||||||
trigger={['click']}
|
trigger={['click']}
|
||||||
@ -219,7 +229,7 @@ export default class FilterMenu extends React.Component<FilterMenuProps, any> {
|
|||||||
visible={this.neverShown ? false : this.state.visible}
|
visible={this.neverShown ? false : this.state.visible}
|
||||||
onVisibleChange={this.onVisibleChange}
|
onVisibleChange={this.onVisibleChange}
|
||||||
>
|
>
|
||||||
<Icon title={locale.filterTitle} type="filter" className={dropdownSelectedClass} />
|
{this.renderFilterIcon()}
|
||||||
</Dropdown>
|
</Dropdown>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -92,7 +92,9 @@ One of Property `columns` for descriping column, Column has the same API.
|
|||||||
| filterDropdown | customized filter overlay | ReactNode | - |
|
| filterDropdown | customized filter overlay | ReactNode | - |
|
||||||
| filterDropdownVisible | whether filterDropdown is visible | boolean | - |
|
| filterDropdownVisible | whether filterDropdown is visible | boolean | - |
|
||||||
| onFilterDropdownVisibleChange | called when filterDropdownVisible is changed | function(visible) {} | - |
|
| onFilterDropdownVisibleChange | called when filterDropdownVisible is changed | function(visible) {} | - |
|
||||||
| filteredValue | controlled filtered value | string[] | - |
|
| filteredValue | controlled filtered value, filter icon will highlight. | string[] | - |
|
||||||
|
| filtered | whether the dataSource is filterd | boolean | false |
|
||||||
|
| filterIcon | customized filter icon | ReactNode | false |
|
||||||
| sorter | sort function for local sort, see [Array.sort](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)'s compareFunction. If you need sort buttons only, set it `true` | Function\|boolean | - |
|
| sorter | sort function for local sort, see [Array.sort](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)'s compareFunction. If you need sort buttons only, set it `true` | Function\|boolean | - |
|
||||||
| colSpan | span of this column's title | number | |
|
| colSpan | span of this column's title | number | |
|
||||||
| width | width of this column | string\|number | - |
|
| width | width of this column | string\|number | - |
|
||||||
|
@ -94,6 +94,8 @@ const columns = [{
|
|||||||
| filterDropdownVisible | 用于控制自定义筛选菜单是否可见 | boolean | - |
|
| filterDropdownVisible | 用于控制自定义筛选菜单是否可见 | boolean | - |
|
||||||
| onFilterDropdownVisibleChange | 自定义筛选菜单可见变化时调用 | function(visible) {} | - |
|
| onFilterDropdownVisibleChange | 自定义筛选菜单可见变化时调用 | function(visible) {} | - |
|
||||||
| filteredValue | 筛选的受控属性,外界可用此控制列的筛选状态,值为已筛选的 value 数组 | string[] | - |
|
| filteredValue | 筛选的受控属性,外界可用此控制列的筛选状态,值为已筛选的 value 数组 | string[] | - |
|
||||||
|
| filtered | 标识数据是否经过过滤,筛选图标会高亮 | boolean | false |
|
||||||
|
| filterIcon | 自定义 fiter 图标。| ReactNode | false |
|
||||||
| sorter | 排序函数,本地排序使用一个函数(参考 [Array.sort](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) 的 compareFunction),需要服务端排序可设为 true | Function\|boolean | - |
|
| sorter | 排序函数,本地排序使用一个函数(参考 [Array.sort](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) 的 compareFunction),需要服务端排序可设为 true | Function\|boolean | - |
|
||||||
| colSpan | 表头列合并,设置为 0 时,不渲染 | number | |
|
| colSpan | 表头列合并,设置为 0 时,不渲染 | number | |
|
||||||
| width | 列宽度 | string\|number | - |
|
| width | 列宽度 | string\|number | - |
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.@{iconfont-css-prefix}-filter {
|
.@{iconfont-css-prefix}-filter, .@{table-prefix-cls}-filter-icon {
|
||||||
margin-left: 4px;
|
margin-left: 4px;
|
||||||
font-size: @font-size-base;
|
font-size: @font-size-base;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
Loading…
Reference in New Issue
Block a user