one-design-next 0.0.9 → 0.0.10

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.
@@ -44,12 +44,8 @@ export interface BaseCascaderProps extends Omit<RcCascaderProps<DefaultOptionTyp
44
44
  separator?: string;
45
45
  /** 自定义下拉列表中每一项的渲染(rc-cascader 原生支持) */
46
46
  optionRender?: (option: DefaultOptionType) => React.ReactNode;
47
- /**
48
- * 点击非叶节点内容区域时的行为
49
- * - `true`:选中非叶节点并关闭下拉
50
- * - `'keep-open'`:选中非叶节点并触发 onChange,但保持下拉展开(子菜单继续展开)
51
- */
52
- changeOnSelect?: boolean | 'keep-open';
47
+ /** 点击非叶节点内容区域时也触发 onChange(下拉保持展开,子菜单继续展开) */
48
+ changeOnSelect?: boolean;
53
49
  }
54
50
  export type CascaderProps<V = (string | number)[] | null> = BaseCascaderProps & {
55
51
  mode?: 'single' | 'multiple';
@@ -3,11 +3,10 @@ function _extends() { _extends = Object.assign ? Object.assign.bind() : function
3
3
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
4
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
5
5
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
6
- function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
7
- function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
8
- function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (_e) { function e(_x) { return _e.apply(this, arguments); } e.toString = function () { return _e.toString(); }; return e; }(function (e) { throw e; }), f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function (_e2) { function e(_x2) { return _e2.apply(this, arguments); } e.toString = function () { return _e2.toString(); }; return e; }(function (e) { didErr = true; err = e; }), f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
9
6
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
10
7
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
8
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
9
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
11
10
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
12
11
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
13
12
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
@@ -90,41 +89,6 @@ function CascaderInner(_ref) {
90
89
  var processedOptions = React.useMemo(function () {
91
90
  return processOptions(options, mergedFieldNames, optionPopoverProps);
92
91
  }, [options, mergedFieldNames, optionPopoverProps]);
93
-
94
- // 根据完整路径从 processedOptions 中查找对应的 option 对象
95
- var resolvePathOptions = React.useCallback(function (fullPath) {
96
- var result = [];
97
- var currentOptions = processedOptions;
98
- var vField = mergedFieldNames.value || 'value';
99
- var cField = mergedFieldNames.children || 'children';
100
- var _iterator = _createForOfIteratorHelper(fullPath),
101
- _step;
102
- try {
103
- var _loop = function _loop() {
104
- var val = _step.value;
105
- if (!currentOptions) return 0; // break
106
- var found = currentOptions.find(function (opt) {
107
- return opt[vField] === val;
108
- });
109
- if (found) {
110
- result.push(found);
111
- currentOptions = found[cField];
112
- } else {
113
- return 0; // break
114
- }
115
- },
116
- _ret;
117
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
118
- _ret = _loop();
119
- if (_ret === 0) break;
120
- }
121
- } catch (err) {
122
- _iterator.e(err);
123
- } finally {
124
- _iterator.f();
125
- }
126
- return result;
127
- }, [processedOptions, mergedFieldNames]);
128
92
  var prefixCls = 'odn-select';
129
93
  var _useIcons = useIcons(_objectSpread(_objectSpread({}, restProps), {}, {
130
94
  hasFeedback: false,
@@ -211,70 +175,6 @@ function CascaderInner(_ref) {
211
175
  }
212
176
  };
213
177
 
214
- // 单选模式下 pathKey → 带类型的 fullPath 映射,用于事件委托时还原路径
215
- var pathKeyMap = React.useMemo(function () {
216
- if (mode !== 'single') return null;
217
- var SPLIT = '__RC_CASCADER_SPLIT__';
218
- var map = new Map();
219
- var traverse = function traverse(opts) {
220
- if (!opts) return;
221
- var _iterator2 = _createForOfIteratorHelper(opts),
222
- _step2;
223
- try {
224
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
225
- var opt = _step2.value;
226
- var fullPath = opt.__fullPath__;
227
- if (fullPath) {
228
- map.set(fullPath.join(SPLIT), fullPath);
229
- }
230
- var cField = mergedFieldNames.children || 'children';
231
- var children = opt[cField];
232
- if (children && Array.isArray(children)) traverse(children);
233
- }
234
- } catch (err) {
235
- _iterator2.e(err);
236
- } finally {
237
- _iterator2.f();
238
- }
239
- };
240
- traverse(processedOptions);
241
- return map;
242
- }, [mode, processedOptions, mergedFieldNames]);
243
-
244
- // 单选模式下:通过 onClickCapture 在 dropdown 层面拦截点击
245
- // 点击展开图标区域 → 放行,由 rc-cascader 处理展开
246
- // 点击其他区域(内容 / padding) → 拦截,手动选中 + 关闭
247
- var handleSingleSelectCapture = React.useCallback(function (e) {
248
- if (!pathKeyMap) return;
249
- var target = e.target;
250
- var expandIcon = target.closest('.odn-cascader-menu-item-expand-icon');
251
- var menuItem = target.closest('.odn-cascader-menu-item');
252
- if (!menuItem || expandIcon) return;
253
- if (menuItem.classList.contains('odn-cascader-menu-item-disabled')) return;
254
- if (menuItem.getAttribute('title') === 'divider') return;
255
- var pathKey = menuItem.getAttribute('data-path-key');
256
- if (!pathKey) return;
257
- var fullPath = pathKeyMap.get(pathKey);
258
- if (!fullPath) return;
259
- var pathOptions = resolvePathOptions(fullPath);
260
- var lastOption = pathOptions[pathOptions.length - 1];
261
- if (!lastOption) return;
262
- var cField = mergedFieldNames.children || 'children';
263
- var hasChildren = lastOption[cField] && Array.isArray(lastOption[cField]) && lastOption[cField].length > 0;
264
-
265
- // 非叶节点仅在 changeOnSelect 时才可点击选中
266
- if (hasChildren && !changeOnSelectProp) return;
267
-
268
- // keep-open:触发 onChange 但不关闭下拉,让 rc-cascader 继续展开子菜单
269
- if (hasChildren && changeOnSelectProp === 'keep-open') {
270
- handleChange(fullPath, pathOptions, e);
271
- return;
272
- }
273
- e.stopPropagation();
274
- handleChange(fullPath, pathOptions, e);
275
- handleVisibleChange(false);
276
- }, [pathKeyMap, mergedFieldNames, changeOnSelectProp, resolvePathOptions, handleChange, handleVisibleChange]);
277
-
278
178
  // 转换 value 类型以兼容 rc-cascader
279
179
  var rcValue = value === null ? undefined : value;
280
180
  var rcDefaultValue = defaultValue === null ? undefined : defaultValue;
@@ -371,49 +271,34 @@ function CascaderInner(_ref) {
371
271
  },
372
272
  dropdownMatchSelectWidth: dropdownMatchSelectWidth,
373
273
  optionRender: optionRenderProp,
374
- // 单选模式不传 changeOnSelect 给 rc-cascader,
375
- // 使展开图标点击时 isSelectable 对非叶节点返回 false,只触发展开
376
- changeOnSelect: mode === 'single' ? false : !!changeOnSelectProp
274
+ changeOnSelect: !!changeOnSelectProp
377
275
  });
378
- var dropdownRender = React.useMemo(function () {
379
- var searchRenderFn = showInnerSearch ? function (menu) {
380
- var searchNode = /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
381
- className: "odn-select-dropdown-search"
382
- }, /*#__PURE__*/React.createElement(Icon, {
383
- name: "search",
384
- className: "odn-select-dropdown-search-icon"
385
- }), /*#__PURE__*/React.createElement("input", {
386
- ref: dropdownSearchInputRef,
387
- className: "odn-select-dropdown-search-input",
388
- placeholder: "\u8BF7\u8F93\u5165",
389
- value: searchValue,
390
- onChange: function onChange(e) {
391
- var value = e.target.value;
392
- if (searchValueProp === undefined) {
393
- setSearchValue(value);
394
- }
395
- if (_onSearch) {
396
- _onSearch(value);
397
- }
398
- },
399
- onKeyDown: function onKeyDown(e) {
400
- e.stopPropagation();
276
+ var dropdownRender = showInnerSearch ? function (menu) {
277
+ var searchNode = /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
278
+ className: "odn-select-dropdown-search"
279
+ }, /*#__PURE__*/React.createElement(Icon, {
280
+ name: "search",
281
+ className: "odn-select-dropdown-search-icon"
282
+ }), /*#__PURE__*/React.createElement("input", {
283
+ ref: dropdownSearchInputRef,
284
+ className: "odn-select-dropdown-search-input",
285
+ placeholder: "\u8BF7\u8F93\u5165",
286
+ value: searchValue,
287
+ onChange: function onChange(e) {
288
+ var value = e.target.value;
289
+ if (searchValueProp === undefined) {
290
+ setSearchValue(value);
401
291
  }
402
- })));
403
- return /*#__PURE__*/React.createElement(React.Fragment, null, searchNode, menu);
404
- } : undefined;
405
-
406
- // 单选模式:在 dropdown 层面用 onClickCapture 拦截内容区域点击
407
- if (mode === 'single') {
408
- return function (menu) {
409
- var rendered = searchRenderFn ? searchRenderFn(menu) : menu;
410
- return /*#__PURE__*/React.createElement("div", {
411
- onClickCapture: handleSingleSelectCapture
412
- }, rendered);
413
- };
414
- }
415
- return searchRenderFn;
416
- }, [showInnerSearch, searchValue, searchValueProp, _onSearch, mode, handleSingleSelectCapture]);
292
+ if (_onSearch) {
293
+ _onSearch(value);
294
+ }
295
+ },
296
+ onKeyDown: function onKeyDown(e) {
297
+ e.stopPropagation();
298
+ }
299
+ })));
300
+ return /*#__PURE__*/React.createElement(React.Fragment, null, searchNode, menu);
301
+ } : undefined;
417
302
  if (mode === 'multiple') {
418
303
  return /*#__PURE__*/React.createElement(RcCascader, _extends({}, commonProps, {
419
304
  value: rcValue,
@@ -210,16 +210,12 @@ function CollectionPanel() {
210
210
  })), /*#__PURE__*/React.createElement("div", {
211
211
  "data-odn-huxuan-layout-collection-footer": true
212
212
  }, /*#__PURE__*/React.createElement(Button, {
213
+ icon: "plus",
213
214
  style: {
214
215
  width: '100%',
215
216
  justifyContent: 'center'
216
217
  }
217
- }, /*#__PURE__*/React.createElement(Icon, {
218
- name: "plus",
219
- style: {
220
- marginRight: 4
221
- }
222
- }), "\u65B0\u5EFA\u8FBE\u4EBA\u540D\u5355")));
218
+ }, "\u65B0\u5EFA\u8FBE\u4EBA\u540D\u5355")));
223
219
  }
224
220
 
225
221
  /** 导航下拉面板:hover 触发 */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "one-design-next",
3
- "version": "0.0.9",
3
+ "version": "0.0.10",
4
4
  "description": "One Design Next from TAD@tencent.com",
5
5
  "module": "dist/index.js",
6
6
  "types": "dist/index.d.ts",