@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.
@@ -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
- // initValue: { value: string | number, label?: ReactNode }
15
- const SearchSelect = ({ onValueChange, selectProps={}, selectDataUrl, initValue, modalTableProps={} }) => {
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 = initValue || (selectMode ? [] : null)
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({ 'qp-name-like': searchValue })
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 = (initParams, type=1) => {
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
- ...initParams,
67
- sorter: 'desc-createTime'
100
+ ...otherParams, // 默认参数
101
+ ...fixedParam,
102
+ ...params,
68
103
  }
104
+
69
105
  axios
70
- .get(`${selectDataUrl}?${stringify(queryParams)}`)
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?.items || [];
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
- setItems(res)
81
- setItemsTotal(Number(result.data?.total))
146
+ ctx?.form?.setFieldSource('supplierCode', source)
147
+ setItems(source)
148
+ setItemsTotal(Number(res?.total))
82
149
  } else {
83
- setTableData(res)
84
- setTablePagination({...tablePagination, total: Number(result.data?.total), pageSize: Number(result.data?.size), current: Number(result.data?.page)})
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
- setPopValue(value);
114
- onValueChange(value);
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 => ({ code: i.key, name: i.label })))
125
- setPopValue(value.map(i => ({ code: i.key, name: i.label })));
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([{ code: value.key, name: value.label }])
131
- setPopValue([{ code: value.key, name: value.label }]);
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
- const formatResult = value.map((i: any) => ({ key: i.code, label: i.name, value: i.code }))
145
- setValue(selectMode ? formatResult : formatResult[0])
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.code))
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])), 'code');
295
+ res = _.uniqBy(res.concat(mapRows(params[i])), 'value');
233
296
  } else {
234
297
  res.push(params[i]);
235
298
  // 去重
236
- res = _.uniqBy(res, 'code')
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, nowPage, type) => {
243
- // 处理全选 & 全选时进入某一页首次展示
244
- // if(type === 'checkAll') {
245
- // const totalFullPage = Math.floor(tablePagination.total / tableInitPageSize) // 整数页
246
- // const lastPage = tablePagination.total % tableInitPageSize // 最后一页剩余条数
247
- // const currentTableData = JSON.parse(JSON.stringify(tableData))
248
- // // 选中非最后一页
249
- // if(currentTableData.length === tableInitPageSize) {
250
- // for(var i = 0; i < totalFullPage; i++) {
251
- // doubleArr[i] = JSON.parse(JSON.stringify(tableData.map(i => ({ ...i, code: _.uniqueId('custom_') }))))
252
- // }
253
- // if(lastPage > 0) {
254
- // // 深拷贝 避免splice时候更改了tableData的指向地址
255
- // doubleArr[totalFullPage] = currentTableData.splice(0, lastPage)
256
- // }
257
- // } else {
258
- // for(var i = 0; i < totalFullPage; i++) {
259
- // const SwallowDigits = tableInitPageSize-currentTableData.length; // 需要补足位数
260
- // const SwallowDigitsArray = Array.from({length: SwallowDigits }); // 生成补足数组
261
- // doubleArr[i] = JSON.parse(JSON.stringify(tableData.concat(SwallowDigitsArray).map(i => ({ ...i, code: _.uniqueId('custom_') }))))
262
- // }
263
- // }
264
- // }
265
- // if(type === 'show') {}
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
- if(type === 'change') {
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, tablePagination?.current, 'change')
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={outerChange}
388
+ onChange={onChange}
332
389
  dropdownRender={menu => (
333
390
  <>
334
- <Input value={searchValue} style={{ width: '98%', marginLeft: '1%' }} placeholder="请输入" onChange={e=> onSearchChange(e)} onBlur={onSearchBlur} />
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
- <div style={{ textAlign: 'center'}}>
342
- <div style={{ marginBottom: 16 }}>
343
- <CopyOutlined style={{ fontSize: '50px' }} />
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.code} label={item.name}>
356
- {LightHeightOption({ text: `${item.code} ${item.name}`, filterTxt: searchValue })}
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';