@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.1",
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.1",
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": "994ee00d0f8515ba21e8522f0e66f717bc0859d9"
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, Switch } from '@gm-pc/react'
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
- this.setState({ loading: false })
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
- this._handleSelect(valuesToSelect)
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._handleSelect([])
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
- style={{ width: 48 }}
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
- const newAvailableData = open
338
- ? flatFilterData.filter((item) => !item.deleted)
339
- : flatFilterData
340
-
341
- const valuesToSelect = newAvailableData.map((item) => item.value)
342
- this._handleSelect(valuesToSelect)
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'>过滤已删除商品</span>
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: '180px',
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<void> | void
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> | void
131
+ onSearch?(searchWord: string, data: MoreSelectData<V>): Promise<void | any> | any
132
132
  /** 点击回调 */
133
133
  onClick?(selected: MoreSelectSelected<V>[]): void
134
134
 
@@ -6,6 +6,10 @@
6
6
  border-radius: calc(var(--gm-switch-size-height) / 2);
7
7
  background-color: var(--gm-color-bg-switch);
8
8
 
9
+ &.gm-switch-small {
10
+ --gm-switch-size-height: 16px;
11
+ }
12
+
9
13
  &::before {
10
14
  position: absolute;
11
15
  content: '';
@@ -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'