feat:自定义筛选组件,优化用户输入跟踪,在筛选项顶部添加一个用户的原始输入 (#491)

Reviewed-on: daoyoucloud/tachycode#491
Co-authored-by: bai.jingfeng <bai.jingfeng@foxmail.com>
Co-committed-by: bai.jingfeng <bai.jingfeng@foxmail.com>
This commit is contained in:
bai.jingfeng 2024-03-25 21:34:08 +08:00 committed by sealday
parent 5134a3fce0
commit 4a295a216f
2 changed files with 32 additions and 20 deletions

View File

@ -1,6 +1,6 @@
{
"name": "@hera/plugin-core",
"version": "1.6.0",
"version": "1.6.1",
"displayName": "Hera platform",
"displayName.zh-CN": "赫拉平台",
"description": "Hera platform as nocobase plugin.",

View File

@ -1,4 +1,4 @@
import React, { useEffect, useState } from 'react';
import React, { useState } from 'react';
import { AutoComplete as AntdAutoComplete } from 'antd';
import { connect, useFieldSchema } from '@formily/react';
import { useAPIClient } from '@nocobase/client';
@ -8,42 +8,54 @@ import { fuzzysearch } from '../../utils';
export const AutoComplete = connect((props) => {
const { fieldNames, params: fieldFilter } = props;
const fieldSchema = useFieldSchema();
const [defultValue, setDefultValue] = useState([]);
const targetKey = fieldNames.value;
const api = useAPIClient();
const [defultOptions, setDefultOptions] = useState([]);
const [options, setOptions] = useState([]);
const getNoDuplicateTextOptions = (rawOptions) => {
const targetOptions = rawOptions.filter((option, index, self) => {
return self.findIndex((item) => item[targetKey] === option[targetKey]) === index;
});
return targetOptions;
};
useAsyncEffect(async () => {
const defultOptions = await api.request({
const {
data: { data: rawOptions },
} = await api.request({
url: fieldSchema['collectionName'] + ':list',
params: {
pageSize: 99999,
filter: fieldFilter ? { ...fieldFilter.filter } : {},
},
});
changLable(defultOptions?.data?.data);
const targetOptions = getNoDuplicateTextOptions(rawOptions);
setDefultOptions(targetOptions);
setOptions(targetOptions);
}, [fieldFilter?.filter, fieldSchema['collectionName']]);
useEffect(() => {
changLable(defultValue);
}, [fieldNames?.label]);
const changLable = (defultOptions) => {
if (defultOptions) {
const items = [];
defultOptions.forEach((item) => {
if (!items.filter((option) => option[fieldNames.value] === item[fieldNames.value]).length) {
items.push(item);
}
});
setDefultValue(items);
setOptions(items);
const onSearch = (value) => {
// 在筛选项开头跟踪用户的原始输入值
if (value) {
setOptions([
{
[targetKey]: value,
},
...defultOptions,
]);
} else {
setOptions(defultOptions);
}
};
return (
<AntdAutoComplete
{...props}
options={options}
filterOption={(inputValue, option) => fuzzysearch(inputValue, option[fieldNames.value].toString())}
filterOption={(inputValue, option) => fuzzysearch(inputValue, option[targetKey].toString())}
allowClear
onSearch={onSearch}
/>
);
});