@bit-sun/business-component 1.1.3 → 1.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/SearchSelect/business/BusinessSearchSelect.d.ts +2 -0
- package/dist/components/SearchSelect/business/BusinessUtils.d.ts +22 -0
- package/dist/components/SearchSelect/index.d.ts +1 -7
- package/dist/index.d.ts +1 -0
- package/dist/index.esm.js +492 -168
- package/dist/index.js +492 -167
- package/package.json +1 -1
- package/src/components/SearchSelect/business/BusinessSearchSelect.tsx +25 -0
- package/src/components/SearchSelect/business/BusinessUtils.ts +210 -0
- package/src/components/SearchSelect/business/index.md +56 -0
- package/src/components/SearchSelect/index.md +23 -15
- package/src/components/SearchSelect/index.tsx +166 -94
- package/src/index.ts +1 -0
|
@@ -3,7 +3,6 @@ import React, { useState, useEffect } from 'react';
|
|
|
3
3
|
import { useDebounceFn } from 'ahooks';
|
|
4
4
|
import { Input, Button, Modal, Select, Divider, message, Spin, Form, Table, Checkbox } from 'antd';
|
|
5
5
|
import { SearchOutlined, CopyOutlined, CaretLeftOutlined } from '@ant-design/icons';
|
|
6
|
-
import { QueryMutipleInput } from '@bit-sun/business-component';
|
|
7
6
|
import axios from 'axios';
|
|
8
7
|
import { stringify } from 'querystring';
|
|
9
8
|
import _ from "loadsh"
|
|
@@ -11,15 +10,26 @@ import './index.less';
|
|
|
11
10
|
|
|
12
11
|
const { Option } = Select;
|
|
13
12
|
|
|
14
|
-
|
|
15
|
-
const
|
|
13
|
+
const SearchSelect = (props: any) => {
|
|
14
|
+
const {
|
|
15
|
+
value,
|
|
16
|
+
onChange,
|
|
17
|
+
selectProps={},
|
|
18
|
+
modalTableProps={},
|
|
19
|
+
labelInValue=false,
|
|
20
|
+
requestConfig,
|
|
21
|
+
ctx,
|
|
22
|
+
} = props;
|
|
23
|
+
|
|
16
24
|
const selectMode = selectProps?.mode // 设定当前选择器 为单选或者多选模式 无设定为单选模式(默认)
|
|
17
|
-
const initVal =
|
|
25
|
+
const initVal = value || (selectMode ? [] : null);
|
|
18
26
|
const pageSize = 100 // 下拉框默认分页 条数
|
|
19
27
|
const tableInitPageSize = 10 // 弹框默认分页 条数
|
|
20
28
|
const currentPage = 1
|
|
29
|
+
const selectParamsKey = requestConfig?.filter || 'qp-codeAndName-like'
|
|
21
30
|
const currentSelectProps = {
|
|
22
31
|
...selectProps,
|
|
32
|
+
// 以下属性不可更改----设计配置项
|
|
23
33
|
showSearch: false,
|
|
24
34
|
filterOption: false,
|
|
25
35
|
allowClear: true,
|
|
@@ -34,12 +44,21 @@ const SearchSelect = ({ onValueChange, selectProps={}, selectDataUrl, initValue,
|
|
|
34
44
|
const [fetching, setFetching] = useState(false);
|
|
35
45
|
const [searchValue, setSearchValue] = useState('');
|
|
36
46
|
const [isModalVisible, setIsModalVisible] = useState(false);
|
|
37
|
-
const [value, setValue] = useState(initVal);
|
|
38
47
|
const [popvalue, setPopValue] = useState(initVal);
|
|
39
48
|
const { run } = useDebounceFn(
|
|
40
49
|
() => {
|
|
50
|
+
// 优化搜索参数 支持传多个
|
|
51
|
+
let searchParams = {};
|
|
52
|
+
if(typeof selectParamsKey === 'string') {
|
|
53
|
+
searchParams = { [selectParamsKey]: searchValue }
|
|
54
|
+
}
|
|
55
|
+
if(Array.isArray(selectParamsKey)) {
|
|
56
|
+
selectParamsKey.forEach((i: any) => {
|
|
57
|
+
searchParams = { ...searchParams, [i]: searchValue }
|
|
58
|
+
})
|
|
59
|
+
}
|
|
41
60
|
// 防抖函数 待定
|
|
42
|
-
getData(
|
|
61
|
+
getData(searchParams)
|
|
43
62
|
},
|
|
44
63
|
{
|
|
45
64
|
wait: 1000,
|
|
@@ -58,33 +77,78 @@ const SearchSelect = ({ onValueChange, selectProps={}, selectDataUrl, initValue,
|
|
|
58
77
|
const [indeterminate, setIndeterminate] = useState(false)
|
|
59
78
|
|
|
60
79
|
// 获取数据源 (type: 1下拉框 2弹框 不传值默认为下拉框)
|
|
61
|
-
const getData = (
|
|
80
|
+
const getData = (params={}, type=1) => {
|
|
81
|
+
if (!requestConfig) return;
|
|
82
|
+
const { url, otherParams, isMap, fixedparameter, fieldValToParam, mappingTextField='name', mappingValueField='code' } = requestConfig;
|
|
83
|
+
|
|
62
84
|
setFetching(true)
|
|
85
|
+
|
|
86
|
+
// 处理dependence参数
|
|
87
|
+
const fixedParam = {};
|
|
88
|
+
if (fixedparameter && fieldValToParam && ctx) {
|
|
89
|
+
fixedparameter.forEach((item: any, index: any) => {
|
|
90
|
+
const fixedParamVal = ctx.form.getFieldValue(fieldValToParam[index]);
|
|
91
|
+
if (fixedParamVal) {
|
|
92
|
+
fixedParam[item] = fixedParamVal;
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
63
97
|
const queryParams = {
|
|
64
98
|
pageSize,
|
|
65
99
|
currentPage,
|
|
66
|
-
...
|
|
67
|
-
|
|
100
|
+
...otherParams, // 默认参数
|
|
101
|
+
...fixedParam,
|
|
102
|
+
...params,
|
|
68
103
|
}
|
|
104
|
+
|
|
69
105
|
axios
|
|
70
|
-
.get(`${
|
|
71
|
-
.then((result) => {
|
|
106
|
+
.get(`${url}?${stringify(queryParams)}`)
|
|
107
|
+
.then((result: any) => {
|
|
72
108
|
setFetching(false)
|
|
73
109
|
result = result.data;
|
|
74
110
|
if (result.status !== '0') {
|
|
75
111
|
message.error(result.msg);
|
|
76
112
|
return;
|
|
77
113
|
}
|
|
78
|
-
const res = result.data
|
|
114
|
+
const res = result.data;
|
|
115
|
+
let source = [];
|
|
116
|
+
if (isMap) {
|
|
117
|
+
source = Object.keys(res).map((d, i) => {
|
|
118
|
+
return {
|
|
119
|
+
text: Object.values(res)[i],
|
|
120
|
+
value: d,
|
|
121
|
+
};
|
|
122
|
+
});
|
|
123
|
+
} else {
|
|
124
|
+
const keys = res.list ? 'list' : 'items';
|
|
125
|
+
source = res
|
|
126
|
+
? res[keys]
|
|
127
|
+
? res[keys].map((item: any) => {
|
|
128
|
+
return {
|
|
129
|
+
...item,
|
|
130
|
+
text: item[mappingTextField],
|
|
131
|
+
value: item[mappingValueField],
|
|
132
|
+
};
|
|
133
|
+
})
|
|
134
|
+
: Array.isArray(res) &&
|
|
135
|
+
res?.map((item: Record<string, any>) => {
|
|
136
|
+
return {
|
|
137
|
+
...item,
|
|
138
|
+
text: item[mappingTextField],
|
|
139
|
+
value: item[mappingValueField],
|
|
140
|
+
};
|
|
141
|
+
})
|
|
142
|
+
: [];
|
|
143
|
+
}
|
|
144
|
+
source = Array.isArray(source) ? source : []
|
|
79
145
|
if(type === 1) {
|
|
80
|
-
|
|
81
|
-
|
|
146
|
+
ctx?.form?.setFieldSource('supplierCode', source)
|
|
147
|
+
setItems(source)
|
|
148
|
+
setItemsTotal(Number(res?.total))
|
|
82
149
|
} else {
|
|
83
|
-
setTableData(
|
|
84
|
-
setTablePagination({...tablePagination, total: Number(
|
|
85
|
-
// if(checkedAll) {
|
|
86
|
-
// onChangeSelectedKeys(res.map((i) => i.code), res, result.data?.page, 'show')
|
|
87
|
-
// }
|
|
150
|
+
setTableData(source)
|
|
151
|
+
setTablePagination({...tablePagination, total: Number(res?.total), pageSize: Number(res?.size), current: Number(res?.page)})
|
|
88
152
|
}
|
|
89
153
|
})
|
|
90
154
|
.catch((err) => { setFetching(false) });
|
|
@@ -110,8 +174,10 @@ const SearchSelect = ({ onValueChange, selectProps={}, selectDataUrl, initValue,
|
|
|
110
174
|
}, [])
|
|
111
175
|
|
|
112
176
|
useEffect(() => {
|
|
113
|
-
|
|
114
|
-
|
|
177
|
+
if(value) {
|
|
178
|
+
setPopValue(value);
|
|
179
|
+
onChange(value);
|
|
180
|
+
}
|
|
115
181
|
}, [value]);
|
|
116
182
|
|
|
117
183
|
const showModal = () => {
|
|
@@ -120,15 +186,15 @@ const SearchSelect = ({ onValueChange, selectProps={}, selectDataUrl, initValue,
|
|
|
120
186
|
// 回显
|
|
121
187
|
if(value) {
|
|
122
188
|
if(selectMode) {
|
|
123
|
-
setSelectedRowKeys(value.map(i => i.key))
|
|
124
|
-
setSelectedRows(value.map(i => ({
|
|
125
|
-
setPopValue(value.map(i => ({
|
|
189
|
+
setSelectedRowKeys(labelInValue ? value.map(i => i.key) : value)
|
|
190
|
+
setSelectedRows(labelInValue ? value.map(i => ({ value: i.key, text: i.label })) : value.map(i => ({ value: i })))
|
|
191
|
+
setPopValue(labelInValue ? value.map(i => ({ value: i.key, text: i.label })) : value.map(i => ({ value: i })));
|
|
126
192
|
setIndeterminate(!!value.length && value.length < itemsTotal);
|
|
127
193
|
setCheckedAll(value.length === itemsTotal);
|
|
128
194
|
} else {
|
|
129
|
-
setSelectedRowKeys([value.key])
|
|
130
|
-
setSelectedRows([{
|
|
131
|
-
setPopValue([{
|
|
195
|
+
setSelectedRowKeys(labelInValue ? [value.key] : [value])
|
|
196
|
+
setSelectedRows(labelInValue ? [{ value: value.key, text: value.label }] : [{ value: value.key }])
|
|
197
|
+
setPopValue(labelInValue ? [{ value: value.key, text: value.label }] : [{ value: value.key }]);
|
|
132
198
|
}
|
|
133
199
|
}
|
|
134
200
|
};
|
|
@@ -141,8 +207,13 @@ const SearchSelect = ({ onValueChange, selectProps={}, selectDataUrl, initValue,
|
|
|
141
207
|
};
|
|
142
208
|
|
|
143
209
|
const formaData = (value) => {
|
|
144
|
-
|
|
145
|
-
|
|
210
|
+
if(labelInValue) {
|
|
211
|
+
const formatResult = value.map((i: any) => ({ key: i.code, label: i.name, value: i.code }))
|
|
212
|
+
onChange(selectMode ? formatResult : formatResult[0])
|
|
213
|
+
} else {
|
|
214
|
+
const formatResult = selectMode ? value.map((i: any) => i.value) : _.get(value[0], 'value')
|
|
215
|
+
onChange(formatResult)
|
|
216
|
+
}
|
|
146
217
|
};
|
|
147
218
|
|
|
148
219
|
const handleCancel = () => {
|
|
@@ -159,11 +230,6 @@ const SearchSelect = ({ onValueChange, selectProps={}, selectDataUrl, initValue,
|
|
|
159
230
|
run();
|
|
160
231
|
}
|
|
161
232
|
|
|
162
|
-
//( 多选模式下 选中数据再搜索 删除部分搜索内容会优先触发这个函数 删除掉已选中内容才会去触发onSearchChange函数进行搜索)
|
|
163
|
-
const outerChange = (sValue) => {
|
|
164
|
-
setValue(sValue);
|
|
165
|
-
};
|
|
166
|
-
|
|
167
233
|
const onSearchTable = () => {
|
|
168
234
|
const params = form.getFieldsValue();
|
|
169
235
|
getData({ ...params, pageSize: tableInitPageSize }, 2)
|
|
@@ -180,13 +246,10 @@ const SearchSelect = ({ onValueChange, selectProps={}, selectDataUrl, initValue,
|
|
|
180
246
|
|
|
181
247
|
const onChangeCheckAll = (e) => {
|
|
182
248
|
if(e.target.checked) {
|
|
183
|
-
//
|
|
184
|
-
// const currentTableData = JSON.parse(JSON.stringify(tableData))
|
|
185
|
-
// onChangeSelectedKeys(currentTableData.map((i) => i.code),currentTableData,tablePagination.current, 'checkAll')
|
|
186
|
-
// 方案二:如果下拉框有所有数据就处理选中所有,如果没有 就默认查出所有数据
|
|
249
|
+
// 如果下拉框有所有数据就处理选中所有,如果没有 就默认查出所有数据
|
|
187
250
|
if(items.length === itemsTotal) {
|
|
188
251
|
const currentItemsData = JSON.parse(JSON.stringify(items))
|
|
189
|
-
setSelectedRowKeys(currentItemsData.map(i => i.
|
|
252
|
+
setSelectedRowKeys(currentItemsData.map(i => i.value))
|
|
190
253
|
setSelectedRows(currentItemsData)
|
|
191
254
|
setPopValue(currentItemsData);
|
|
192
255
|
} else {
|
|
@@ -229,69 +292,63 @@ const SearchSelect = ({ onValueChange, selectProps={}, selectDataUrl, initValue,
|
|
|
229
292
|
for (var i = 0; i < params.length; i++) {
|
|
230
293
|
if (Array.isArray(params[i])) {
|
|
231
294
|
// 去重
|
|
232
|
-
res = _.uniqBy(res.concat(mapRows(params[i])), '
|
|
295
|
+
res = _.uniqBy(res.concat(mapRows(params[i])), 'value');
|
|
233
296
|
} else {
|
|
234
297
|
res.push(params[i]);
|
|
235
298
|
// 去重
|
|
236
|
-
res = _.uniqBy(res, '
|
|
299
|
+
res = _.uniqBy(res, 'value')
|
|
237
300
|
}
|
|
238
301
|
}
|
|
239
302
|
return res.filter(Boolean); //去掉undefined的情况
|
|
240
303
|
};
|
|
241
304
|
|
|
242
|
-
const onChangeSelectedKeys=(selectKeys,selectRows
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
// 勾选生成二维数组
|
|
268
|
-
doubleArr[nowPage ? nowPage - 1 : 0] = selectRows
|
|
269
|
-
// console.log(doubleArr)
|
|
270
|
-
setDoubleArr(doubleArr)
|
|
271
|
-
// 这块扁平化成为一位数组
|
|
272
|
-
const filterRows = mapRows(doubleArr);
|
|
273
|
-
// console.log(filterRows)
|
|
274
|
-
setFilterRows(filterRows)
|
|
275
|
-
|
|
276
|
-
const sksResult = filterRows.map((i) => i.code)
|
|
305
|
+
const onChangeSelectedKeys=(selectKeys,selectRows) => {
|
|
306
|
+
const nowPage = tablePagination?.current;
|
|
307
|
+
|
|
308
|
+
let filterRows = [];
|
|
309
|
+
let sksResult = [];
|
|
310
|
+
|
|
311
|
+
if(selectMode) {
|
|
312
|
+
// 处理多选分页累计选中
|
|
313
|
+
// 勾选生成二维数组
|
|
314
|
+
doubleArr[nowPage ? nowPage - 1 : 0] = selectRows
|
|
315
|
+
// console.log(doubleArr)
|
|
316
|
+
setDoubleArr(doubleArr)
|
|
317
|
+
// 这块扁平化成为一位数组
|
|
318
|
+
filterRows = mapRows(doubleArr);
|
|
319
|
+
// console.log(filterRows)
|
|
320
|
+
setFilterRows(filterRows)
|
|
321
|
+
|
|
322
|
+
sksResult = filterRows.map((i) => i.value)
|
|
323
|
+
} else {
|
|
324
|
+
// 处理单选
|
|
325
|
+
filterRows = selectRows;
|
|
326
|
+
sksResult = selectRows.map((i) => i.value)
|
|
327
|
+
}
|
|
328
|
+
|
|
277
329
|
setSelectedRowKeys(sksResult)
|
|
278
330
|
setSelectedRows(filterRows)
|
|
279
331
|
setPopValue(filterRows);
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
setIndeterminate(!!filterRows.length && filterRows.length < tablePagination?.total);
|
|
283
|
-
setCheckedAll(filterRows.length === tablePagination?.total);
|
|
284
|
-
}
|
|
332
|
+
setIndeterminate(!!filterRows.length && filterRows.length < tablePagination?.total);
|
|
333
|
+
setCheckedAll(filterRows.length === tablePagination?.total);
|
|
285
334
|
}
|
|
286
335
|
|
|
287
336
|
const rowSelection = {
|
|
288
337
|
type: selectMode ? 'checkbox' : 'radio',
|
|
289
338
|
selectedRowKeys,
|
|
290
339
|
onChange: (sks, srs) => {
|
|
291
|
-
onChangeSelectedKeys(sks, srs
|
|
340
|
+
onChangeSelectedKeys(sks, srs)
|
|
292
341
|
},
|
|
293
342
|
};
|
|
294
343
|
|
|
344
|
+
const onDoubleClickSelect = (e, record) => {
|
|
345
|
+
if(!selectMode) {
|
|
346
|
+
const srs = [JSON.parse(JSON.stringify(record))]
|
|
347
|
+
const sks = srs.map((i:any) => i.value)
|
|
348
|
+
onChangeSelectedKeys(sks, srs)
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
295
352
|
const themeColor = { color: '#1890ff' }
|
|
296
353
|
|
|
297
354
|
const formItem = (list) => {
|
|
@@ -326,24 +383,34 @@ const SearchSelect = ({ onValueChange, selectProps={}, selectDataUrl, initValue,
|
|
|
326
383
|
<div className="search_select_show" id='search_select_div'>
|
|
327
384
|
<Select
|
|
328
385
|
virtual
|
|
329
|
-
labelInValue
|
|
386
|
+
labelInValue={labelInValue}
|
|
330
387
|
value={value}
|
|
331
|
-
onChange={
|
|
388
|
+
onChange={onChange}
|
|
332
389
|
dropdownRender={menu => (
|
|
333
390
|
<>
|
|
334
|
-
<Input
|
|
391
|
+
<Input
|
|
392
|
+
value={searchValue}
|
|
393
|
+
style={{ width: '98%', marginLeft: '1%' }}
|
|
394
|
+
placeholder="请输入"
|
|
395
|
+
onChange={e=> onSearchChange(e)}
|
|
396
|
+
onBlur={onSearchBlur}
|
|
397
|
+
onKeyDown={(e) => {
|
|
398
|
+
// 阻止多选的冒泡
|
|
399
|
+
e.stopPropagation()
|
|
400
|
+
}}
|
|
401
|
+
/>
|
|
335
402
|
<Divider style={{ margin: '8px 0' }} />
|
|
336
403
|
{menu}
|
|
337
404
|
</>
|
|
338
405
|
)}
|
|
339
406
|
notFoundContent={
|
|
340
407
|
fetching ? <Spin size="small" /> :
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
408
|
+
<div style={{ textAlign: 'center'}}>
|
|
409
|
+
<div style={{ marginBottom: 16 }}>
|
|
410
|
+
<CopyOutlined style={{ fontSize: '50px' }} />
|
|
411
|
+
</div>
|
|
412
|
+
<div>无匹配结果,请更换其他内容再试</div>
|
|
344
413
|
</div>
|
|
345
|
-
<div>无匹配结果,请更换其他内容再试</div>
|
|
346
|
-
</div>
|
|
347
414
|
}
|
|
348
415
|
onPopupScroll={SelectScroll}
|
|
349
416
|
{...currentSelectProps}
|
|
@@ -352,8 +419,8 @@ const SearchSelect = ({ onValueChange, selectProps={}, selectDataUrl, initValue,
|
|
|
352
419
|
placeholder="请选择"
|
|
353
420
|
>
|
|
354
421
|
{items.map(item => (
|
|
355
|
-
<Option key={item.
|
|
356
|
-
{LightHeightOption({ text: `${item.
|
|
422
|
+
<Option key={item.value} label={item.text}>
|
|
423
|
+
{LightHeightOption({ text: `${item.value} ${item.text}`, filterTxt: searchValue })}
|
|
357
424
|
</Option>
|
|
358
425
|
))}
|
|
359
426
|
</Select>
|
|
@@ -371,7 +438,7 @@ const SearchSelect = ({ onValueChange, selectProps={}, selectDataUrl, initValue,
|
|
|
371
438
|
<Button key="back" onClick={handleCancel}>
|
|
372
439
|
取消
|
|
373
440
|
</Button>,
|
|
374
|
-
<Button key="submit" type="primary" onClick={handleOk}>
|
|
441
|
+
<Button key="submit" type="primary" onClick={handleOk} disabled={selectProps?.disabled || props?.disabled}>
|
|
375
442
|
确定
|
|
376
443
|
</Button>,
|
|
377
444
|
]}
|
|
@@ -384,7 +451,7 @@ const SearchSelect = ({ onValueChange, selectProps={}, selectDataUrl, initValue,
|
|
|
384
451
|
<div className={'select_list_columns'}>
|
|
385
452
|
<div className={'select_list_columns_tips'}>搜索</div>
|
|
386
453
|
<div className={'select_list_columns_formItems'}>
|
|
387
|
-
<Form form={form} layout='vertical'>
|
|
454
|
+
<Form form={form} layout='vertical' key='modalForm'>
|
|
388
455
|
{formItem(modalTableProps?.tableSearchForm)}
|
|
389
456
|
</Form>
|
|
390
457
|
</div>
|
|
@@ -409,6 +476,11 @@ const SearchSelect = ({ onValueChange, selectProps={}, selectDataUrl, initValue,
|
|
|
409
476
|
onChange={handleTableChange}
|
|
410
477
|
rowKey='code'
|
|
411
478
|
scroll={{ x: modalTableProps.overScrollX || 'max-content', y: modalTableProps.overScrollY || null }}
|
|
479
|
+
onRow={record => {
|
|
480
|
+
return {
|
|
481
|
+
onDoubleClick: event => onDoubleClickSelect(event, record),
|
|
482
|
+
};
|
|
483
|
+
}}
|
|
412
484
|
/>
|
|
413
485
|
{selectMode ? <div className={'select_list_selectAll'}><Checkbox indeterminate={indeterminate} checked={checkedAll} onChange={onChangeCheckAll} /> 全选所有页面</div> : ''}
|
|
414
486
|
</div>
|
package/src/index.ts
CHANGED
|
@@ -17,3 +17,4 @@ export { default as DataValidation } from './components/DataValidation';
|
|
|
17
17
|
export { default as QueryMutipleInput } from './components/QueryMutipleInput';
|
|
18
18
|
export { default as CheckOneUser } from './utils/CheckOneUser';
|
|
19
19
|
export { default as SearchSelect } from './components/SearchSelect';
|
|
20
|
+
export { default as BusinessSearchSelect } from './components/SearchSelect/business/BusinessSearchSelect';
|