@gm-pc/react 1.28.1-beta.0 → 1.28.1-beta.2

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.1-beta.0",
3
+ "version": "1.28.1-beta.2",
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.1-beta.0",
27
+ "@gm-pc/locales": "^1.28.1-beta.2",
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": "21e6355e34d987a7243fbdb16d3d3c4981a59344"
51
+ "gitHead": "16774306f2bd425112cf4279f4aa844b5ec9d2ee"
52
52
  }
@@ -4,12 +4,14 @@ import { xor, flatMap, isNil, noop } from 'lodash'
4
4
  import { ListBaseProps } from './types'
5
5
  import { ListDataItem } from '../../types'
6
6
  import { ConfigConsumer } from '../config_provider'
7
+ import SVGOk from '../../svg/ok.svg'
7
8
 
8
9
  class Base<V = any> extends Component<ListBaseProps<V>> {
9
10
  static defaultProps = {
10
11
  onSelect: noop,
11
12
  renderItem: (value: any) => value.text,
12
13
  getItemProps: () => ({}),
14
+ showSelectedIcon: true,
13
15
  }
14
16
 
15
17
  private _listRef = createRef<HTMLDivElement>()
@@ -61,9 +63,9 @@ class Base<V = any> extends Component<ListBaseProps<V>> {
61
63
  }
62
64
  const { multiple, selected, onSelect } = this.props
63
65
  if (multiple) {
64
- onSelect && onSelect(xor(selected, [item.value]))
66
+ onSelect && onSelect(xor(selected, [item.value]), item)
65
67
  } else {
66
- onSelect && onSelect([item.value])
68
+ onSelect && onSelect([item.value], item)
67
69
  }
68
70
  }
69
71
 
@@ -79,6 +81,7 @@ class Base<V = any> extends Component<ListBaseProps<V>> {
79
81
  className,
80
82
  willActiveIndex,
81
83
  getItemProps,
84
+ showSelectedIcon,
82
85
  ...rest
83
86
  } = this.props
84
87
 
@@ -115,6 +118,9 @@ class Base<V = any> extends Component<ListBaseProps<V>> {
115
118
  onClick={() => this._handleSelect(item)}
116
119
  >
117
120
  {renderItem!(item, index)}
121
+ {multiple && showSelectedIcon && selected.includes(item.value) && (
122
+ <SVGOk />
123
+ )}
118
124
  </div>
119
125
  )
120
126
  })}
@@ -15,6 +15,8 @@
15
15
 
16
16
  &.active {
17
17
  color: var(--gm-color-primary-active);
18
+ display: flex;
19
+ justify-content: space-between;
18
20
  }
19
21
 
20
22
  .gmDisabledWith();
@@ -12,12 +12,14 @@ interface CommonListProps<V> {
12
12
  getItemProps?(item: ListDataItem<V>): HTMLAttributes<HTMLDivElement>
13
13
  className?: string
14
14
  style?: CSSProperties
15
+ /** 是否显示选中状态的图标,默认为 true */
16
+ showSelectedIcon?: boolean
15
17
  }
16
18
 
17
19
  interface ListBaseProps<V> extends CommonListProps<V> {
18
20
  data: ListGroupDataItem<V>[]
19
21
  selected: V[]
20
- onSelect?(selected: V[]): void
22
+ onSelect?(selected: V[], item: ListDataItem<V>): void
21
23
  }
22
24
 
23
25
  interface ListProps<V> extends CommonListProps<V> {
@@ -31,6 +31,9 @@ interface MoreSelectBaseState {
31
31
  isCheckedAll: boolean
32
32
  isFilterDelete: boolean
33
33
  displayCount: number
34
+ // isPopupJustOpened: boolean
35
+ previousSelected?: MoreSelectDataItem<V>[]
36
+ previousCurrentSelected: MoreSelectDataItem<V>[]
34
37
  }
35
38
 
36
39
  // @todo keydown item disabled
@@ -49,6 +52,8 @@ class MoreSelectBase<V extends string | number = string> extends Component<
49
52
  isCheckedAll: false,
50
53
  isFilterDelete: true,
51
54
  displayCount: 0,
55
+ previousSelected: [],
56
+ previousCurrentSelected: [],
52
57
  }
53
58
 
54
59
  private _isUnmounted = false
