@hi-ui/check-select 5.0.0-experimental.2 → 5.0.0-experimental.4

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.
@@ -107,7 +107,8 @@ var CheckSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
107
107
  renderExtraHeader = _a.renderExtraHeader,
108
108
  classNamesProp = _a.classNames,
109
109
  stylesProp = _a.styles,
110
- rest = tslib.__rest(_a, ["prefixCls", "role", "className", "children", "disabled", "clearable", "showCheckAll", "showOnlyShowChecked", "placeholder", "displayRender", "onSelect", "height", "itemHeight", "virtual", "visible", "onOpen", "onClose", "onClear", "appearance", "invalid", "dataSource", "searchOnInit", "filterOption", "searchable", "render", "renderExtraFooter", "onSearch", "onItemCreate", "creatableInSearch", "fieldNames", "checkedOnEntered", "customRender", "tagInputProps", "size", "prefix", "suffix", "onKeyDown", "keyword", "clearSearchOnClosed", "label", "showIndicator", "renderExtraHeader", "classNames", "styles"]);
110
+ innerRef = _a.innerRef,
111
+ rest = tslib.__rest(_a, ["prefixCls", "role", "className", "children", "disabled", "clearable", "showCheckAll", "showOnlyShowChecked", "placeholder", "displayRender", "onSelect", "height", "itemHeight", "virtual", "visible", "onOpen", "onClose", "onClear", "appearance", "invalid", "dataSource", "searchOnInit", "filterOption", "searchable", "render", "renderExtraFooter", "onSearch", "onItemCreate", "creatableInSearch", "fieldNames", "checkedOnEntered", "customRender", "tagInputProps", "size", "prefix", "suffix", "onKeyDown", "keyword", "clearSearchOnClosed", "label", "showIndicator", "renderExtraHeader", "classNames", "styles", "innerRef"]);
111
112
  var _useGlobalContext = core.useGlobalContext(),
112
113
  globalSize = _useGlobalContext.size,
113
114
  checkSelectConfig = _useGlobalContext.checkSelect;
@@ -332,12 +333,19 @@ var CheckSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
332
333
  setFocusedIndex(defaultIndex);
333
334
  }, [defaultIndex, menuVisible]);
334
335
  var renderDefaultFooter = function renderDefaultFooter() {
335
- var extra = renderExtraFooter ? renderExtraFooter() : null;
336
+ var CheckAllNode = /*#__PURE__*/React__default["default"].createElement(Checkbox__default["default"], {
337
+ indeterminate: showIndeterminate,
338
+ checked: showAllChecked,
339
+ onChange: toggleCheckAll,
340
+ disabled: !(dropdownItems === null || dropdownItems === void 0 ? void 0 : dropdownItems.length)
341
+ }, i18n.get('checkSelect.checkAll'));
342
+ var extra = renderExtraFooter ? renderExtraFooter(CheckAllNode) : null;
336
343
  if (showCheckAll) {
337
344
  return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(Checkbox__default["default"], {
338
345
  indeterminate: showIndeterminate,
339
346
  checked: showAllChecked,
340
- onChange: toggleCheckAll
347
+ onChange: toggleCheckAll,
348
+ disabled: !(dropdownItems === null || dropdownItems === void 0 ? void 0 : dropdownItems.length)
341
349
  }, i18n.get('checkSelect.checkAll')), extra);
342
350
  }
343
351
  return extra;
@@ -380,6 +388,40 @@ var CheckSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
380
388
  }
381
389
  return acc;
382
390
  }, {});
