@gm-pc/react 1.28.0-beta.1 → 1.28.0-beta.11
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gm-pc/react",
|
|
3
|
-
"version": "1.28.0-beta.
|
|
3
|
+
"version": "1.28.0-beta.11",
|
|
4
4
|
"description": "观麦前端基础组件库",
|
|
5
5
|
"author": "liyatang <liyatang@qq.com>",
|
|
6
6
|
"homepage": "https://github.com/gmfe/gm-pc#readme",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"@gm-common/hooks": "^2.10.0",
|
|
26
26
|
"@gm-common/tool": "^2.10.0",
|
|
27
|
-
"@gm-pc/locales": "^1.28.0-beta.
|
|
27
|
+
"@gm-pc/locales": "^1.28.0-beta.11",
|
|
28
28
|
"big.js": "^6.0.1",
|
|
29
29
|
"classnames": "^2.2.5",
|
|
30
30
|
"lodash": "^4.17.19",
|
|
@@ -48,5 +48,5 @@
|
|
|
48
48
|
"react-router-dom": "^5.2.0",
|
|
49
49
|
"react-window": "^1.8.5"
|
|
50
50
|
},
|
|
51
|
-
"gitHead": "
|
|
51
|
+
"gitHead": "740fa35594c216a01956599921e3ed94038ffdb3"
|
|
52
52
|
}
|
|
@@ -20,8 +20,8 @@ import { getLocale } from '@gm-pc/locales'
|
|
|
20
20
|
import { ListBase } from '../list'
|
|
21
21
|
import { findDOMNode } from 'react-dom'
|
|
22
22
|
import { ConfigConsumer, ConfigProvider, ConfigProviderProps } from '../config_provider'
|
|
23
|
-
import { Checkbox
|
|
24
|
-
|
|
23
|
+
import { Checkbox } from '../checkbox'
|
|
24
|
+
import { Switch } from '../switch'
|
|
25
25
|
interface MoreSelectBaseState {
|
|
26
26
|
searchValue: string
|
|
27
27
|
loading: boolean
|
|
@@ -172,8 +172,14 @@ class MoreSelectBase<V extends string | number = string> extends Component<
|
|
|
172
172
|
event: ChangeEvent<HTMLInputElement>,
|
|
173
173
|
isInitSearch?: boolean
|
|
174
174
|
): void => {
|
|
175
|
+
const { onSearch } = this.props
|
|
175
176
|
const searchValue = event.target.value
|
|
176
177
|
this.setState({ searchValue })
|
|
178
|
+
if (onSearch && !this._isUnmounted) {
|
|
179
|
+
this.setState({
|
|
180
|
+
loading: true,
|
|
181
|
+
})
|
|
182
|
+
}
|
|
177
183
|
this._debounceDoSearch(searchValue)
|
|
178
184
|
setTimeout(() => {
|
|
179
185
|
// eslint-disable-next-line no-unused-expressions
|
|
@@ -187,14 +193,12 @@ class MoreSelectBase<V extends string | number = string> extends Component<
|
|
|
187
193
|
private _doSearch = (query: string): void => {
|
|
188
194
|
const { onSearch, data = [] } = this.props
|
|
189
195
|
if (!this._isUnmounted && onSearch) {
|
|
190
|
-
const result = onSearch(query, data)
|
|
191
|
-
if (!result) {
|
|
192
|
-
return
|
|
193
|
-
}
|
|
194
196
|
this.setState({ loading: true })
|
|
195
|
-
|
|
197
|
+
const result = onSearch(query, data)
|
|
196
198
|
Promise.resolve(result).finally(() => {
|
|
197
|
-
|
|
199
|
+
setTimeout(() => {
|
|
200
|
+
this.setState({ loading: false })
|
|
201
|
+
}, 50)
|
|
198
202
|
})
|
|
199
203
|
}
|
|
200
204
|
}
|
|
@@ -243,9 +247,9 @@ class MoreSelectBase<V extends string | number = string> extends Component<
|
|
|
243
247
|
}
|
|
244
248
|
|
|
245
249
|
private _getFilterData = () => {
|
|
246
|
-
const { data = [], renderListFilter, renderListFilterType } = this.props
|
|
250
|
+
const { data = [], renderListFilter, renderListFilterType, onSearch } = this.props
|
|
247
251
|
const { searchValue } = this.state
|
|
248
|
-
let filterData: MoreSelectGroupDataItem<V>[]
|
|
252
|
+
let filterData: MoreSelectGroupDataItem<V>[] = []
|
|
249
253
|
if (renderListFilter) {
|
|
250
254
|
filterData = renderListFilter(data, searchValue)
|
|
251
255
|
} else if (renderListFilterType === 'pinyin') {
|
|
@@ -313,10 +317,20 @@ class MoreSelectBase<V extends string | number = string> extends Component<
|
|
|
313
317
|
if (isChecked) {
|
|
314
318
|
// 全选当前过滤后的可用数据
|
|
315
319
|
const valuesToSelect = availableData.map((item) => item.value)
|
|
316
|
-
|
|
320
|
+
const prevSelectedValue = selected.map((item) => item.value)
|
|
321
|
+
// console.log(valuesToSelect, selected)
|
|
322
|
+
const newSelected = Array.from(
|
|
323
|
+
new Set([...prevSelectedValue, ...valuesToSelect])
|
|
324
|
+
)
|
|
325
|
+
this._handleSelect(newSelected)
|
|
317
326
|
} else {
|
|
318
|
-
// 取消全选
|
|
319
|
-
this.
|
|
327
|
+
// 取消全选 - 只反勾选availableData的数据
|
|
328
|
+
const { selected = [] } = this.props
|
|
329
|
+
const availableValues = availableData.map((item) => item.value)
|
|
330
|
+
const newSelected = selected.filter(
|
|
331
|
+
(item) => !availableValues.includes(item.value)
|
|
332
|
+
)
|
|
333
|
+
this._handleSelect(newSelected.map((item) => item.value))
|
|
320
334
|
}
|
|
321
335
|
}}
|
|
322
336
|
>
|
|
@@ -327,36 +341,140 @@ class MoreSelectBase<V extends string | number = string> extends Component<
|
|
|
327
341
|
<Flex alignCenter>
|
|
328
342
|
<Flex row>
|
|
329
343
|
<Switch
|
|
330
|
-
|
|
344
|
+
size='small'
|
|
345
|
+
style={{ width: 32 }}
|
|
331
346
|
checked={isFilterDelete}
|
|
332
347
|
onChange={(open) => {
|
|
333
348
|
this.setState({
|
|
334
349
|
isFilterDelete: open,
|
|
335
350
|
})
|
|
336
|
-
if (isCheckedAll) {
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
}
|
|
351
|
+
// if (isCheckedAll) {
|
|
352
|
+
// const newAvailableData = open
|
|
353
|
+
// ? flatFilterData.filter((item) => !item.deleted)
|
|
354
|
+
// : flatFilterData
|
|
355
|
+
|
|
356
|
+
// const valuesToSelect = newAvailableData.map((item) => item.value)
|
|
357
|
+
// this._handleSelect(valuesToSelect)
|
|
358
|
+
// }
|
|
344
359
|
}}
|
|
345
360
|
/>
|
|
346
361
|
</Flex>
|
|
347
|
-
<span className='gm-margin-left-5'
|
|
362
|
+
<span className='gm-margin-left-5'>过滤已删除数据</span>
|
|
348
363
|
</Flex>
|
|
349
364
|
)}
|
|
350
365
|
</Flex>
|
|
351
366
|
)
|
|
352
367
|
}
|
|
353
368
|
|
|
369
|
+
renderContent = () => {
|
|
370
|
+
const { loading, willActiveIndex, isFilterDelete } = this.state
|
|
371
|
+
|
|
372
|
+
if (loading) {
|
|
373
|
+
return (
|
|
374
|
+
<Flex alignCenter justifyCenter className='gm-bg gm-padding-5'>
|
|
375
|
+
<Loading size='20px' />
|
|
376
|
+
</Flex>
|
|
377
|
+
)
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
let filterData = this._getFilterData()
|
|
381
|
+
|
|
382
|
+
// 如果开启了过滤已删除商品功能,需要过滤掉已删除的商品
|
|
383
|
+
if (isFilterDelete) {
|
|
384
|
+
filterData = filterData
|
|
385
|
+
.map((group) => ({
|
|
386
|
+
...group,
|
|
387
|
+
children: group.children.filter((item) => !item.deleted),
|
|
388
|
+
}))
|
|
389
|
+
.filter((group) => group.children.length > 0)
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
if (!loading && filterData.length === 0) {
|
|
393
|
+
return this._renderEmpty()
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
if (!loading && filterData.length > 0) {
|
|
397
|
+
const {
|
|
398
|
+
selected = [],
|
|
399
|
+
multiple,
|
|
400
|
+
isGroupList,
|
|
401
|
+
renderListItem,
|
|
402
|
+
listHeight,
|
|
403
|
+
} = this.props
|
|
404
|
+
|
|
405
|
+
const selectedValues = new Set(selected.map((v) => v.value))
|
|
406
|
+
|
|
407
|
+
// 分离已勾选和未勾选的数据
|
|
408
|
+
const selectedGroups: MoreSelectGroupDataItem<V>[] = []
|
|
409
|
+
const availableGroups: MoreSelectGroupDataItem<V>[] = []
|
|
410
|
+
|
|
411
|
+
filterData.forEach((group) => {
|
|
412
|
+
const selectedChildren = group.children.filter((item) =>
|
|
413
|
+
selectedValues.has(item.value)
|
|
414
|
+
)
|
|
415
|
+
const availableChildren = group.children.filter(
|
|
416
|
+
(item) => !selectedValues.has(item.value)
|
|
417
|
+
)
|
|
418
|
+
|
|
419
|
+
if (selectedChildren.length > 0) {
|
|
420
|
+
selectedGroups.push({
|
|
421
|
+
...group,
|
|
422
|
+
children: selectedChildren,
|
|
423
|
+
})
|
|
424
|
+
}
|
|
425
|
+
if (availableChildren.length > 0) {
|
|
426
|
+
availableGroups.push({
|
|
427
|
+
...group,
|
|
428
|
+
children: availableChildren,
|
|
429
|
+
})
|
|
430
|
+
}
|
|
431
|
+
})
|
|
432
|
+
|
|
433
|
+
return (
|
|
434
|
+
<div style={{ height: listHeight, overflow: 'auto' }}>
|
|
435
|
+
{selectedGroups.length > 0 && (
|
|
436
|
+
<>
|
|
437
|
+
<div className='gm-more-select-section-title gm-padding-5 gm-text-desc gm-text-12'>
|
|
438
|
+
已勾选
|
|
439
|
+
</div>
|
|
440
|
+
<ListBase
|
|
441
|
+
selected={selected.map((v) => v.value)}
|
|
442
|
+
data={selectedGroups}
|
|
443
|
+
multiple={multiple}
|
|
444
|
+
isGroupList={isGroupList}
|
|
445
|
+
className='gm-border-0'
|
|
446
|
+
renderItem={renderListItem}
|
|
447
|
+
onSelect={this._handleSelect}
|
|
448
|
+
isScrollTo={false}
|
|
449
|
+
willActiveIndex={willActiveIndex!}
|
|
450
|
+
/>
|
|
451
|
+
</>
|
|
452
|
+
)}
|
|
453
|
+
{availableGroups.length > 0 && (
|
|
454
|
+
<>
|
|
455
|
+
<div className='gm-more-select-section-title gm-padding-5 gm-text-desc gm-text-12'>
|
|
456
|
+
可选择的筛选项
|
|
457
|
+
</div>
|
|
458
|
+
<ListBase
|
|
459
|
+
selected={selected.map((v) => v.value)}
|
|
460
|
+
data={availableGroups}
|
|
461
|
+
multiple={multiple}
|
|
462
|
+
isGroupList={isGroupList}
|
|
463
|
+
className='gm-border-0'
|
|
464
|
+
renderItem={renderListItem}
|
|
465
|
+
onSelect={this._handleSelect}
|
|
466
|
+
isScrollTo={false}
|
|
467
|
+
willActiveIndex={willActiveIndex!}
|
|
468
|
+
/>
|
|
469
|
+
</>
|
|
470
|
+
)}
|
|
471
|
+
</div>
|
|
472
|
+
)
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
|
|
354
476
|
private _renderList = (config: ConfigProviderProps): ReactNode => {
|
|
355
477
|
const {
|
|
356
|
-
selected = [],
|
|
357
|
-
multiple,
|
|
358
|
-
isGroupList,
|
|
359
|
-
renderListItem,
|
|
360
478
|
searchPlaceholder,
|
|
361
479
|
listHeight,
|
|
362
480
|
popupClassName,
|
|
@@ -391,28 +509,7 @@ class MoreSelectBase<V extends string | number = string> extends Component<
|
|
|
391
509
|
placeholder={searchPlaceholder}
|
|
392
510
|
/>
|
|
393
511
|
</div>
|
|
394
|
-
<div style={{ height: listHeight }}>
|
|
395
|
-
{loading && (
|
|
396
|
-
<Flex alignCenter justifyCenter className='gm-bg gm-padding-5'>
|
|
397
|
-
<Loading size='20px' />
|
|
398
|
-
</Flex>
|
|
399
|
-
)}
|
|
400
|
-
{!loading && !filterData.length && this._renderEmpty()}
|
|
401
|
-
{!loading && !!filterData.length && (
|
|
402
|
-
<ListBase
|
|
403
|
-
selected={selected.map((v) => v.value)}
|
|
404
|
-
data={filterData}
|
|
405
|
-
multiple={multiple}
|
|
406
|
-
isGroupList={isGroupList}
|
|
407
|
-
className='gm-border-0'
|
|
408
|
-
renderItem={renderListItem}
|
|
409
|
-
onSelect={this._handleSelect}
|
|
410
|
-
isScrollTo
|
|
411
|
-
willActiveIndex={willActiveIndex!}
|
|
412
|
-
style={{ height: listHeight }}
|
|
413
|
-
/>
|
|
414
|
-
)}
|
|
415
|
-
</div>
|
|
512
|
+
<div style={{ height: listHeight }}>{this.renderContent()}</div>
|
|
416
513
|
{!loading &&
|
|
417
514
|
!!filterData.length &&
|
|
418
515
|
(renderCustomizedBottom
|
|
@@ -8,7 +8,7 @@ class MoreSelect<V = any> extends Component<MoreSelectProps<V>> {
|
|
|
8
8
|
renderSelected: (item: MoreSelectDataItem<any>) => item.text,
|
|
9
9
|
renderListItem: (item: MoreSelectDataItem<any>) => item.text,
|
|
10
10
|
delay: 500,
|
|
11
|
-
listHeight: '
|
|
11
|
+
listHeight: '280px',
|
|
12
12
|
renderListFilterType: 'default',
|
|
13
13
|
popoverType: 'focus',
|
|
14
14
|
onKeyDown: _.noop,
|
|
@@ -93,7 +93,7 @@ interface MoreSelectBaseProps<V extends string | number = string>
|
|
|
93
93
|
onSelect(selected: MoreSelectDataItem<V>[]): void
|
|
94
94
|
|
|
95
95
|
/** 搜索回调 */
|
|
96
|
-
onSearch?(searchWord: string, data: MoreSelectGroupDataItem<V>[]): Promise<
|
|
96
|
+
onSearch?(searchWord: string, data: MoreSelectGroupDataItem<V>[]): Promise<any> | any
|
|
97
97
|
/** 点击回调 */
|
|
98
98
|
onClick?(selected: MoreSelectSelected<V>[]): void
|
|
99
99
|
|
|
@@ -128,7 +128,7 @@ interface MoreSelectProps<V extends string | number = string>
|
|
|
128
128
|
onSelect?(selected?: MoreSelectSelected<V>): void
|
|
129
129
|
onChange?(value: V | V[]): void
|
|
130
130
|
/** 搜索回调 */
|
|
131
|
-
onSearch?(searchWord: string, data: MoreSelectData<V>): Promise<void> |
|
|
131
|
+
onSearch?(searchWord: string, data: MoreSelectData<V>): Promise<void | any> | any
|
|
132
132
|
/** 点击回调 */
|
|
133
133
|
onClick?(selected: MoreSelectSelected<V>[]): void
|
|
134
134
|
|
|
@@ -11,6 +11,7 @@ interface SwitchProps {
|
|
|
11
11
|
onChange?(checked: boolean): void
|
|
12
12
|
className?: string
|
|
13
13
|
style?: CSSProperties
|
|
14
|
+
size?: 'small' | 'middle'
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
interface SwitchState {
|
|
@@ -26,10 +27,11 @@ class Switch extends Component<SwitchProps, SwitchState> {
|
|
|
26
27
|
on: '',
|
|
27
28
|
off: '',
|
|
28
29
|
onChange: _.noop,
|
|
30
|
+
size: 'middle',
|
|
29
31
|
}
|
|
30
32
|
|
|
31
33
|
readonly state: SwitchState = {
|
|
32
|
-
checked: this.props.checked,
|
|
34
|
+
checked: !!this.props.checked,
|
|
33
35
|
labelWidth: null,
|
|
34
36
|
isReady: false,
|
|
35
37
|
}
|
|
@@ -53,7 +55,7 @@ class Switch extends Component<SwitchProps, SwitchState> {
|
|
|
53
55
|
UNSAFE_componentWillReceiveProps(nextProps: Readonly<SwitchProps>) {
|
|
54
56
|
if ('checked' in nextProps) {
|
|
55
57
|
this.setState({
|
|
56
|
-
checked: nextProps.checked,
|
|
58
|
+
checked: !!nextProps.checked,
|
|
57
59
|
})
|
|
58
60
|
}
|
|
59
61
|
}
|
|
@@ -82,6 +84,7 @@ class Switch extends Component<SwitchProps, SwitchState> {
|
|
|
82
84
|
disabled,
|
|
83
85
|
on,
|
|
84
86
|
off,
|
|
87
|
+
size,
|
|
85
88
|
...rest
|
|
86
89
|
} = this.props
|
|
87
90
|
|
|
@@ -101,8 +104,9 @@ class Switch extends Component<SwitchProps, SwitchState> {
|
|
|
101
104
|
ref={this._inputOffRef}
|
|
102
105
|
className={classNames('gm-switch gm-switch-' + type, className, {
|
|
103
106
|
disabled,
|
|
107
|
+
[`gm-switch-${size}`]: size,
|
|
104
108
|
})}
|
|
105
|
-
style={style}
|
|
109
|
+
style={style as any}
|
|
106
110
|
data-attr={this.state.labelWidth}
|
|
107
111
|
disabled={disabled}
|
|
108
112
|
type='checkbox'
|