@nokecy/qc-ui 1.0.84 → 1.0.86

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.
@@ -1,4 +1,5 @@
1
1
  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); }
2
+ import _debounce from "lodash/debounce";
2
3
  var _excluded = ["record", "index", "moveRow", "children"];
3
4
  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; }
4
5
  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; }
@@ -10,21 +11,21 @@ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread n
10
11
  function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
11
12
  function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
12
13
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
14
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
15
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
13
16
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
14
17
  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."); }
15
18
  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); }
16
19
  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; }
17
20
  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; } }
18
21
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
19
- function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
20
- function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
21
22
  /**
22
23
  * 列配置表格组件
23
24
  * 使用简单的 Ant Design Table 替代 Formily ArrayTable
24
25
  * 通过 React useState 直接管理数据状态,确保 type 字段不会丢失
25
26
  */
26
27
 
27
- import React, { useCallback, useMemo, useState, useRef } from 'react';
28
+ import React, { useCallback, useMemo, useState, useRef, useEffect } from 'react';
28
29
  import { Table, Button, Input, InputNumber, Select, Switch, Space, Popconfirm, message, Tag, Tooltip } from 'antd';
29
30
  import { PlusOutlined, DeleteOutlined, FolderOutlined, FolderAddOutlined, FileOutlined, DownOutlined, RightOutlined, DragOutlined, HolderOutlined } from '@ant-design/icons';
30
31
  import { DndProvider, useDrag, useDrop } from 'react-dnd';
@@ -32,15 +33,66 @@ import { HTML5Backend } from 'react-dnd-html5-backend';
32
33
  import { generateId, findLastDescendantIndex, reorderItems } from "./columnGroupUtils";
33
34
  import MoveNodeModal from "./MoveNodeModal";
34
35
  var DRAG_TYPE = 'COLUMN_ROW';
36
+ /**
37
+ * 受控的名称输入组件 - 解决光标跳出问题
38
+ * 通过内部维护输入状态,只在失去焦点时同步到父组件
39
+ */
40
+ var NameInput = function NameInput(_ref) {
41
+ var value = _ref.value,
42
+ onChange = _ref.onChange,
43
+ placeholder = _ref.placeholder,
44
+ isNew = _ref.isNew;
45
+ var _useState = useState(value),
46
+ _useState2 = _slicedToArray(_useState, 2),
47
+ localValue = _useState2[0],
48
+ setLocalValue = _useState2[1];
49
+
50
+ // 同步外部变化到本地状态
51
+ useEffect(function () {
52
+ setLocalValue(value);
53
+ }, [value]);
54
+
55
+ // 处理输入变化 - 只更新本地状态
56
+ var handleChange = function handleChange(e) {
57
+ setLocalValue(e.target.value);
58
+ };
59
+
60
+ // 失去焦点时同步到父组件
61
+ var handleBlur = function handleBlur() {
62
+ if (localValue !== value) {
63
+ onChange(localValue);
64
+ }
65
+ };
66
+
67
+ // 按回车键时也同步并失去焦点
68
+ var handlePressEnter = function handlePressEnter() {
69
+ if (localValue !== value) {
70
+ onChange(localValue);
71
+ }
72
+ };
73
+ return /*#__PURE__*/React.createElement(Input, {
74
+ value: localValue,
75
+ onChange: handleChange,
76
+ onBlur: handleBlur,
77
+ onPressEnter: handlePressEnter,
78
+ bordered: false,
79
+ placeholder: placeholder,
80
+ style: {
81
+ flex: 1,
82
+ background: isNew ? '#fff7e6' : 'transparent'
83
+ }
84
+ });
85
+ };
86
+
35
87
  /**
36
88
  * 可拖拽的表格行组件
37
89
  */
