@apdesign/web-react 1.3.4 → 1.4.1

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.
@@ -7,6 +7,7 @@ interface TreeListProps extends TreeSelectProps {
7
7
  filterNode: TreeProps['filterNode'];
8
8
  inputValue?: string;
9
9
  prefixCls?: string;
10
+ confirmCheck: () => void;
10
11
  }
11
12
  declare const _default: React.ForwardRefExoticComponent<TreeListProps & React.RefAttributes<unknown>>;
12
13
  export default _default;
@@ -61,10 +61,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
61
61
  var react_1 = __importStar(require("react"));
62
62
  var Tree_1 = __importDefault(require("../Tree"));
63
63
  var is_1 = require("../_util/is");
64
+ var ConfigProvider_1 = require("../ConfigProvider");
64
65
  function TreeList(props, ref) {
65
- var value = props.value, multiple = props.multiple, loadMore = props.loadMore, treeCheckedStrategy = props.treeCheckedStrategy, treeCheckStrictly = props.treeCheckStrictly, treeData = props.treeData, treeProps = props.treeProps, prefixCls = props.prefixCls, treeCheckable = props.treeCheckable;
66
+ var value = props.value, multiple = props.multiple, isQuickSingleSelectMode = props.isQuickSingleSelectMode, loadMore = props.loadMore, treeCheckedStrategy = props.treeCheckedStrategy, treeCheckStrictly = props.treeCheckStrictly, treeData = props.treeData, treeProps = props.treeProps, prefixCls = props.prefixCls, treeCheckable = props.treeCheckable, confirmCheck = props.confirmCheck;
67
+ var locale = (0, react_1.useContext)(ConfigProvider_1.ConfigContext).locale;
66
68
  var propsRenderTitle = treeProps && treeProps.renderTitle;
69
+ var propsRenderExtra = treeProps && treeProps.renderExtra;
67
70
  var treeRef = (0, react_1.useRef)();
71
+ var isMultipleQuickSelectMode = multiple && isQuickSingleSelectMode;
68
72
  var handleCheck = (0, react_1.useCallback)(function (keys, _a) {
69
73
  var checkedNodes = _a.checkedNodes, checked = _a.checked, node = _a.node;
70
74
  var newValue = keys.map(function (key) {
@@ -144,6 +148,69 @@ function TreeList(props, ref) {
144
148
  }
145
149
  return title;
146
150
  }, [prefixCls, props.inputValue, propsRenderTitle]);
151
+ var renderExtra = (0, react_1.useCallback)(function (nodeProps) {
152
+ var _a;
153
+ if (isMultipleQuickSelectMode) {
154
+ if (propsRenderExtra) {
155
+ console.warn('renderExtra is not recommended for use in quick single select mode');
156
+ }
157
+ return (react_1.default.createElement(react_1.default.Fragment, null,
158
+ react_1.default.createElement("span", { className: prefixCls + "-extra-QuickSingleSelect-button", style: {
159
+ position: 'absolute',
160
+ right: 0,
161
+ display: 'none',
162
+ backgroundColor: 'rgb(var(--primary-6))',
163
+ cursor: 'pointer',
164
+ color: 'white',
165
+ padding: '6px',
166
+ fontSize: 12,
167
+ paddingLeft: '20px',
168
+ clipPath: 'polygon(12px 50%, 0% 0%, 100% 0%, 100% 100%, 0% 100%)',
169
+ whiteSpace: 'nowrap',
170
+ }, onClick: function () {
171
+ // 为了兼容严格勾选模式,这边改成先清空勾选,再由树组件内部触发勾选,才能准确获取子节点父节点勾选数据
172
+ // onCheck 方法需要在 TreeContext 进行增加renderExtra的参数
173
+ // props.onChange([], {
174
+ // checked: false,
175
+ // trigger: nodeProps,
176
+ // });
177
+ // requestAnimationFrame(() => {
178
+ // onCheck(true, nodeProps._key, e);
179
+ // confirmCheck();
180
+ // });
181
+ // 上面有点UI卡顿体验不好 方案二 手动获取所有勾选的key,自己构造handleCheck参数
182
+ var treeCheckStrictly = props.treeCheckStrictly;
183
+ var checkedKeys;
184
+ var getAllCheckedKeys = function (node, keys) {
185
+ if (keys === void 0) { keys = []; }
186
+ if (Array.isArray(node.childrenData) && node.childrenData.length) {
187
+ node.childrenData.forEach(function (child) {
188
+ getAllCheckedKeys(child, keys);
189
+ });
190
+ }
191
+ else {
192
+ keys.push(node._key);
193
+ }
194
+ return keys;
195
+ };
196
+ if (treeCheckStrictly) {
197
+ checkedKeys = [nodeProps._key];
198
+ }
199
+ else {
200
+ // 找到所有允许勾选的子节点
201
+ checkedKeys = getAllCheckedKeys(nodeProps);
202
+ }
203
+ handleCheck(checkedKeys, {
204
+ checkedNodes: [],
205
+ checked: true,
206
+ node: { props: nodeProps }, // 不完整
207
+ });
208
+ confirmCheck();
209
+ } }, (_a = locale.Select) === null || _a === void 0 ? void 0 : _a.filterThisItemOnly), propsRenderExtra === null || propsRenderExtra === void 0 ? void 0 :
210
+ propsRenderExtra(nodeProps)));
211
+ }
212
+ return propsRenderExtra === null || propsRenderExtra === void 0 ? void 0 : propsRenderExtra(nodeProps);
213
+ }, [propsRenderExtra, isMultipleQuickSelectMode]);
147
214
  var extraProps = (0, react_1.useMemo)(function () {
148
215
  return props.treeCheckable
149
216
  ? {
@@ -163,6 +230,6 @@ function TreeList(props, ref) {
163
230
  }, []);
164
231
  return (react_1.default.createElement(Tree_1.default, __assign({ ref: treeRef, size: props.size, blockNode: true, filterNode: props.filterNode }, treeProps, { checkable: treeCheckable, multiple: multiple, loadMore: props.loadMore ? handleLoadMore : undefined, checkedStrategy: treeCheckedStrategy, checkStrictly: treeCheckStrictly, onMouseDown: function (e) {
165
232
  e.preventDefault();
166
- } }, extraProps, { treeData: treeData, fieldNames: props.fieldNames, renderTitle: renderTitle, onSelect: onSelect, selectedKeys: selectedKeys })));
233
+ } }, extraProps, { treeData: treeData, fieldNames: props.fieldNames, renderTitle: renderTitle, renderExtra: renderExtra, onSelect: onSelect, selectedKeys: selectedKeys })));
167
234
  }
