@nokecy/qc-ui 1.1.2 → 1.1.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.
@@ -29,6 +29,7 @@ var _locale = require("./locale");
29
29
  var _gridContext = require("./context/gridContext");
30
30
  var _useSchemeManager = require("./context/useSchemeManager");
31
31
  var _useSchemeDataFlow = require("./context/useSchemeDataFlow");
32
+ var _schemeDataMigration = require("./shared/utils/schemeDataMigration");
32
33
  var _sanitize = require("./utils/sanitize");
33
34
  var _errors = require("./errors");
34
35
  var _logger = require("./utils/logger");
@@ -1063,7 +1064,8 @@ function AgGridPlus(props) {
1063
1064
 
1064
1065
  // 使用顺序管理器处理排序
1065
1066
  var orderedFormItems = (0, _react.useMemo)(function () {
1066
- var itemsOrder = (currentQueryScheme === null || currentQueryScheme === void 0 ? void 0 : currentQueryScheme.itemsOrder) || queryItemsOrder;
1067
+ // 从查询方案提取字段顺序
1068
+ var itemsOrder = currentQueryScheme ? (0, _schemeDataMigration.extractItemsOrder)(currentQueryScheme) : queryItemsOrder;
1067
1069
  if (!itemsOrder || itemsOrder.length === 0) {
1068
1070
  return queryFormItems;
1069
1071
  }
@@ -1078,18 +1080,19 @@ function AgGridPlus(props) {
1078
1080
  return indexA - indexB;
1079
1081
  });
1080
1082
  return ordered;
1081
- }, [queryFormItems, currentQueryScheme === null || currentQueryScheme === void 0 ? void 0 : currentQueryScheme.itemsOrder, queryItemsOrder]);
1083
+ }, [queryFormItems, currentQueryScheme, queryItemsOrder]);
1082
1084
 
1083
1085
  // 根据方案的隐藏字段过滤表单项
1084
1086
  var visibleFormItems = (0, _react.useMemo)(function () {
1085
- var hiddenFields = (currentQueryScheme === null || currentQueryScheme === void 0 ? void 0 : currentQueryScheme.hiddenFields) || [];
1087
+ // 从查询方案提取隐藏字段
1088
+ var hiddenFields = currentQueryScheme ? (0, _schemeDataMigration.extractHiddenFields)(currentQueryScheme) : [];
1086
1089
  if (hiddenFields.length === 0) {
1087
1090
  return orderedFormItems;
1088
1091
  }
1089
1092
  return orderedFormItems.filter(function (item) {
1090
1093
  return !hiddenFields.includes(item.field);
1091
1094
  });
1092
- }, [orderedFormItems, currentQueryScheme === null || currentQueryScheme === void 0 ? void 0 : currentQueryScheme.hiddenFields]);
1095
+ }, [orderedFormItems, currentQueryScheme]);
1093
1096
  (0, _react.useEffect)(function () {
1094
1097
  calculateSum();
1095
1098
  }, [calculateSum]);
@@ -1119,7 +1122,7 @@ function AgGridPlus(props) {
1119
1122
  applyToGlobal: applyToGlobal,
1120
1123
  resetCurrent: resetCurrent,
1121
1124
  resetAll: resetAll,
1122
- currentQueryOrder: (currentQueryScheme === null || currentQueryScheme === void 0 ? void 0 : currentQueryScheme.itemsOrder) || queryItemsOrder,
1125
+ currentQueryOrder: currentQueryScheme ? (0, _schemeDataMigration.extractItemsOrder)(currentQueryScheme) : queryItemsOrder,
1123
1126
  updateQueryOrder: setQueryItemsOrder,
1124
1127
  queryFormItems: queryFormItems,
1125
1128
  // ========== 方案管理 API(透传给子组件) ==========
@@ -1141,7 +1144,7 @@ function AgGridPlus(props) {
1141
1144
  };
1142
1145
  }, [extensibleColumns, gridPlusColumnState, allColDefsRef.current,
1143
1146
  // 【修复】添加到依赖数组
1144
- onSaveColumnState, applyToGlobal, resetCurrent, resetAll, currentQueryScheme === null || currentQueryScheme === void 0 ? void 0 : currentQueryScheme.itemsOrder, queryItemsOrder, queryFormItems,
1147
+ onSaveColumnState, applyToGlobal, resetCurrent, resetAll, currentQueryScheme, queryItemsOrder, queryFormItems,
1145
1148
  // 方案管理依赖
1146
1149
  columnSchemes, querySchemes, currentSchemes, schemesLoading, lastSyncTime, saveColumnScheme, deleteColumnScheme, saveQueryScheme, deleteQueryScheme, setCurrentColumnScheme, setCurrentQueryScheme, refreshSchemes, getColumnSchemes, getQuerySchemes, getCurrentScheme]);