@@ -176,6 +181,10 @@ class MoreSelectBase<V extends string | number = string> extends Component<
176
181
  const { onSearch } = this.props
177
182
  const searchValue = event.target.value
178
183
  this.setState({ searchValue })
184
+ this.setState({
185
+ previousSelected: this.props.selected,
186
+ previousCurrentSelected: this.props.selected,
187
+ })
179
188
  if (onSearch && !this._isUnmounted) {
180
189
  this.setState({
181
190
  loading: true,
@@ -206,8 +215,10 @@ class MoreSelectBase<V extends string | number = string> extends Component<
206
215
 
207
216
  private _debounceDoSearch = _.debounce(this._doSearch, this.props.delay)
208
217
 
209
- private _handleClear = (clearItem: MoreSelectDataItem<V>, event: MouseEvent): void => {
210
- event.stopPropagation()
218
+ private _handleClear = (clearItem: MoreSelectDataItem<V>, event?: MouseEvent): void => {
219
+ if (event) {
220
+ event.stopPropagation()
221
+ }
211
222
  const { onSelect = _.noop, selected = [] } = this.props
212
223
  const willSelected = selected.filter((item) => item.value !== clearItem.value)
213
224
  onSelect(willSelected)
@@ -330,6 +341,12 @@ class MoreSelectBase<V extends string | number = string> extends Component<
330
341
  new Set([...prevSelectedValue, ...valuesToSelect])
331
342
  )
332
343
  this._handleSelect(newSelected)
344
+ // 更新 previousCurrentSelected
345
+ this.setState({
346
+ previousCurrentSelected: Array.from(
347
+ new Set([...this.state.previousCurrentSelected, ...availableData])
348
+ ),
349
+ })
333
350
  } else {
334
351
  // 取消全选 - 只反勾选availableData的数据
335
352
  const { selected = [] } = this.props
@@ -338,6 +355,12 @@ class MoreSelectBase<V extends string | number = string> extends Component<
338
355
  (item) => !availableValues.includes(item.value)
339
356
  )
340
357
  this._handleSelect(newSelected.map((item) => item.value))
358
+ // 更新 previousCurrentSelected
359
+ this.setState({
360
+ previousCurrentSelected: this.state.previousCurrentSelected.filter(
361
+ (item) => !availableValues.includes(item.value)
362
+ ),
363
+ })
341
364
  }
342
365
  }}
343
366
  >
@@ -407,9 +430,11 @@ class MoreSelectBase<V extends string | number = string> extends Component<
407
430
  isGroupList,
408
431
  renderListItem,
409
432
  listHeight,
433
+ showSelectedIcon,
410
434
  } = this.props
435
+ const { previousSelected = [], previousCurrentSelected = [] } = this.state
411
436
 
412
- const selectedValues = new Set(selected?.map((v) => v.value))
437
+ const selectedValues = new Set(previousSelected?.map((v) => v.value))
413
438
 
414
439
  // 分离已勾选和未勾选的数据
415
440
  const availableGroups: MoreSelectGroupDataItem<V>[] = []
@@ -418,9 +443,10 @@ class MoreSelectBase<V extends string | number = string> extends Component<
418
443
 