168
235
  exports.default = (0, react_1.forwardRef)(TreeList);
@@ -113,6 +113,7 @@ var classNames_1 = __importDefault(require("../_util/classNames"));
113
113
  var useMergeProps_1 = __importDefault(require("../_util/hooks/useMergeProps"));
114
114
  var useIsFirstRender_1 = __importDefault(require("../_util/hooks/useIsFirstRender"));
115
115
  var useId_1 = __importDefault(require("../_util/hooks/useId"));
116
+ var Button_1 = __importDefault(require("../Button"));
116
117
  function isEmptyValue(value) {
117
118
  return (!value ||
118
119
  ((0, is_1.isArray)(value) && value.length === 0) ||
@@ -122,10 +123,11 @@ var defaultProps = {
122
123
  bordered: true,
123
124
  treeCheckedStrategy: Tree_1.default.SHOW_CHILD,
124
125
  fieldNames: interface_1.DefaultFieldNames,
126
+ isQuickSingleSelectMode: true,
125
127
  };
126
128
  var triggerPopupAlign = { bottom: 4 };
127
129
  var TreeSelect = function (baseProps, ref) {
128
- var _a = (0, react_1.useContext)(ConfigProvider_1.ConfigContext), getPrefixCls = _a.getPrefixCls, renderEmpty = _a.renderEmpty, componentConfig = _a.componentConfig, rtl = _a.rtl;
130
+ var _a = (0, react_1.useContext)(ConfigProvider_1.ConfigContext), getPrefixCls = _a.getPrefixCls, renderEmpty = _a.renderEmpty, componentConfig = _a.componentConfig, rtl = _a.rtl, locale = _a.locale;
129
131
  var props = (0, useMergeProps_1.default)(baseProps, defaultProps, componentConfig === null || componentConfig === void 0 ? void 0 : componentConfig.TreeSelect);
130
132
  var refIsFirstRender = (0, useIsFirstRender_1.default)();
131
133
  var triggerRef = (0, react_1.useRef)();
@@ -147,8 +149,9 @@ var TreeSelect = function (baseProps, ref) {
147
149
  // 触发 onInputValueChange 回调的原因
148
150
  var refOnInputChangeCallbackReason = (0, react_1.useRef)(null);
149
151
  var onInputValueChange = props.onInputValueChange;
150
- var _f = __read((0, useStateValue_1.default)(props, key2nodeProps, indeterminateKeys), 2), value = _f[0], setValue = _f[1];
151
152
  var multiple = props.multiple || props.treeCheckable;
153
+ var isMultipleQuickSelectMode = multiple && props.isQuickSingleSelectMode;
154
+ var _f = __read((0, useStateValue_1.default)(props, key2nodeProps, indeterminateKeys), 5), value = _f[0], setValue = _f[1], realValue = _f[2], confirmSetValue = _f[3], cancelSetValue = _f[4];
152
155
  var prefixCls = getPrefixCls('tree-select');
153
156
  var isFilterNode = inputValue && !(0, is_1.isFunction)(props.onSearch);
154
157
  // Unique ID of this select instance
@@ -158,6 +161,9 @@ var TreeSelect = function (baseProps, ref) {
158
161
  if (visible !== popupVisible) {
159
162
  setPopupVisible(visible);
160
163
  (_a = props.onVisibleChange) === null || _a === void 0 ? void 0 : _a.call(props, visible);
164
+ if (isMultipleQuickSelectMode && !visible) {
165
+ cancelSetValue();
166
+ }
161
167
  }
162
168
  };
163
169
  // 尝试更新 inputValue,并触发 onInputValueChange
@@ -230,6 +236,15 @@ var TreeSelect = function (baseProps, ref) {
230
236
  tryUpdatePopupVisible(false);
231
237
  }
232
238
  }, [setValue, resetInputValue, popupVisible]);
239
+ var cancelCheck = function () {
240
+ tryUpdatePopupVisible(false);
241
+ };
242
+ var confirmCheck = function () {
243
+ var _a;
244
+ confirmSetValue();
245
+ setPopupVisible(false);
246
+ (_a = props.onVisibleChange) === null || _a === void 0 ? void 0 : _a.call(props, false);
247
+ };
233
248
  var handleRemoveCheckedItem = function (item, index, e) {
234
249
  e.stopPropagation();
235
250
  if (item.disabled) {
@@ -237,21 +252,31 @@ var TreeSelect = function (baseProps, ref) {
237
252
  }
238
253
  var itemValue = (0, is_1.isObject)(item.value) ? item.value.value : item.value;
239
254
  if (!props.treeCheckable || props.treeCheckStrictly || !key2nodeProps[itemValue]) {
240
- var newValue = value.filter(function (_, i) { return i !== index; });
255
+ var newValue = realValue.filter(function (_, i) { return i !== index; });
241
256
  triggerChange(newValue, {
242
257
  trigger: key2nodeProps[itemValue] || item,
243
258
  checked: false,
244
259
  selected: false,
245
260
  });
261
+ if (isMultipleQuickSelectMode) {
262
+ setTimeout(function () {
263
+ confirmCheck();
264
+ }, 0);
265
+ }
246
266
  return;
247
267
  }
248
- var result = (0, util_1.getAllCheckedKeysByCheck)(itemValue, false, (0, utils_1.normalizeValueToArray)(value), key2nodeProps, indeterminateKeys.current);
268
+ var result = (0, util_1.getAllCheckedKeysByCheck)(itemValue, false, (0, utils_1.normalizeValueToArray)(realValue), key2nodeProps, indeterminateKeys.current);
249
269
  indeterminateKeys.current = result.indeterminateKeys;
250
- triggerChange((0, useStateValue_1.parseValue)(result.checkedKeys, key2nodeProps, value), {
270
+ triggerChange((0, useStateValue_1.parseValue)(result.checkedKeys, key2nodeProps, realValue), {
251
271
  trigger: key2nodeProps[itemValue],
252
272
  checked: false,
253
273
  selected: false,
254
274
  });
275
+ if (isMultipleQuickSelectMode) {
276
+ setTimeout(function () {
277
+ confirmCheck();
278
+ }, 0);
279
+ }
255
280
  };
256
281
  (0, react_1.useEffect)(function () {
257
282
  inputValue !== undefined && handleSearch(inputValue);
@@ -314,12 +339,35 @@ var TreeSelect = function (baseProps, ref) {
314
339
  var renderView = function (eleView) {
315
340
  return (react_1.default.createElement(Trigger_1.default, __assign({ autoAlignPopupWidth: false, autoAlignPopupMinWidth: true, ref: triggerRef, classNames: "slideDynamicOrigin", trigger: "click", position: "bl", getPopupContainer: props.getPopupContainer, popupAlign: triggerPopupAlign, unmountOnExit: props.unmountOnExit }, props.triggerProps, { className: (0, classNames_1.default)(prefixCls + "-trigger", props.triggerProps && props.triggerProps.className), popup: function () {
316
341
  var _a;
317
- var _b, _c, _d;
342
+ var _b, _c, _d, _e, _f;
318
343
  var dropdownRender = props.dropdownRender;
319
- var dom = (isFilterNode && isEmptyValue(searchKeys)) || isEmptyValue(treeData) ? (props.notFoundContent || renderEmpty('TreeSelect')) : (react_1.default.createElement(tree_list_1.default, __assign({ prefixCls: prefixCls, ref: treeRef }, props, { inputValue: inputValue, filterNode: filterNode, value: value, onChange: triggerChange, multiple: multiple, treeData: treeData })));
320
- return (react_1.default.createElement("div", { id: instancePopupID, className: (0, classNames_1.default)(prefixCls + "-popup", (_a = {}, _a[prefixCls + "-rtl-popup"] = rtl, _a)), style: __assign({ maxHeight: ((_b = props.treeProps) === null || _b === void 0 ? void 0 : _b.height) || ((_d = (_c = props.treeProps) === null || _c === void 0 ? void 0 : _c.virtualListProps) === null || _d === void 0 ? void 0 : _d.height)
344
+ var treeListDom = (react_1.default.createElement(tree_list_1.default, __assign({ prefixCls: prefixCls, ref: treeRef }, props, { inputValue: inputValue, filterNode: filterNode, value: value, onChange: triggerChange, multiple: multiple, treeData: treeData, confirmCheck: confirmCheck })));
345
+ var dom = (isFilterNode && isEmptyValue(searchKeys)) || isEmptyValue(treeData) ? (props.notFoundContent || renderEmpty('TreeSelect')) : isMultipleQuickSelectMode ? (react_1.default.createElement("div", { style: {
346
+ maxHeight: 188,
347
+ display: 'flex',
348
+ flexDirection: 'column',
349
+ } },
350
+ react_1.default.createElement("div", { style: { flex: 1, overflowY: 'auto' } }, treeListDom),
351
+ react_1.default.createElement("div", { style: {
352
+ flex: 'none',
353
+ display: 'flex',
354
+ justifyContent: 'flex-end',
355
+ gap: 12,
356
+ padding: '8px 16px 4px',
357
+ borderTop: '1px solid var(--color-fill-3)',
358
+ } },
359
+ react_1.default.createElement(Button_1.default, { size: "mini", onClick: cancelCheck }, (_b = locale.Select) === null || _b === void 0 ? void 0 : _b.cancelText),
360
+ react_1.default.createElement(Button_1.default, { type: "primary", size: "mini", onClick: function () {
361
+ confirmCheck();
362
+ } }, (_c = locale.Select) === null || _c === void 0 ? void 0 : _c.okText)))) : (treeListDom);
363
+ var wrapStyle = isMultipleQuickSelectMode
364
+ ? {
365
+ overflow: 'hidden',
366
+ }
367
+ : {};
368
+ return (react_1.default.createElement("div", { id: instancePopupID, className: (0, classNames_1.default)(prefixCls + "-popup", (_a = {}, _a[prefixCls + "-rtl-popup"] = rtl, _a)), style: __assign(__assign({ maxHeight: ((_d = props.treeProps) === null || _d === void 0 ? void 0 : _d.height) || ((_f = (_e = props.treeProps) === null || _e === void 0 ? void 0 : _e.virtualListProps) === null || _f === void 0 ? void 0 : _f.height)
321
369
  ? 'unset'
322
- : '' }, props.dropdownMenuStyle) }, (0, is_1.isFunction)(dropdownRender) ? dropdownRender(dom) : dom));
370
+ : '' }, wrapStyle), props.dropdownMenuStyle) }, (0, is_1.isFunction)(dropdownRender) ? dropdownRender(dom) : dom));
323
371
  }, disabled: props.disabled, onVisibleChange: function (visible) {
324
372
  tryUpdatePopupVisible(visible);
325
373
  // props.onVisibleChange && props.onVisibleChange(visible);
@@ -340,9 +388,9 @@ var TreeSelect = function (baseProps, ref) {
340
388
  return props.triggerElement({ value: valueForCallback });
341
389
  })()
342
390
  : props.triggerElement;
343
- return !(0, is_1.isNullOrUndefined)(customTriggerElement) ? (renderView(customTriggerElement)) : (react_1.default.createElement(select_view_1.default, __assign({ ref: refSelectView, rtl: rtl, ariaControls: instancePopupID }, props, { popupVisible: popupVisible, value: !multiple && (0, is_1.isArray)(value) ? value[0] : value, inputValue: inputValue,
391
+ return !(0, is_1.isNullOrUndefined)(customTriggerElement) ? (renderView(customTriggerElement)) : (react_1.default.createElement(select_view_1.default, __assign({ ref: refSelectView, rtl: rtl, ariaControls: instancePopupID }, props, { popupVisible: popupVisible, value: !multiple && (0, is_1.isArray)(realValue) ? realValue[0] : realValue, inputValue: inputValue,
344
392
  // other
345
- isEmptyValue: isEmptyValue(value), prefixCls: prefixCls, isMultiple: multiple, renderText: renderText, onSort: tryUpdateSelectValue, onRemoveCheckedItem: handleRemoveCheckedItem, onClear: function (e) {
393
+ isEmptyValue: isEmptyValue(realValue), prefixCls: prefixCls, isMultiple: multiple, renderText: renderText, onSort: tryUpdateSelectValue, onRemoveCheckedItem: handleRemoveCheckedItem, onClear: function (e) {
346
394
  var _a;
347
395
  e.stopPropagation();
348
396
  triggerChange([], {});
package/lib/index.d.ts CHANGED
@@ -139,4 +139,4 @@ export type { WatermarkProps } from './Watermark/interface';
139
139
  export { default as Watermark } from './Watermark';
140
140
  export type { ImageProps, ImagePreviewProps, ImagePreviewActionProps, ImagePreviewGroupProps } from './Image/interface';
141
141
  export { default as Image } from './Image';
142
- export declare const version = "1.3.4";
142
+ export declare const version = "1.4.1";
package/lib/index.js CHANGED
@@ -147,4 +147,4 @@ var Watermark_1 = require("./Watermark");
147
147
  Object.defineProperty(exports, "Watermark", { enumerable: true, get: function () { return __importDefault(Watermark_1).default; } });
148
148
  var Image_1 = require("./Image");
149
149
  Object.defineProperty(exports, "Image", { enumerable: true, get: function () { return __importDefault(Image_1).default; } });
150
- exports.version = '1.3.4';
150
+ exports.version = '1.4.1';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@apdesign/web-react",
3
- "version": "1.3.4",
3
+ "version": "1.4.1",
4
4
  "description": "AP Design React UI Library.",
5
5
  "module": "./es/index.js",
6
6
  "main": "./lib/index.js",