1147
1150
  return /*#__PURE__*/_react.default.createElement(_gridContext.GridPlusContext.Provider, {
@@ -225,7 +225,7 @@ var ColumnSetting = function ColumnSetting(_ref) {
225
225
  * 将扁平化配置转换回 Grid State 并应用到 AG-Grid
226
226
  */
227
227
  var handleSaveColumns = (0, _react.useCallback)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
228
- var values, flatConfig, configToSave, gridColumnDefs, columnState;
228
+ var values, flatConfig, configToSave, invalidColumns, gridColumnDefs, columnState;
229
229
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
230
230
  while (1) switch (_context2.prev = _context2.next) {
231
231
  case 0:
@@ -243,16 +243,28 @@ var ColumnSetting = function ColumnSetting(_ref) {
243
243
  _antd.message.info('检测到旧版本配置,已自动迁移到新格式');
244
244
  }
245
245
 
246
+ // 【修复】验证数据完整性,过滤掉无效的列配置
247
+ invalidColumns = configToSave.filter(function (item) {
248
+ return item.type === 'column' && !item.field;
249
+ });
250
+ if (invalidColumns.length > 0) {
251
+ _antd.message.warning("\u68C0\u6D4B\u5230 ".concat(invalidColumns.length, " \u4E2A\u5217\u7F3A\u5C11 field \u5B57\u6BB5\uFF0C\u5DF2\u81EA\u52A8\u8FC7\u6EE4"));
252
+ console.warn('[ColumnSetting] 无效的列配置:', invalidColumns);
253
+ configToSave = configToSave.filter(function (item) {
254
+ return item.type === 'group' || item.type === 'column' && item.field;
255
+ });
256
+ }
257
+
246
258
  // 【修复】转换为 AG-Grid 的列定义,传入原始列定义以保留自定义属性
247
259
  gridColumnDefs = (0, _columnGroupUtils.flatConfigToGridState)(configToSave, originalColumnDefs); // 【关键修复】先更新 columnDefs(处理分组结构变化)
248
260
  gridApi.setGridOption('columnDefs', gridColumnDefs);
249
261
 
250
262
  // 等待 columnDefs 更新完成
251
- _context2.next = 10;
263
+ _context2.next = 12;
252
264
  return new Promise(function (resolve) {
253
265
  return setTimeout(resolve, 100);
254
266
  });
255
- case 10:
267
+ case 12:
256
268
  // 【修复】然后应用列状态(宽度、隐藏、顺序等)
257
269
  columnState = (0, _columnGroupUtils.flatConfigToColumnState)(configToSave);
258
270
  gridApi.applyColumnState({
@@ -344,7 +356,7 @@ var ColumnSetting = function ColumnSetting(_ref) {
344
356
 
345
357
  // message.success 已经在上面的逻辑中处理了
346
358
  onClose();
347
- case 15:
359
+ case 17:
348
360
  case "end":
349
361
  return _context2.stop();
350
362
  }
@@ -14,6 +14,7 @@ var _reactDndHtml5Backend = require("react-dnd-html5-backend");
14
14
  var _useSchemeManager = require("../context/useSchemeManager");
15
15
  var _gridContext = require("../context/gridContext");
16
16
  var _uuid = require("uuid");
17
+ var _schemeDataMigration = require("../shared/utils/schemeDataMigration");
17
18
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
19
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
19
20
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
@@ -195,8 +196,8 @@ var QuerySchemeManager = function QuerySchemeManager(_ref2) {
195
196
  setEditingOrder(defaultOrder);
196
197
  }
197
198
 
198
- // 初始化隐藏字段
199
- setHiddenFields((currentScheme === null || currentScheme === void 0 ? void 0 : currentScheme.hiddenFields) || []);
199
+ // 初始化隐藏字段 - 使用新格式提取器
200
+ setHiddenFields(currentScheme ? (0, _schemeDataMigration.extractHiddenFields)(currentScheme) : []);
200
201
  }
201
202
  }, [visible, currentQueryOrder, queryFormItems, currentScheme]);
202
203
 
@@ -244,68 +245,67 @@ var QuerySchemeManager = function QuerySchemeManager(_ref2) {
244
245
  * 应用当前顺序和隐藏设置
245
246
  */
246
247
  var handleApplyOrder = (0, _react.useCallback)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
247
- var newScheme;
248
+ var queryConfig, newScheme;
248
249
  return _regeneratorRuntime().wrap(function _callee$(_context) {
249
250
  while (1) switch (_context.prev = _context.next) {
250
251
  case 0:
251
252
  _context.prev = 0;
253
+ // 构建新格式的配置
254
+ queryConfig = (0, _schemeDataMigration.buildQueryConfig)(editingOrder, hiddenFields); // 如果有当前方案,更新方案
252
255
  if (!currentScheme) {
253
- _context.next = 7;
256
+ _context.next = 8;
254
257
  break;
255
258
  }
256
- _context.next = 4;
259
+ _context.next = 5;
257
260
  return saveQueryScheme === null || saveQueryScheme === void 0 ? void 0 : saveQueryScheme(gridKey, _objectSpread(_objectSpread({}, currentScheme), {}, {
258
- itemsOrder: editingOrder,
259
- hiddenFields: hiddenFields,
261
+ queryConfig: queryConfig,
260
262
  updatedAt: Date.now()
261
263
  }));
262
- case 4:
264
+ case 5:
263
265
  _antd.message.success('已应用新配置');
264
- _context.next = 13;
266
+ _context.next = 14;
265
267
  break;
266
- case 7:
268
+ case 8:
267
269
  // 创建新方案
268
270
  newScheme = {
269
271
  id: (0, _uuid.v4)(),
270
272
  name: '默认方案',
271
273
  description: '自动创建的默认查询方案',
272
- itemsOrder: editingOrder,
273
- hiddenFields: hiddenFields,
274
- formValues: {},
274
+ queryConfig: queryConfig,
275
275
  isDefault: true,
276
276
  isSystem: false,
277
277
  createdAt: Date.now(),
278
278
  updatedAt: Date.now()
279
279
  };
280
- _context.next = 10;
280
+ _context.next = 11;
281
281
  return saveQueryScheme === null || saveQueryScheme === void 0 ? void 0 : saveQueryScheme(gridKey, newScheme);
282
- case 10:
283
- _context.next = 12;
282
+ case 11:
283
+ _context.next = 13;
284
284
  return setCurrentQueryScheme === null || setCurrentQueryScheme === void 0 ? void 0 : setCurrentQueryScheme(gridKey, newScheme.id);
285
- case 12:
286
- _antd.message.success('已自动创建并应用默认方案');
287
285
  case 13:
286
+ _antd.message.success('已自动创建并应用默认方案');
287
+ case 14:
288
288
  // 应用顺序到表单
289
289
  updateQueryOrder === null || updateQueryOrder === void 0 || updateQueryOrder(editingOrder);
290
290
  onClose();
291
- _context.next = 20;
291
+ _context.next = 21;
292
292
  break;
293
- case 17:
294
- _context.prev = 17;
293
+ case 18:
294
+ _context.prev = 18;
295
295
  _context.t0 = _context["catch"](0);
296
296
  _antd.message.error(_context.t0.message || '应用失败');
297
- case 20:
297
+ case 21:
298
298
  case "end":
299
299
  return _context.stop();
300
300
  }
301
- }, _callee, null, [[0, 17]]);
301
+ }, _callee, null, [[0, 18]]);
302
302
  })), [editingOrder, hiddenFields, currentScheme, saveQueryScheme, gridKey, updateQueryOrder, onClose, setCurrentQueryScheme]);