391
+ React.useImperativeHandle(innerRef, function () {
392
+ return {
393
+ checkAll: function checkAll(checked) {
394
+ if (checked === void 0) {
395
+ checked = true;
396
+ }
397
+ if (checked) {
398
+ if (!showAllChecked) toggleCheckAll();
399
+ } else {
400
+ if (showAllChecked) toggleCheckAll();
401
+ }
402
+ },
403
+ showOnlyChecked: function showOnlyChecked(onlyChecked) {
404
+ if (onlyChecked === void 0) {
405
+ onlyChecked = true;
406
+ }
407
+ if (!showOnlyShowChecked) return;
408
+ if (disabled) return;
409
+ if (onlyChecked) {
410
+ setFilterItems(function () {
411
+ return mergedData.filter(function (item) {
412
+ return value.includes(item.id);
413
+ });
414
+ });
415
+ menuVisibleAction.on();
416
+ expandedViewRef.current = 'onlyChecked';
417
+ } else {
418
+ if (filterItems) setFilterItems(null);
419
+ menuVisibleAction.on();
420
+ expandedViewRef.current = 'normal';
421
+ }
422
+ }
423
+ };
424
+ });
383
425
  return /*#__PURE__*/React__default["default"].createElement(context.CheckSelectProvider, {
384
426
  value: Object.assign(Object.assign({}, context$1), {
385
427
  classNames: classNames,
@@ -8,7 +8,7 @@
8
8
  * LICENSE file in the root directory of this source tree.
9
9
  */
10
10
  import { __rest } from 'tslib';
11
- import React, { forwardRef, useRef, useCallback, useMemo, useState, useEffect } from 'react';
11
+ import React, { forwardRef, useRef, useCallback, useMemo, useState, useEffect, useImperativeHandle } from 'react';
12
12
  import { getPrefixCls, cx } from '@hi-ui/classname';
13
13
  import { __DEV__ } from '@hi-ui/env';
14
14
  import { useCheckSelect } from './use-check-select.js';
@@ -93,7 +93,8 @@ var CheckSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
93
93
  renderExtraHeader = _a.renderExtraHeader,
94
94
  classNamesProp = _a.classNames,
95
95
  stylesProp = _a.styles,
96
- rest = __rest(_a, ["prefixCls", "role", "className", "children", "disabled", "clearable", "showCheckAll", "showOnlyShowChecked", "placeholder", "displayRender", "onSelect", "height", "itemHeight", "virtual", "visible", "onOpen", "onClose", "onClear", "appearance", "invalid", "dataSource", "searchOnInit", "filterOption", "searchable", "render", "renderExtraFooter", "onSearch", "onItemCreate", "creatableInSearch", "fieldNames", "checkedOnEntered", "customRender", "tagInputProps", "size", "prefix", "suffix", "onKeyDown", "keyword", "clearSearchOnClosed", "label", "showIndicator", "renderExtraHeader", "classNames", "styles"]);
96
+ innerRef = _a.innerRef,
97
+ rest = __rest(_a, ["prefixCls", "role", "className", "children", "disabled", "clearable", "showCheckAll", "showOnlyShowChecked", "placeholder", "displayRender", "onSelect", "height", "itemHeight", "virtual", "visible", "onOpen", "onClose", "onClear", "appearance", "invalid", "dataSource", "searchOnInit", "filterOption", "searchable", "render", "renderExtraFooter", "onSearch", "onItemCreate", "creatableInSearch", "fieldNames", "checkedOnEntered", "customRender", "tagInputProps", "size", "prefix", "suffix", "onKeyDown", "keyword", "clearSearchOnClosed", "label", "showIndicator", "renderExtraHeader", "classNames", "styles", "innerRef"]);
97
98
  var _useGlobalContext = useGlobalContext(),
98
99
  globalSize = _useGlobalContext.size,
99
100
  checkSelectConfig = _useGlobalContext.checkSelect;
@@ -318,12 +319,19 @@ var CheckSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
318
319
  setFocusedIndex(defaultIndex);
319
320
  }, [defaultIndex, menuVisible]);
320
321
  var renderDefaultFooter = function renderDefaultFooter() {
321
- var extra = renderExtraFooter ? renderExtraFooter() : null;
322
+ var CheckAllNode = /*#__PURE__*/React.createElement(Checkbox, {
323
+ indeterminate: showIndeterminate,
324
+ checked: showAllChecked,
325
+ onChange: toggleCheckAll,
326
+ disabled: !(dropdownItems === null || dropdownItems === void 0 ? void 0 : dropdownItems.length)
327
+ }, i18n.get('checkSelect.checkAll'));
328
+ var extra = renderExtraFooter ? renderExtraFooter(CheckAllNode) : null;
322
329
  if (showCheckAll) {
323
330
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Checkbox, {
324
331
  indeterminate: showIndeterminate,
325
332
  checked: showAllChecked,
326
- onChange: toggleCheckAll
333
+ onChange: toggleCheckAll,
334
+ disabled: !(dropdownItems === null || dropdownItems === void 0 ? void 0 : dropdownItems.length)
327
335
  }, i18n.get('checkSelect.checkAll')), extra);
328
336
  }
329
337
  return extra;
@@ -366,6 +374,40 @@ var CheckSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
366
374
  }
367
375
  return acc;
368
376
  }, {});
