You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

182 lines
4.8 KiB
Vue

<template>
<a-table :data-source="data" :columns="columns">
<template #filterDropdown="{ setSelectedfields, selectedfields, confirm, clearFilters, column }">
<div style="padding: 8px">
<a-input
:ref="c => (searchInput = c)"
:placeholder="`Search ${column.dataIndex}`"
:value="selectedfields[0]"
style="width: 188px; margin-bottom: 8px; display: block;"
@change="e => setSelectedfields(e.target.value ? [e.target.value] : [])"
@pressEnter="handleSearch(selectedfields, confirm, column.dataIndex)"
/>
<el-button
type="primary"
size="small"
style="width: 90px; margin-right: 8px"
@click="handleSearch(selectedfields, confirm, column.dataIndex)"
>
<template #icon><SearchOutlined /></template>
Search
</el-button>
<el-button size="small" style="width: 90px" @click="handleReset(clearFilters)">
Reset
</el-button>
</div>
</template>
<template #filterIcon="filtered">
<search-outlined :style="{ color: filtered ? '#108ee9' : undefined }" />
</template>
<template #customRender="{ text, record, index, column }">
<span v-if="searchText && searchedColumn === column.dataIndex">
<template
v-for="(fragment, i) in text
.toString()
.split(new RegExp(`(?<=${searchText})|(?=${searchText})`, 'i'))"
>
<mark v-if="fragment.toLowerCase() === searchText.toLowerCase()" class="highlight">
{{ fragment }}
</mark>
<template v-else>{{ fragment }}</template>
</template>
</span>
<template v-else>
{{ text }}
</template>
</template>
</a-table>
</template>
<script>
import { SearchOutlined } from '@ant-design/icons-vue';
const data = [
{
field: '1',
name: 'John Brown',
age: 32,
address: 'New York No. 1 Lake Park',
},
{
field: '2',
name: 'Joe Black',
age: 42,
address: 'London No. 1 Lake Park',
},
{
field: '3',
name: 'Jim Green',
age: 32,
address: 'Sidney No. 1 Lake Park',
},
{
field: '4',
name: 'Jim Red',
age: 32,
address: 'London No. 2 Lake Park',
},
];
export default {
components: {
SearchOutlined,
},
data() {
return {
data,
searchText: '',
searchInput: null,
searchedColumn: '',
columns: [
{
title: 'Name',
dataIndex: 'name',
field: 'name',
slots: {
filterDropdown: 'filterDropdown',
filterIcon: 'filterIcon',
customRender: 'customRender',
},
onFilter: (value, record) =>
record.name
.toString()
.toLowerCase()
.includes(value.toLowerCase()),
onFilterDropdownVisibleChange: visible => {
if (visible) {
setTimeout(() => {
console.log(this.searchInput);
this.searchInput.focus();
}, 0);
}
},
},
{
title: 'Age',
dataIndex: 'age',
field: 'age',
slots: {
filterDropdown: 'filterDropdown',
filterIcon: 'filterIcon',
customRender: 'customRender',
},
onFilter: (value, record) =>
record.age
.toString()
.toLowerCase()
.includes(value.toLowerCase()),
onFilterDropdownVisibleChange: visible => {
if (visible) {
setTimeout(() => {
this.searchInput.focus();
});
}
},
},
{
title: 'Address',
dataIndex: 'address',
field: 'address',
slots: {
filterDropdown: 'filterDropdown',
filterIcon: 'filterIcon',
customRender: 'customRender',
},
onFilter: (value, record) =>
record.address
.toString()
.toLowerCase()
.includes(value.toLowerCase()),
onFilterDropdownVisibleChange: visible => {
if (visible) {
setTimeout(() => {
this.searchInput.focus();
});
}
},
},
],
};
},
methods: {
handleSearch(selectedfields, confirm, dataIndex) {
confirm();
console.log(selectedfields[0]);
this.searchText = selectedfields[0];
this.searchedColumn = dataIndex;
this.$forceUpdate();
},
handleReset(clearFilters) {
clearFilters();
this.searchText = '';
},
},
};
</script>
<style lang="less" scoped>
::v-deep.highlight {
background-color: rgb(255, 192, 105);
padding: 0px;
}
</style>