303
303
 
304
304
  /**
305
305
  * 保存为新方案
306
306
  */
307
307
  var handleSaveAsNew = (0, _react.useCallback)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
308
- var newScheme;
308
+ var queryConfig, newScheme;
309
309
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
310
310
  while (1) switch (_context2.prev = _context2.next) {
311
311
  case 0:
@@ -317,34 +317,34 @@ var QuerySchemeManager = function QuerySchemeManager(_ref2) {
317
317
  return _context2.abrupt("return");
318
318
  case 3:
319
319
  _context2.prev = 3;
320
+ // 构建新格式的配置
321
+ queryConfig = (0, _schemeDataMigration.buildQueryConfig)(editingOrder, hiddenFields);
320
322
  newScheme = {
321
323
  id: (0, _uuid.v4)(),
322
324
  name: schemeName.trim(),
323
325
  description: '',
324
- itemsOrder: editingOrder,
325
- hiddenFields: hiddenFields,
326
- formValues: {},
326
+ queryConfig: queryConfig,
327
327
  isDefault: false,
328
328
  isSystem: false,
329
329
  createdAt: Date.now(),
330
330
  updatedAt: Date.now()
331
331
  };
332
- _context2.next = 7;
332
+ _context2.next = 8;
333
333
  return saveQueryScheme === null || saveQueryScheme === void 0 ? void 0 : saveQueryScheme(gridKey, newScheme);
334
- case 7:
334
+ case 8:
335
335
  _antd.message.success('保存成功');
336
336
  setSchemeName('');
337
- _context2.next = 14;
337
+ _context2.next = 15;
338
338
  break;
339
- case 11:
340
- _context2.prev = 11;
339
+ case 12:
340
+ _context2.prev = 12;
341
341
  _context2.t0 = _context2["catch"](3);
342
342
  _antd.message.error(_context2.t0.message || '保存失败');
343
- case 14:
343
+ case 15:
344
344
  case "end":
345
345
  return _context2.stop();
346
346
  }
347
- }, _callee2, null, [[3, 11]]);
347
+ }, _callee2, null, [[3, 12]]);
348
348
  })), [schemeName, editingOrder, hiddenFields, saveQueryScheme, gridKey]);