419
444
  if (multiple) {
420
445
  filterData.forEach((group) => {
421
- const availableChildren = group.children.filter(
422
- (item) => !selectedValues.has(item.value)
423
- )
446
+ const availableChildren = group.children.filter((item) => {
447
+ // return true
448
+ return !selectedValues.has(item.value)
449
+ })
424
450
 
425
451
  if (availableChildren.length > 0) {
426
452
  availableGroups.push({
@@ -430,43 +456,65 @@ class MoreSelectBase<V extends string | number = string> extends Component<
430
456
  }
431
457
  })
432
458
 
433
- if (selected.length > 0) {
459
+ if (previousSelected.length > 0) {
434
460
  selectedGroups.push({
435
461
  label: '',
436
- children: selected,
462
+ children: previousSelected,
437
463
  })
438
464
  }
439
465
  }
440
466
 
441
467
  return (
442
468
  <div style={{ height: listHeight, overflow: 'auto' }}>
443
- {selected.length > 0 && multiple && (
469
+ {previousSelected.length > 0 && multiple && !this.state.searchValue && (
444
470
  <>
445
471
  <div className='gm-more-select-section-title gm-padding-5 gm-text-desc gm-text-12'>
446
472
  已选中
447
473
  </div>
448
474
  <ListBase
449
- selected={selected.map((v) => v.value)}
475
+ showSelectedIcon={showSelectedIcon}
476
+ selected={previousCurrentSelected.map((v) => v.value)}
450
477
  data={selectedGroups}
451
478
  multiple={multiple}
452
479
  isGroupList={false}
453
480
  className='gm-border-0'
454
481
  renderItem={renderListItem}
455
- onSelect={this._handleSelect}
482
+ onSelect={(v, target) => {
483
+ this._handleSelect(v)
484
+ // 判断是勾选还是反选:如果 v 中包含 target.value,说明是勾选操作;否则是反选操作
485
+ const isChecked = v.includes(target.value)
486
+ if (isChecked) {
487
+ // 勾选:添加到 previousCurrentSelected
488
+ this.setState({
489
+ previousCurrentSelected: [
490
+ ...this.state.previousCurrentSelected,
491
+ target,
492
+ ],
493
+ })
494
+ } else {
495
+ // 反选:从 previousCurrentSelected 中移除
496
+ this.setState({
497
+ previousCurrentSelected: this.state.previousCurrentSelected?.filter(
498
+ (item) => item.value !== target.value
499
+ ),
500
+ })
501
+ }
502
+ }}
456
503
  isScrollTo={false}
457
504
  />
458
505
  </>
459
506
  )}
460
507
  <>
461
- {multiple && (
508
+ {multiple && !this.state.searchValue && (
462
509
  <div className='gm-more-select-section-title gm-padding-5 gm-text-desc gm-text-12'>
463
510
  未选中
464
511
  </div>
465
512
  )}
466
513
 
467
514
  <ListBase
515
+ showSelectedIcon={showSelectedIcon}
468
516
  selected={selected?.map((v) => v.value)}
469
- data={multiple ? availableGroups : filterData}
517
+ data={multiple && !this.state.searchValue ? availableGroups : filterData}
470
518
  multiple={multiple}
471
519
  isGroupList={isGroupList}
472
520
  className='gm-border-0'
@@ -538,15 +586,21 @@ class MoreSelectBase<V extends string | number = string> extends Component<
538
586
  }
539
587
 
540
588
  private _handlePopoverVisibleChange = (active: boolean) => {
541
- if (active && this.props.searchOnActive) {
542
- const searchValue = localStorage.getItem('_GM-PC_MORESELECT_SEARCHVALUE')
543
- if (searchValue) {
544
- this.setState({ searchValue })
545
- setTimeout(() => {
546
- // eslint-disable-next-line no-unused-expressions
547
- this._inputRef.current?.select()
548
- this._debounceDoSearch(searchValue)
549
- }, 0)
589
+ if (active) {
590
+ this.setState({
591
+ previousSelected: this.props.selected,
592
+ previousCurrentSelected: this.props.selected,
593
+ })
594
+ if (this.props.searchOnActive) {
595
+ const searchValue = localStorage.getItem('_GM-PC_MORESELECT_SEARCHVALUE')
596
+ if (searchValue) {
597
+ this.setState({ searchValue })
598
+ setTimeout(() => {
599
+ // eslint-disable-next-line no-unused-expressions
600
+ this._inputRef.current?.select()
601
+ this._debounceDoSearch(searchValue)
602
+ }, 0)
603
+ }
550
604
  }
551
605
  }
552
606
  }
@@ -18,6 +18,7 @@ class MoreSelect<V = any> extends Component<MoreSelectProps<V>> {
18
18
  isShowDeletedSwitch: true,
19
19
  /** 是否展示全选 */
20
20
  isShowCheckedAll: true,
21
+ showSelectedIcon: true,
21
22
  }
22
23
 
23
24
  private _moreSelectBaseRef = createRef<MoreSelectBase>()
@@ -110,6 +110,7 @@ interface MoreSelectBaseProps<V extends string | number = string>
110
110
  isShowDeletedSwitch?: boolean
111
111
  /** 是否展示全选 */
112
112
  isShowCheckedAll?: boolean
113
+ showSelectedIcon?: boolean
113
114
  }
114
115
 
115
116
  type MoreSelectData<V extends string | number = string> =