38
- var DraggableRow = function DraggableRow(_ref) {
39
- var record = _ref.record,
40
- index = _ref.index,
41
- moveRow = _ref.moveRow,
42
- children = _ref.children,
43
- restProps = _objectWithoutProperties(_ref, _excluded);
90
+ var DraggableRow = function DraggableRow(_ref2) {
91
+ var record = _ref2.record,
92
+ index = _ref2.index,
93
+ moveRow = _ref2.moveRow,
94
+ children = _ref2.children,
95
+ restProps = _objectWithoutProperties(_ref2, _excluded);
44
96
  var ref = useRef(null);
45
97
  var _useDrag = useDrag({
46
98
  type: DRAG_TYPE,
@@ -106,26 +158,26 @@ var DraggableRow = function DraggableRow(_ref) {
106
158
  /**
107
159
  * 列配置表格组件
108
160
  */
109
- var ColumnConfigTable = function ColumnConfigTable(_ref2) {
110
- var items = _ref2.items,
111
- onChange = _ref2.onChange,
112
- _ref2$simple = _ref2.simple,
113
- simple = _ref2$simple === void 0 ? false : _ref2$simple;
161
+ var ColumnConfigTable = function ColumnConfigTable(_ref3) {
162
+ var items = _ref3.items,
163
+ onChange = _ref3.onChange,
164
+ _ref3$simple = _ref3.simple,
165
+ simple = _ref3$simple === void 0 ? false : _ref3$simple;
114
166
  // 本地状态管理(用于优化性能)
115
- var _useState = useState(items),
116
- _useState2 = _slicedToArray(_useState, 2),
117
- localItems = _useState2[0],
118
- setLocalItems = _useState2[1];
167
+ var _useState3 = useState(items),
168
+ _useState4 = _slicedToArray(_useState3, 2),
169
+ localItems = _useState4[0],
170
+ setLocalItems = _useState4[1];
119
171
 
120
172
  // 移动节点弹窗状态
121
- var _useState3 = useState(false),
122
- _useState4 = _slicedToArray(_useState3, 2),
123
- moveModalVisible = _useState4[0],
124
- setMoveModalVisible = _useState4[1];
125
- var _useState5 = useState(null),
173
+ var _useState5 = useState(false),
126
174
  _useState6 = _slicedToArray(_useState5, 2),
127
- currentMoveNode = _useState6[0],
128
- setCurrentMoveNode = _useState6[1];
175
+ moveModalVisible = _useState6[0],
176
+ setMoveModalVisible = _useState6[1];
177
+ var _useState7 = useState(null),
178
+ _useState8 = _slicedToArray(_useState7, 2),
179
+ currentMoveNode = _useState8[0],
180
+ setCurrentMoveNode = _useState8[1];
129
181
 
130
182
  /**
131
183
  * 同步更新本地状态和通知父组件
@@ -151,6 +203,24 @@ var ColumnConfigTable = function ColumnConfigTable(_ref2) {
151
203
  onChange(_toConsumableArray(newItems));
152
204
  }, [onChange]);
153
205
 
206
+ /**
207
+ * 防抖的更新函数 - 用于输入框等高频更新场景
208
+ * 延迟 300ms 后才通知父组件,减少不必要的重渲染
209
+ */
210
+ var debouncedUpdateItems = useMemo(function () {
211
+ return _debounce(function (newItems) {
212
+ reorderItems(newItems);
213
+ onChange(_toConsumableArray(newItems));
214
+ }, 300);
215
+ }, [onChange]);
216
+
217
+ // 组件卸载时清理防抖函数
218
+ useEffect(function () {
219
+ return function () {
220
+ debouncedUpdateItems.cancel();
221
+ };
222
+ }, [debouncedUpdateItems]);
223
+
154
224
  /**
155
225
  * 切换分组的折叠/展开状态
156
226
  */
@@ -448,8 +518,10 @@ var ColumnConfigTable = function ColumnConfigTable(_ref2) {
448
518
 
449
519
  /**
450
520
  * 更新节点属性
521
+ * @param immediate 是否立即更新父组件(非输入框类更新需要立即生效)
451
522
  */
452
523
  var handleUpdateNode = useCallback(function (nodeId, updates) {
524
+ var immediate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
453
525
  var newItems = localItems.map(function (item) {
454
526
  if (item.id === nodeId) {
455
527
  // ⚠️ 关键:确保 type 字段不会被覆盖
@@ -461,8 +533,20 @@ var ColumnConfigTable = function ColumnConfigTable(_ref2) {
461
533
  }
462
534
  return item;
463
535
  });
464
- updateItems(newItems);
465
- }, [localItems, updateItems]);
536
+
537
+ // 立即更新本地状态(保证输入框显示最新内容)
538
+ setLocalItems(_toConsumableArray(newItems));
539
+
540
+ // 根据场景选择立即更新或防抖更新
541
+ if (immediate) {
542
+ // 非文本输入的更新(如开关、选择器等)需要立即生效
543
+ reorderItems(newItems);
544
+ onChange(_toConsumableArray(newItems));
545
+ } else {
546
+ // 文本输入使用防抖,避免频繁触发父组件更新
547
+ debouncedUpdateItems(newItems);
548
+ }
549
+ }, [localItems, onChange, debouncedUpdateItems]);
466
550
 
467
551
  /**
468
552
  * 处理拖拽排序
@@ -634,19 +718,15 @@ var ColumnConfigTable = function ColumnConfigTable(_ref2) {
634
718
  margin: 0,
635
719
  flexShrink: 0
636
720
  }
637
- }, record.type === 'group' ? '分组' : '列'), /*#__PURE__*/React.createElement(Input, {
721
+ }, record.type === 'group' ? '分组' : '列'), /*#__PURE__*/React.createElement(NameInput, {
638
722
  value: text,
639
- onChange: function onChange(e) {
723
+ onChange: function onChange(newValue) {
640
724
  return handleUpdateNode(record.id, {
641
- headerName: e.target.value
642
- });
725
+ headerName: newValue
726
+ }, true);
643
727
  },
644
- bordered: false,
645
728
  placeholder: record.type === 'group' ? '请输入分组名称' : '请输入列名称',
646
- style: {
647
- flex: 1,
648
- background: record._isNew ? '#fff7e6' : 'transparent'
649
- }
729
+ isNew: record._isNew
650
730
  }));
651
731
  }, [getIndentSymbol, handleUpdateNode, handleToggleCollapse]);
652
732
 
@@ -751,7 +831,7 @@ var ColumnConfigTable = function ColumnConfigTable(_ref2) {
751
831
  onChange: function onChange(newValue) {
752
832
  return handleUpdateNode(record.id, {
753
833
  width: newValue || undefined
754
- });
834
+ }, true);
755
835
  },
756
836
  min: 50,
757
837
  max: 1000,
@@ -773,7 +853,7 @@ var ColumnConfigTable = function ColumnConfigTable(_ref2) {
773
853
  onChange: function onChange(newValue) {
774
854
  return handleUpdateNode(record.id, {
775
855
  flex: newValue
776
- });
856
+ }, true);
777
857
  },
778
858
  style: {
779
859
  width: '100%'
@@ -800,7 +880,7 @@ var ColumnConfigTable = function ColumnConfigTable(_ref2) {
800
880
  onChange: function onChange(newValue) {
801
881
  return handleUpdateNode(record.id, {
802
882
  pinned: newValue
803
- });
883
+ }, true);
804
884
  },
805
885
  style: {
806
886
  width: '100%'
@@ -830,7 +910,7 @@ var ColumnConfigTable = function ColumnConfigTable(_ref2) {
830
910
  onChange: function onChange(checked) {
831
911
  return handleUpdateNode(record.id, {
832
912
  hide: checked
833
- });
913
+ }, true);
834
914
  }
835
915
  });
836
916
  }
@@ -847,7 +927,7 @@ var ColumnConfigTable = function ColumnConfigTable(_ref2) {
847
927
  onChange: function onChange(newValue) {
848
928
  return handleUpdateNode(record.id, {
849
929
  cellClass: newValue
850
- });
930
+ }, true);
851
931
  },
852
932
  style: {
853
933
  width: '100%'
@@ -877,7 +957,7 @@ var ColumnConfigTable = function ColumnConfigTable(_ref2) {
877
957
  onChange: function onChange(checked) {
878
958
  return handleUpdateNode(record.id, {
879
959
  suppressHeaderFilterButton: !checked
880
- });
960
+ }, true);
881
961
  }
882
962
  });
883
963
  }