377
+ useImperativeHandle(innerRef, function () {
378
+ return {
379
+ checkAll: function checkAll(checked) {
380
+ if (checked === void 0) {
381
+ checked = true;
382
+ }
383
+ if (checked) {
384
+ if (!showAllChecked) toggleCheckAll();
385
+ } else {
386
+ if (showAllChecked) toggleCheckAll();
387
+ }
388
+ },
389
+ showOnlyChecked: function showOnlyChecked(onlyChecked) {
390
+ if (onlyChecked === void 0) {
391
+ onlyChecked = true;
392
+ }
393
+ if (!showOnlyShowChecked) return;
394
+ if (disabled) return;
395
+ if (onlyChecked) {
396
+ setFilterItems(function () {
397
+ return mergedData.filter(function (item) {
398
+ return value.includes(item.id);
399
+ });
400
+ });
401
+ menuVisibleAction.on();
402
+ expandedViewRef.current = 'onlyChecked';
403
+ } else {
404
+ if (filterItems) setFilterItems(null);
405
+ menuVisibleAction.on();
406
+ expandedViewRef.current = 'normal';
407
+ }
408
+ }
409
+ };
410
+ });
369
411
  return /*#__PURE__*/React.createElement(CheckSelectProvider, {
370
412
  value: Object.assign(Object.assign({}, context), {
371
413
  classNames: classNames,
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { UseCheckSelectProps } from './use-check-select';
3
3
  import type { HiBaseHTMLProps, HiBaseSizeEnum } from '@hi-ui/core';
4
- import { CheckSelectAppearanceEnum, CheckSelectDataItem, CheckSelectItemEventData, CheckSelectMergedItem } from './types';
4
+ import { CheckSelectAppearanceEnum, CheckSelectDataItem, CheckSelectItemEventData, CheckSelectMergedItem, CheckSelectHelper } from './types';
5
5
  import { TagInputMockProps } from '@hi-ui/tag-input';
6
6
  import { PickerProps, PickerSemanticName } from '@hi-ui/picker';
7
7
  import type { ComponentSemantic, SemanticClassNamesType, SemanticStylesType } from '@hi-ui/use-merge-semantic';
@@ -14,7 +14,7 @@ export type CheckSelectSemanticName = PickerSemanticName | 'option' | 'optionGro
14
14
  export type CheckSelectSemanticClassNames = SemanticClassNamesType<CheckSelectProps, CheckSelectSemanticName>;
15
15
  export type CheckSelectSemanticStyles = SemanticStylesType<CheckSelectProps, CheckSelectSemanticName>;
16
16
  export type CheckSelectSemantic = ComponentSemantic<CheckSelectSemanticClassNames, CheckSelectSemanticStyles>;
17
- export interface CheckSelectProps extends Omit<PickerProps, 'trigger' | 'scrollable' | 'header' | 'footer' | 'classNames' | 'styles'>, UseCheckSelectProps, CheckSelectSemantic {
17
+ export interface CheckSelectProps extends Omit<PickerProps, 'trigger' | 'scrollable' | 'header' | 'footer' | 'classNames' | 'styles' | 'innerRef'>, UseCheckSelectProps, CheckSelectSemantic {
18
18
  /**
19
19
  * 设置虚拟滚动容器的可视高度。暂不对外暴露
20
20
  * @private
@@ -86,7 +86,7 @@ export interface CheckSelectProps extends Omit<PickerProps, 'trigger' | 'scrolla
86
86
  /**
87
87
  * 自定义下拉菜单底部渲染
88
88
  */
89
- renderExtraFooter?: () => React.ReactNode;
89
+ renderExtraFooter?: (CheckAllNode?: React.ReactNode) => React.ReactNode;
90
90
  /**
91
91
  * 自定义下拉菜单顶部渲染
92
92
  */
@@ -143,6 +143,10 @@ export interface CheckSelectProps extends Omit<PickerProps, 'trigger' | 'scrolla
143
143
  * 是否展示箭头
144
144
  */
145
145
  showIndicator?: boolean;
146
+ /**
147
+ * 提供辅助方法的内部引用
148
+ */
149
+ innerRef?: React.Ref<CheckSelectHelper>;
146
150
  }
147
151
  export declare const CheckSelectOption: React.ForwardRefExoticComponent<Pick<CheckSelectOptionProps, keyof CheckSelectOptionProps> & React.RefAttributes<HTMLDivElement | null>>;
148
152
  export interface CheckSelectOptionProps extends HiBaseHTMLProps {
@@ -50,3 +50,18 @@ export interface FlattedCheckSelectDataItem extends CheckSelectDataItem {
50
50
  export interface CheckSelectItemEventData extends FlattedCheckSelectDataItem, CheckSelectRequiredProps {
51
51
  }
52
52
  export type CheckSelectAppearanceEnum = HiBaseAppearanceEnum | 'contained' | undefined;
53
+ /**
54
+ * CheckSelect 通过 innerRef 暴露的辅助方法
55
+ */
56
+ export interface CheckSelectHelper {
57
+ /**
58
+ * 全选/取消全选当前列表中的可选项
59
+ * @param checked 默认 true:全选 (非全选状态下);传 false 时取消全选 (全选状态下)
60
+ */
61
+ checkAll: (checked?: boolean) => void;
62
+ /**
63
+ * 仅显示已选 / 显示全部
64
+ * @param onlyChecked 默认 true:仅显示已选项并打开下拉;传 false 时显示全部并打开下拉
65
+ */
66
+ showOnlyChecked: (onlyChecked?: boolean) => void;
67
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hi-ui/check-select",
3
- "version": "5.0.0-experimental.2",
3
+ "version": "5.0.0-experimental.4",
4
4
  "description": "A sub-package for @hi-ui/hiui.",
5
5
  "keywords": [],
6
6
  "author": "HiUI <mi-hiui@xiaomi.com>",