Skip to content

Commit 5e4c7e1

Browse files
committed
feat(pro:search): support concludeAllSelected for select field (#1726)
1 parent 8120fdf commit 5e4c7e1

11 files changed

Lines changed: 54 additions & 11 deletions

File tree

packages/pro/locales/src/langs/en-US.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ const enUS: ProLocale = {
4141
ok: 'OK',
4242
cancel: 'Cancel',
4343
selectAll: 'Select All',
44+
allSelected: 'All',
4445
placeholder: 'Select filters and press Enter',
4546
switchToDatePanel: 'Select Date',
4647
switchToTimePanel: 'Select Time',

packages/pro/locales/src/langs/zh-CN.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ const zhCN: ProLocale = {
4141
ok: '确定',
4242
cancel: '取消',
4343
selectAll: '全选',
44+
allSelected: '全部',
4445
placeholder: '点击选择筛选条件, 按回车键确认',
4546
switchToDatePanel: '切换日期选择',
4647
switchToTimePanel: '切换时间选择',

packages/pro/locales/src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export interface ProSearchLocale {
3737
ok: string
3838
cancel: string
3939
selectAll: string
40+
allSelected: string
4041
placeholder: string
4142
switchToTimePanel: string
4243
switchToDatePanel: string

packages/pro/search/demo/Basic.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ const searchFields: SearchField[] = [
7474
fieldConfig: {
7575
multiple: true,
7676
searchable: true,
77+
showSelectAll: true,
78+
concludeAllSelected: true,
7779
dataSource: [
7880
{
7981
key: 'fatal',

packages/pro/search/demo/RemoteSearch.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ const searchFields = computed<SearchField[]>(() => [
110110
fieldConfig: {
111111
multiple: true,
112112
searchable: true,
113+
showSelectAll: true,
114+
concludeAllSelected: true,
113115
dataSource: selectData.value,
114116
virtual: true,
115117
searchFn: () => true,

packages/pro/search/docs/Api.zh.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ SelectSearchFieldConfig
119119
| `searchFn` | 搜索函数 | `(data: SelectPanelData, searchText: string) => boolean` | - | - | 默认模糊匹配 |
120120
| `separator` | 多选分隔符 | `string` | `'|'` | - | - |
121121
| `showSelectAll` | 是否支持全选 | `boolean` | `true` | - | - |
122+
| `concludeAllSelected` | 是否在值被全选时显示 "全部" | `boolean` | - | - | - |
122123
| `virtual` | 是否支持虚拟滚动 | `boolean` | `false` | - | 默认不支持 |
123124
| `onSearch` | 搜索回调函数 | `(searchValue: string) => void | ((searchValue: string) => void)[]` | - | - | 在触发搜索值改变时执行 |
124125

packages/pro/search/src/ProSearch.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,12 @@ export default defineComponent({
5555

5656
const searchValueContext = useSearchValues(props)
5757
const { searchValues } = searchValueContext
58-
const resolvedSearchFieldsContext = useResolvedSearchFields(searchFields, mergedPrefixCls, dateConfig)
58+
const resolvedSearchFieldsContext = useResolvedSearchFields(
59+
searchFields,
60+
mergedPrefixCls,
61+
dateConfig,
62+
locale.search,
63+
)
5964
const { fieldKeyMap } = resolvedSearchFieldsContext
6065
const searchStateContext = useSearchStates(props, fieldKeyMap, searchValueContext)
6166
const { searchStates, initSearchStates, clearSearchState, updateSearchValues, isSegmentVisible } =

packages/pro/search/src/composables/useResolvedSearchFields.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import type { ResolvedSearchField, SearchField, Segment } from '../types'
99
import type { VKey } from '@idux/cdk/utils'
1010
import type { DateConfig } from '@idux/components/config'
11+
import type { ProSearchLocale } from '@idux/pro/locales'
1112

1213
import { type ComputedRef, computed } from 'vue'
1314

@@ -29,6 +30,7 @@ export function useResolvedSearchFields(
2930
searchFields: ComputedRef<SearchField[]>,
3031
mergedPrefixCls: ComputedRef<string>,
3132
dateConfig: DateConfig,
33+
locale: ProSearchLocale,
3234
): ResolvedSearchFieldsContext {
3335
const resolvedSearchFields = computed(
3436
() =>
@@ -37,7 +39,7 @@ export function useResolvedSearchFields(
3739
...searchField,
3840
segments: [
3941
createOperatorSegment(mergedPrefixCls.value, searchField),
40-
...createSearchItemContentSegments(mergedPrefixCls.value, searchField, dateConfig),
42+
...createSearchItemContentSegments(mergedPrefixCls.value, searchField, dateConfig, locale),
4143
].filter(Boolean) as Segment[],
4244
}
4345
}) ?? [],
@@ -58,7 +60,12 @@ export function useResolvedSearchFields(
5860
}
5961
}
6062

61-
function createSearchItemContentSegments(prefixCls: string, searchField: SearchField, dateConfig: DateConfig) {
63+
function createSearchItemContentSegments(
64+
prefixCls: string,
65+
searchField: SearchField,
66+
dateConfig: DateConfig,
67+
locale: ProSearchLocale,
68+
) {
6269
if (searchField.type === 'multiSegment') {
6370
return searchField.fieldConfig.segments.map(segmentConfig =>
6471
createCustomSegment(prefixCls, dateConfig, segmentConfig),
@@ -68,7 +75,7 @@ function createSearchItemContentSegments(prefixCls: string, searchField: SearchF
6875
const segment = (() => {
6976
switch (searchField.type) {
7077
case 'select':
71-
return createSelectSegment(prefixCls, searchField.fieldConfig)
78+
return createSelectSegment(prefixCls, searchField.fieldConfig, locale)
7279
case 'treeSelect':
7380
return createTreeSelectSegment(prefixCls, searchField.fieldConfig)
7481
case 'cascader':

packages/pro/search/src/segments/CreateSelectSegment.tsx

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77

88
import type { PanelRenderContext, Segment, SelectPanelData, SelectSearchField } from '../types'
9+
import type { ProSearchLocale } from '@idux/pro/locales'
910

1011
import { isNil, toString } from 'lodash-es'
1112

@@ -19,6 +20,7 @@ const defaultSeparator = '|'
1920
export function createSelectSegment(
2021
prefixCls: string,
2122
config: SelectSearchField['fieldConfig'],
23+
locale: ProSearchLocale,
2224
): Segment<VKey | VKey[] | undefined> {
2325
const { dataSource, separator, searchable, showSelectAll, searchFn, multiple, virtual, onSearch } = config
2426

@@ -64,27 +66,44 @@ export function createSelectSegment(
6466
name: 'select',
6567
inputClassName: [`${prefixCls}-select-segment-input`],
6668
containerClassName: [`${prefixCls}-select-segment-container`],
67-
parse: input => parseInput(input, config),
68-
format: value => formatValue(value, config),
69+
parse: input => parseInput(input, config, locale.allSelected),
70+
format: value => formatValue(value, config, locale.allSelected),
6971
panelRenderer,
7072
}
7173
}
7274

73-
function parseInput(input: string, config: SelectSearchField['fieldConfig']): VKey | VKey[] | undefined {
74-
const { separator, dataSource, multiple } = config
75+
function parseInput(
76+
input: string,
77+
config: SelectSearchField['fieldConfig'],
78+
allSelected: string,
79+
): VKey | VKey[] | undefined {
80+
const { concludeAllSelected, separator, dataSource, multiple } = config
7581
const trimedInput = input.trim()
7682

77-
const keys = getKeyByLabels(dataSource, trimedInput.split(separator ?? defaultSeparator))
83+
const keys =
84+
concludeAllSelected && trimedInput === allSelected
85+
? dataSource.map(data => data.key)
86+
: getKeyByLabels(dataSource, trimedInput.split(separator ?? defaultSeparator))
7887

7988
return multiple ? (keys.length > 0 ? keys : undefined) : keys[0]
8089
}
8190

82-
function formatValue(value: VKey | VKey[] | undefined, config: SelectSearchField['fieldConfig']): string {
83-
const { dataSource, separator } = config
91+
function formatValue(
92+
value: VKey | VKey[] | undefined,
93+
config: SelectSearchField['fieldConfig'],
94+
allSelected: string,
95+
): string {
96+
const { concludeAllSelected, dataSource, separator } = config
8497
if (isNil(value)) {
8598
return ''
8699
}
87100

101+
const values = convertArray(value)
102+
103+
if (concludeAllSelected && values.length > 0 && values.length >= dataSource.length) {
104+
return allSelected
105+
}
106+
88107
return getLabelByKeys(dataSource, convertArray(value)).join(` ${separator ?? defaultSeparator} `)
89108
}
90109

packages/pro/search/src/types/searchFields.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ interface ResolvedSearchFieldBase<V = unknown> extends SearchFieldBase<V> {
5252
interface SelectSearchFieldBase {
5353
type: 'select'
5454
fieldConfig: {
55+
concludeAllSelected?: boolean
5556
dataSource: SelectPanelData[]
5657
multiple?: boolean
5758
searchable?: boolean

0 commit comments

Comments
 (0)