349
349
 
350
350
  /**
@@ -523,7 +523,7 @@ var QuerySchemeManager = function QuerySchemeManager(_ref2) {
523
523
  */
524
524
  var handleApply = (0, _react.useCallback)( /*#__PURE__*/function () {
525
525
  var _ref8 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(schemeId) {
526
- var scheme;
526
+ var scheme, itemsOrder;
527
527
  return _regeneratorRuntime().wrap(function _callee6$(_context6) {
528
528
  while (1) switch (_context6.prev = _context6.next) {
529
529
  case 0:
@@ -534,9 +534,13 @@ var QuerySchemeManager = function QuerySchemeManager(_ref2) {
534
534
  scheme = schemes.find(function (s) {
535
535
  return s.id === schemeId;
536
536
  });
537
- if (scheme && scheme.itemsOrder) {
538
- updateQueryOrder === null || updateQueryOrder === void 0 || updateQueryOrder(scheme.itemsOrder);
539
- _antd.message.success('方案已应用');
537
+ if (scheme) {
538
+ // 使用新格式提取器获取顺序
539
+ itemsOrder = (0, _schemeDataMigration.extractItemsOrder)(scheme);
540
+ if (itemsOrder.length > 0) {
541
+ updateQueryOrder === null || updateQueryOrder === void 0 || updateQueryOrder(itemsOrder);
542
+ _antd.message.success('方案已应用');
543
+ }
540
544
  }
541
545
  _context6.next = 10;
542
546
  break;
@@ -646,7 +650,6 @@ var QuerySchemeManager = function QuerySchemeManager(_ref2) {
646
650
  children: /*#__PURE__*/_react.default.createElement(_antd.List, {
647
651
  dataSource: schemes,
648
652
  renderItem: function renderItem(scheme) {
649
- var _scheme$itemsOrder;
650
653
  return /*#__PURE__*/_react.default.createElement(_antd.List.Item, {
651
654
  actions: [/*#__PURE__*/_react.default.createElement(_antd.Button, {
652
655
  key: "apply",
@@ -734,7 +737,7 @@ var QuerySchemeManager = function QuerySchemeManager(_ref2) {
734
737
  }, "\u5F53\u524D"), scheme.isSystem && /*#__PURE__*/_react.default.createElement(_antd.Tag, {
735
738
  color: "default"
736
739
  }, "\u7CFB\u7EDF")),
737
- description: scheme.description || "".concat(((_scheme$itemsOrder = scheme.itemsOrder) === null || _scheme$itemsOrder === void 0 ? void 0 : _scheme$itemsOrder.length) || 0, " \u4E2A\u67E5\u8BE2\u9879")
740
+ description: scheme.description || "".concat((0, _schemeDataMigration.extractItemsOrder)(scheme).length || 0, " \u4E2A\u67E5\u8BE2\u9879")
738
741
  }));
739
742
  }
740
743
  })
@@ -322,6 +322,9 @@ function flatConfigToColumnState(flatConfig) {
322
322
  return flatConfig.filter(function (item) {
323
323
  return item.type === 'column';
324
324
  }) // 只处理列节点,分组不在 columnState 中
325
+ .filter(function (item) {
326
+ return item.field;
327
+ }) // 【修复】过滤掉没有 field 的列,防止 colId 为 undefined
325
328
  .sort(function (a, b) {
326
329
  return a.order - b.order;
327
330
  }) // 按 order 字段排序
@@ -210,19 +210,13 @@ var BackendApiSchemeAdapter = exports.BackendApiSchemeAdapter = /*#__PURE__*/fun
210
210
  });
211
211
  }
212
212
 
213
- // 将所有查询方案的字段从字符串解析为数组和对象
213
+ // 将所有查询方案的 queryConfig 字段从字符串解析为对象
214
214
  if (response.querySchemes) {
215
215
  Object.keys(response.querySchemes).forEach(function (gridId) {
216
216
  response.querySchemes[gridId] = response.querySchemes[gridId].map(function (scheme) {
217
217
  var parsedScheme = _objectSpread({}, scheme);
218
- if (typeof parsedScheme.itemsOrder === 'string') {
219
- parsedScheme.itemsOrder = JSON.parse(parsedScheme.itemsOrder);
220
- }
221
- if (typeof parsedScheme.hiddenFields === 'string') {
222
- parsedScheme.hiddenFields = JSON.parse(parsedScheme.hiddenFields);
223
- }
224
- if (typeof parsedScheme.formValues === 'string') {
225
- parsedScheme.formValues = JSON.parse(parsedScheme.formValues);
218
+ if (typeof parsedScheme.queryConfig === 'string') {
219
+ parsedScheme.queryConfig = JSON.parse(parsedScheme.queryConfig);
226
220
  }
227
221
  return parsedScheme;
228
222
  });
@@ -361,11 +355,9 @@ var BackendApiSchemeAdapter = exports.BackendApiSchemeAdapter = /*#__PURE__*/fun
361
355
  _context5.prev = 0;
362
356
  this.log("\u4FDD\u5B58\u67E5\u8BE2\u65B9\u6848: ".concat(gridId, " - ").concat(scheme.name));
363
357
 
364
- // 将数组和对象字段转换为 JSON 字符串
358
+ // 将 queryConfig 对象字段转换为 JSON 字符串
365
359
  schemeForBackend = _objectSpread(_objectSpread({}, scheme), {}, {
366
- itemsOrder: scheme.itemsOrder ? JSON.stringify(scheme.itemsOrder) : undefined,
367
- hiddenFields: scheme.hiddenFields ? JSON.stringify(scheme.hiddenFields) : undefined,
368
- formValues: scheme.formValues ? JSON.stringify(scheme.formValues) : undefined
360
+ queryConfig: scheme.queryConfig ? JSON.stringify(scheme.queryConfig) : undefined
369
361
  });
370
362
  url = "".concat(this.config.apiBaseUrl, "/api/extra-object/table-scheme/save-query-scheme");
371
363
  _context5.next = 6;
@@ -384,18 +376,10 @@ var BackendApiSchemeAdapter = exports.BackendApiSchemeAdapter = /*#__PURE__*/fun
384
376
  }
385
377
  throw new Error(response.message || '保存失败');
386
378
  case 9:
387
- // 将返回的字符串字段解析为数组和对象
379
+ // 将返回的 queryConfig 字符串字段解析为对象
388
380
  savedScheme = response.scheme;
389
- if (savedScheme) {
390
- if (typeof savedScheme.itemsOrder === 'string') {
391
- savedScheme.itemsOrder = JSON.parse(savedScheme.itemsOrder);
392
- }
393
- if (typeof savedScheme.hiddenFields === 'string') {
394
- savedScheme.hiddenFields = JSON.parse(savedScheme.hiddenFields);
395
- }
396
- if (typeof savedScheme.formValues === 'string') {
397
- savedScheme.formValues = JSON.parse(savedScheme.formValues);
398
- }
381
+ if (savedScheme && typeof savedScheme.queryConfig === 'string') {
382
+ savedScheme.queryConfig = JSON.parse(savedScheme.queryConfig);
399
383
  }
400
384
  this.log('保存成功', savedScheme);
401
385
  return _context5.abrupt("return", savedScheme);
@@ -1,4 +1,22 @@
1
1
  import type { FlatColumnItem } from '../../setting/columnGroupTypes';
2
+ /**
3
+ * 查询项配置
4
+ */
5
+ export interface QueryItem {
6
+ /** 字段名 */
7
+ field: string;
8
+ /** 是否隐藏 */
9
+ hidden?: boolean;
10
+ }
11
+ /**
12
+ * 查询配置结构
13
+ */
14
+ export interface QueryConfig {
15
+ /** 查询项配置列表 (按顺序排列) */
16
+ items: QueryItem[];
17
+ /** 查询表单默认值 */
18
+ defaultValues?: Record<string, any>;
19
+ }
2
20
  /**
3
21
  * 查询方案
4
22
  */
@@ -9,12 +27,8 @@ export interface QueryScheme {
9
27
  name: string;
10
28
  /** 方案描述 */
11
29
  description?: string;
12
- /** 查询表单字段排序 */
13
- itemsOrder?: string[];
14
- /** 隐藏的字段列表 */
15
- hiddenFields?: string[];
16
- /** 查询表单值 */
17
- formValues?: Record<string, any>;
30
+ /** 查询配置 */
31
+ queryConfig: QueryConfig;
18
32
  /** 是否为默认方案 */
19
33
  isDefault: boolean;
20
34
  /** 是否为系统方案(不可删除) */
@@ -0,0 +1,27 @@
1
+ import type { QueryScheme, QueryConfig } from '../storage/schemeStorageAdapter';
2
+ /**
3
+ * 从查询方案提取字段顺序数组
4
+ * @param scheme 查询方案对象
5
+ * @returns 字段顺序数组
6
+ */
7
+ export declare function extractItemsOrder(scheme: QueryScheme): string[];
8
+ /**
9
+ * 从查询方案提取隐藏字段数组
10
+ * @param scheme 查询方案对象
11
+ * @returns 隐藏字段数组
12
+ */
13
+ export declare function extractHiddenFields(scheme: QueryScheme): string[];
14
+ /**
15
+ * 从查询方案提取表单默认值
16
+ * @param scheme 查询方案对象
17
+ * @returns 表单默认值对象
18
+ */
19
+ export declare function extractFormValues(scheme: QueryScheme): Record<string, any>;
20
+ /**
21
+ * 构建 QueryConfig 对象
22
+ * @param itemsOrder 字段顺序数组
23
+ * @param hiddenFields 隐藏字段数组
24
+ * @param formValues 表单默认值
25
+ * @returns QueryConfig 对象
26
+ */
27
+ export declare function buildQueryConfig(itemsOrder: string[], hiddenFields?: string[], formValues?: Record<string, any>): QueryConfig;
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.buildQueryConfig = buildQueryConfig;
7
+ exports.extractFormValues = extractFormValues;
8
+ exports.extractHiddenFields = extractHiddenFields;
9
+ exports.extractItemsOrder = extractItemsOrder;
10
+ /**
11
+ * 从查询方案提取字段顺序数组
12
+ * @param scheme 查询方案对象
13
+ * @returns 字段顺序数组
14
+ */
15
+ function extractItemsOrder(scheme) {
16
+ return scheme.queryConfig.items.map(function (item) {
17
+ return item.field;
18
+ });
19
+ }
20
+
21
+ /**
22
+ * 从查询方案提取隐藏字段数组
23
+ * @param scheme 查询方案对象
24
+ * @returns 隐藏字段数组
25
+ */
26
+ function extractHiddenFields(scheme) {
27
+ return scheme.queryConfig.items.filter(function (item) {
28
+ return item.hidden;
29
+ }).map(function (item) {
30
+ return item.field;
31
+ });
32
+ }
33
+
34
+ /**
35
+ * 从查询方案提取表单默认值
36
+ * @param scheme 查询方案对象
37
+ * @returns 表单默认值对象
38
+ */
39
+ function extractFormValues(scheme) {
40
+ return scheme.queryConfig.defaultValues || {};
41
+ }
42
+
43
+ /**
44
+ * 构建 QueryConfig 对象
45
+ * @param itemsOrder 字段顺序数组
46
+ * @param hiddenFields 隐藏字段数组
47
+ * @param formValues 表单默认值
48
+ * @returns QueryConfig 对象
49
+ */
50
+ function buildQueryConfig(itemsOrder) {
51
+ var hiddenFields = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
52
+ var formValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
53
+ var items = itemsOrder.map(function (field) {
54
+ return {
55
+ field: field,
56
+ hidden: hiddenFields.includes(field)
57
+ };
58
+ });
59
+ return {
60
+ items: items,
61
+ defaultValues: Object.keys(formValues).length > 0 ? formValues : undefined
62
+ };
63
+ }
@@ -42,7 +42,6 @@ var DraggableModal = function DraggableModal(props) {
42
42
  bounds = _useState4[0],
43
43
  setBounds = _useState4[1];
44
44
  var draggleRef = (0, _react.useRef)(null);
45
- var modalContentRef = (0, _react.useRef)(null);
46
45
 
47
46
  // 调整大小相关状态
48
47
  var _useState5 = (0, _react.useState)(false),
@@ -48,6 +48,7 @@ import { localeText } from "./locale";
48
48
  import { GridPlusContext } from "./context/gridContext";
49
49
  import { useGridSchemes } from "./context/useSchemeManager";
50
50
  import { useSchemeDataFlow } from "./context/useSchemeDataFlow";
51
+ import { extractItemsOrder, extractHiddenFields } from "./shared/utils/schemeDataMigration";
51
52
  import { createSafeHtmlTemplate } from "./utils/sanitize";
52
53
  import { GridPlusError, ErrorType, ErrorSeverity } from "./errors";
53
54
  import { logger } from "./utils/logger";
@@ -1055,7 +1056,8 @@ function AgGridPlus(props) {
1055
1056
 
1056
1057
  // 使用顺序管理器处理排序
1057
1058
  var orderedFormItems = useMemo(function () {
1058
- var itemsOrder = (currentQueryScheme === null || currentQueryScheme === void 0 ? void 0 : currentQueryScheme.itemsOrder) || queryItemsOrder;
1059
+ // 从查询方案提取字段顺序
1060
+ var itemsOrder = currentQueryScheme ? extractItemsOrder(currentQueryScheme) : queryItemsOrder;
1059
1061
  if (!itemsOrder || itemsOrder.length === 0) {
1060
1062
  return queryFormItems;
1061
1063
  }
@@ -1070,18 +1072,19 @@ function AgGridPlus(props) {
1070
1072
  return indexA - indexB;
1071
1073
  });
1072
1074
  return ordered;
1073
- }, [queryFormItems, currentQueryScheme === null || currentQueryScheme === void 0 ? void 0 : currentQueryScheme.itemsOrder, queryItemsOrder]);
1075
+ }, [queryFormItems, currentQueryScheme, queryItemsOrder]);
1074
1076
 
1075
1077
  // 根据方案的隐藏字段过滤表单项
1076
1078
  var visibleFormItems = useMemo(function () {
1077
- var hiddenFields = (currentQueryScheme === null || currentQueryScheme === void 0 ? void 0 : currentQueryScheme.hiddenFields) || [];
1079
+ // 从查询方案提取隐藏字段
1080
+ var hiddenFields = currentQueryScheme ? extractHiddenFields(currentQueryScheme) : [];
1078
1081
  if (hiddenFields.length === 0) {
1079
1082
  return orderedFormItems;
1080
1083
  }
1081
1084
  return orderedFormItems.filter(function (item) {
1082
1085
  return !hiddenFields.includes(item.field);
1083
1086
  });
1084
- }, [orderedFormItems, currentQueryScheme === null || currentQueryScheme === void 0 ? void 0 : currentQueryScheme.hiddenFields]);
1087
+ }, [orderedFormItems, currentQueryScheme]);
1085
1088
  useEffect(function () {
1086
1089
  calculateSum();
1087
1090
  }, [calculateSum]);
@@ -1111,7 +1114,7 @@ function AgGridPlus(props) {
1111
1114
  applyToGlobal: applyToGlobal,
1112
1115
  resetCurrent: resetCurrent,
1113
1116
  resetAll: resetAll,
1114
- currentQueryOrder: (currentQueryScheme === null || currentQueryScheme === void 0 ? void 0 : currentQueryScheme.itemsOrder) || queryItemsOrder,
1117
+ currentQueryOrder: currentQueryScheme ? extractItemsOrder(currentQueryScheme) : queryItemsOrder,
1115
1118
  updateQueryOrder: setQueryItemsOrder,
1116
1119
  queryFormItems: queryFormItems,
1117
1120
  // ========== 方案管理 API(透传给子组件) ==========
@@ -1133,7 +1136,7 @@ function AgGridPlus(props) {
1133
1136
  };
1134
1137
  }, [extensibleColumns, gridPlusColumnState, allColDefsRef.current,
1135
1138
  // 【修复】添加到依赖数组
1136
- onSaveColumnState, applyToGlobal, resetCurrent, resetAll, currentQueryScheme === null || currentQueryScheme === void 0 ? void 0 : currentQueryScheme.itemsOrder, queryItemsOrder, queryFormItems,
1139
+ onSaveColumnState, applyToGlobal, resetCurrent, resetAll, currentQueryScheme, queryItemsOrder, queryFormItems,
1137
1140
  // 方案管理依赖
1138
1141
  columnSchemes, querySchemes, currentSchemes, schemesLoading, lastSyncTime, saveColumnScheme, deleteColumnScheme, saveQueryScheme, deleteQueryScheme, setCurrentColumnScheme, setCurrentQueryScheme, refreshSchemes, getColumnSchemes, getQuerySchemes, getCurrentScheme]);
1139
1142
  return /*#__PURE__*/React.createElement(GridPlusContext.Provider, {
@@ -216,7 +216,7 @@ var ColumnSetting = function ColumnSetting(_ref) {
216
216
  * 将扁平化配置转换回 Grid State 并应用到 AG-Grid
217
217
  */
218
218
  var handleSaveColumns = useCallback( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
219
- var values, flatConfig, configToSave, gridColumnDefs, columnState;
219
+ var values, flatConfig, configToSave, invalidColumns, gridColumnDefs, columnState;
220
220
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
221
221
  while (1) switch (_context2.prev = _context2.next) {
222
222
  case 0:
@@ -234,16 +234,28 @@ var ColumnSetting = function ColumnSetting(_ref) {
234
234
  message.info('检测到旧版本配置,已自动迁移到新格式');
235
235
  }
236
236
 
237
+ // 【修复】验证数据完整性,过滤掉无效的列配置
238
+ invalidColumns = configToSave.filter(function (item) {
239
+ return item.type === 'column' && !item.field;
240
+ });
241
+ if (invalidColumns.length > 0) {
242
+ message.warning("\u68C0\u6D4B\u5230 ".concat(invalidColumns.length, " \u4E2A\u5217\u7F3A\u5C11 field \u5B57\u6BB5\uFF0C\u5DF2\u81EA\u52A8\u8FC7\u6EE4"));
243
+ console.warn('[ColumnSetting] 无效的列配置:', invalidColumns);
244
+ configToSave = configToSave.filter(function (item) {
245
+ return item.type === 'group' || item.type === 'column' && item.field;
246
+ });
247
+ }
248
+
237
249
  // 【修复】转换为 AG-Grid 的列定义,传入原始列定义以保留自定义属性
238
250
  gridColumnDefs = flatConfigToGridState(configToSave, originalColumnDefs); // 【关键修复】先更新 columnDefs(处理分组结构变化)
239
251
  gridApi.setGridOption('columnDefs', gridColumnDefs);
240
252
 
241
253
  // 等待 columnDefs 更新完成
242
- _context2.next = 10;
254
+ _context2.next = 12;
243
255
  return new Promise(function (resolve) {
244
256
  return setTimeout(resolve, 100);
245
257
  });
246
- case 10:
258
+ case 12:
247
259
  // 【修复】然后应用列状态(宽度、隐藏、顺序等)
248
260
  columnState = flatConfigToColumnState(configToSave);
249
261
  gridApi.applyColumnState({
@@ -335,7 +347,7 @@ var ColumnSetting = function ColumnSetting(_ref) {
335
347
 
336
348
  // message.success 已经在上面的逻辑中处理了
337
349
  onClose();
338
- case 15:
350
+ case 17:
339
351
  case "end":
340
352
  return _context2.stop();
341
353
  }