@nokecy/qc-ui 1.1.30 → 1.1.32

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.
Files changed (27) hide show
  1. package/dist/cjs/ag-grid-plus/ag-gridPlus.js +68 -9
  2. package/dist/cjs/ag-grid-plus/context/gridContext.d.ts +22 -0
  3. package/dist/cjs/ag-grid-plus/context/useSchemeManager.d.ts +3 -0
  4. package/dist/cjs/ag-grid-plus/context/useSchemeManager.js +160 -1
  5. package/dist/cjs/ag-grid-plus/index.d.ts +1 -0
  6. package/dist/cjs/ag-grid-plus/setting/ColumnSetting.js +192 -50
  7. package/dist/cjs/ag-grid-plus/shared/permissions/globalConfigPermissions.d.ts +22 -0
  8. package/dist/cjs/ag-grid-plus/shared/permissions/globalConfigPermissions.js +5 -0
  9. package/dist/cjs/ag-grid-plus/shared/storage/localStorageAdapter.d.ts +18 -0
  10. package/dist/cjs/ag-grid-plus/shared/storage/localStorageAdapter.js +114 -0
  11. package/dist/cjs/ag-grid-plus/shared/storage/schemeStorageAdapter.d.ts +25 -0
  12. package/dist/cjs/index.d.ts +1 -1
  13. package/dist/esm/ag-grid-plus/ag-gridPlus.js +68 -9
  14. package/dist/esm/ag-grid-plus/context/gridContext.d.ts +22 -0
  15. package/dist/esm/ag-grid-plus/context/useSchemeManager.d.ts +3 -0
  16. package/dist/esm/ag-grid-plus/context/useSchemeManager.js +160 -1
  17. package/dist/esm/ag-grid-plus/index.d.ts +1 -0
  18. package/dist/esm/ag-grid-plus/index.js +2 -0
  19. package/dist/esm/ag-grid-plus/setting/ColumnSetting.js +195 -51
  20. package/dist/esm/ag-grid-plus/shared/permissions/globalConfigPermissions.d.ts +22 -0
  21. package/dist/esm/ag-grid-plus/shared/permissions/globalConfigPermissions.js +1 -0
  22. package/dist/esm/ag-grid-plus/shared/storage/localStorageAdapter.d.ts +18 -0
  23. package/dist/esm/ag-grid-plus/shared/storage/localStorageAdapter.js +114 -0
  24. package/dist/esm/ag-grid-plus/shared/storage/schemeStorageAdapter.d.ts +25 -0
  25. package/dist/esm/index.d.ts +1 -1
  26. package/dist/umd/qc-ui.min.js +1 -1
  27. package/package.json +1 -1
@@ -50,7 +50,7 @@ var TextArea = _antd.Input.TextArea;
50
50
  * 列方案管理组件 - 集成列配置和列方案管理
51
51
  */
52
52
  var ColumnSetting = function ColumnSetting(_ref) {
53
- var _currentSchemes$gridK4;
53
+ var _globalConfigPermissi, _globalConfigPermissi2, _currentSchemes$gridK4;
54
54
  var gridKey = _ref.gridKey,
55
55
  gridApi = _ref.gridApi,
56
56
  visible = _ref.visible,
@@ -64,7 +64,15 @@ var ColumnSetting = function ColumnSetting(_ref) {
64
64
  initialColumnDefs = _useGridSchemes.initialColumnDefs,
65
65
  saveColumnScheme = _useGridSchemes.saveColumnScheme,
66
66
  deleteColumnScheme = _useGridSchemes.deleteColumnScheme,
67
- setCurrentColumnScheme = _useGridSchemes.setCurrentColumnScheme;
67
+ setCurrentColumnScheme = _useGridSchemes.setCurrentColumnScheme,
68
+ applySchemeToGlobal = _useGridSchemes.applySchemeToGlobal,
69
+ resetToGlobal = _useGridSchemes.resetToGlobal,
70
+ resetAllUsers = _useGridSchemes.resetAllUsers,
71
+ globalConfigPermissions = _useGridSchemes.globalConfigPermissions;
72
+
73
+ // 解构权限信息
74
+ var canApplyToGlobal = (_globalConfigPermissi = globalConfigPermissions === null || globalConfigPermissions === void 0 ? void 0 : globalConfigPermissions.canApplyToGlobal) !== null && _globalConfigPermissi !== void 0 ? _globalConfigPermissi : false;
75
+ var canResetAllUsers = (_globalConfigPermissi2 = globalConfigPermissions === null || globalConfigPermissions === void 0 ? void 0 : globalConfigPermissions.canResetAllUsers) !== null && _globalConfigPermissi2 !== void 0 ? _globalConfigPermissi2 : false;
68
76
 
69
77
  // 获取当前表格的方案列表
70
78
  var schemes = (columnSchemes === null || columnSchemes === void 0 ? void 0 : columnSchemes[gridKey]) || [];
@@ -514,9 +522,16 @@ var ColumnSetting = function ColumnSetting(_ref) {
514
522
  _context2.prev = 8;
515
523
  filterModel = gridApi.getFilterModel();
516
524
  if (!currentScheme) {
517
- _context2.next = 18;
525
+ _context2.next = 21;
526
+ break;
527
+ }
528
+ if (!(currentScheme.isGlobal && !canApplyToGlobal)) {
529
+ _context2.next = 14;
518
530
  break;
519
531
  }
532
+ _antd.message.error('没有权限修改全局方案');
533
+ return _context2.abrupt("return");
534
+ case 14:
520
535
  // 如果有激活的方案,更新该方案
521
536
  createdAt = currentScheme.createdAt, updatedAt = currentScheme.updatedAt, schemeWithoutTimestamps = _objectWithoutProperties(currentScheme, _excluded);
522
537
  savedScheme = _objectSpread(_objectSpread({}, schemeWithoutTimestamps), {}, {
@@ -524,21 +539,28 @@ var ColumnSetting = function ColumnSetting(_ref) {
524
539
  filterModel: filterModel
525
540
  // createdAt 和 updatedAt 由存储适配器自动生成
526
541
  });
527
- _context2.next = 15;
542
+ _context2.next = 18;
528
543
  return saveColumnScheme === null || saveColumnScheme === void 0 ? void 0 : saveColumnScheme(gridKey, savedScheme);
529
- case 15:
544
+ case 18:
530
545
  _antd.message.success('列配置已保存到方案');
531
- _context2.next = 31;
546
+ _context2.next = 37;
532
547
  break;
533
- case 18:
548
+ case 21:
534
549
  // 如果没有激活的方案,自动创建或更新默认方案
535
550
  defaultScheme = schemes.find(function (s) {
536
551
  return s.isDefault;
537
552
  });
538
553
  if (!defaultScheme) {
539
- _context2.next = 27;
554
+ _context2.next = 33;
555
+ break;
556
+ }
557
+ if (!(defaultScheme.isGlobal && !canApplyToGlobal)) {
558
+ _context2.next = 26;
540
559
  break;
541
560
  }
561
+ _antd.message.error('没有权限修改全局方案');
562
+ return _context2.abrupt("return");
563
+ case 26:
542
564
  // 更新默认方案
543
565
  _createdAt = defaultScheme.createdAt, _updatedAt = defaultScheme.updatedAt, _schemeWithoutTimestamps = _objectWithoutProperties(defaultScheme, _excluded2);
544
566
  savedScheme = _objectSpread(_objectSpread({}, _schemeWithoutTimestamps), {}, {
@@ -546,13 +568,13 @@ var ColumnSetting = function ColumnSetting(_ref) {
546
568
  filterModel: filterModel
547
569
  // createdAt 和 updatedAt 由存储适配器自动生成
548
570
  });
549
- _context2.next = 24;
571
+ _context2.next = 30;
550
572
  return saveColumnScheme === null || saveColumnScheme === void 0 ? void 0 : saveColumnScheme(gridKey, savedScheme);
551
- case 24:
573
+ case 30:
552
574
  _antd.message.success('列配置已保存到默认方案');
553
- _context2.next = 31;
575
+ _context2.next = 37;
554
576
  break;
555
- case 27:
577
+ case 33:
556
578
  // 创建新的默认方案
557
579
  savedScheme = {
558
580
  id: (0, _uuid.v4)(),
@@ -564,25 +586,25 @@ var ColumnSetting = function ColumnSetting(_ref) {
564
586
  isSystem: false
565
587
  // createdAt 和 updatedAt 由存储适配器自动生成
566
588
  };
567
- _context2.next = 30;
589
+ _context2.next = 36;
568
590
  return saveColumnScheme === null || saveColumnScheme === void 0 ? void 0 : saveColumnScheme(gridKey, savedScheme);
569
- case 30:
591
+ case 36:
570
592
  _antd.message.success('已创建并保存到默认方案');
571
- case 31:
572
- _context2.next = 33;
593
+ case 37:
594
+ _context2.next = 39;
573
595
  return new Promise(function (resolve) {
574
596
  return setTimeout(resolve, 100);
575
597
  });
576
- case 33:
598
+ case 39:
577
599
  gridColumnDefs = (0, _columnGroupUtils.flatConfigToGridState)(savedScheme.columnConfig, allColDefs);
578
600
  gridApi.setGridOption('columnDefs', gridColumnDefs);
579
601
 
580
602
  // 等待 columnDefs 更新完成
581
- _context2.next = 37;
603
+ _context2.next = 43;
582
604
  return new Promise(function (resolve) {
583
605
  return setTimeout(resolve, 100);
584
606
  });
585
- case 37:
607
+ case 43:
586
608
  columnState = (0, _columnGroupUtils.flatConfigToColumnState)(savedScheme.columnConfig);
587
609
  gridApi.applyColumnState({
588
610
  state: columnState,
@@ -596,31 +618,31 @@ var ColumnSetting = function ColumnSetting(_ref) {
596
618
 
597
619
  // 4. 设置为当前方案(如果不是当前方案)
598
620
  if (!(!currentScheme || savedScheme.id !== currentScheme.id)) {
599
- _context2.next = 43;
621
+ _context2.next = 49;
600
622
  break;
601
623
  }
602
- _context2.next = 43;
624
+ _context2.next = 49;
603
625
  return setCurrentColumnScheme === null || setCurrentColumnScheme === void 0 ? void 0 : setCurrentColumnScheme(gridKey, savedScheme.id);
604
- case 43:
605
- _context2.next = 45;
626
+ case 49:
627
+ _context2.next = 51;
606
628
  return new Promise(function (resolve) {
607
629
  return setTimeout(resolve, 50);
608
630
  });
609
- case 45:
631
+ case 51:
610
632
  // 5. 关闭弹窗
611
633
  onClose();
612
- _context2.next = 52;
634
+ _context2.next = 58;
613
635
  break;
614
- case 48:
615
- _context2.prev = 48;
636
+ case 54:
637
+ _context2.prev = 54;
616
638
  _context2.t0 = _context2["catch"](8);
617
639
  console.error('保存列配置到方案失败:', _context2.t0);
618
640
  _antd.message.error('保存列配置失败');
619
- case 52:
641
+ case 58:
620
642
  case "end":
621
643
  return _context2.stop();
622
644
  }
623
- }, _callee2, null, [[8, 48]]);
645
+ }, _callee2, null, [[8, 54]]);
624
646
  })), [form, gridApi, saveColumnScheme, setCurrentColumnScheme, currentScheme, schemes, gridKey, allColDefs, onClose]);
625
647
 
626
648
  // 保存为新方案
@@ -828,28 +850,127 @@ var ColumnSetting = function ColumnSetting(_ref) {
828
850
  setEditingDescription(scheme.description || '');
829
851
  }, []);
830
852
 
853
+ // ========== 全局配置操作处理函数 ==========
854
+
855
+ /**
856
+ * 创建带确认弹窗的操作处理器
857
+ * @author nokecy
858
+ */
859
+ var createConfirmHandler = (0, _react.useCallback)(function (config) {
860
+ return function () {
861
+ _antd.Modal.confirm({
862
+ title: config.title,
863
+ icon: /*#__PURE__*/_react.default.createElement(_icons.ExclamationCircleOutlined, null),
864
+ content: config.content,
865
+ okText: config.okText || '确定',
866
+ okButtonProps: config.danger ? {
867
+ danger: true
868
+ } : undefined,
869
+ cancelText: '取消',
870
+ onOk: function () {
871
+ var _onOk = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() {
872
+ var _config$onSuccess;
873
+ return _regeneratorRuntime().wrap(function _callee6$(_context6) {
874
+ while (1) switch (_context6.prev = _context6.next) {
875
+ case 0:
876
+ _context6.prev = 0;
877
+ _context6.next = 3;
878
+ return config.action();
879
+ case 3:
880
+ (_config$onSuccess = config.onSuccess) === null || _config$onSuccess === void 0 || _config$onSuccess.call(config);
881
+ _context6.next = 8;
882
+ break;
883
+ case 6:
884
+ _context6.prev = 6;
885
+ _context6.t0 = _context6["catch"](0);
886
+ case 8:
887
+ case "end":
888
+ return _context6.stop();
889
+ }
890
+ }, _callee6, null, [[0, 6]]);
891
+ }));
892
+ function onOk() {
893
+ return _onOk.apply(this, arguments);
894
+ }
895
+ return onOk;
896
+ }()
897
+ });
898
+ };
899
+ }, []);
900
+
901
+ // 应用到全局
902
+ var handleApplyToGlobal = (0, _react.useCallback)(function (schemeId) {
903
+ return createConfirmHandler({
904
+ title: '应用到全局',
905
+ content: '确定要将此方案应用为全局默认配置吗?这将影响所有没有个人配置的用户。',
906
+ action: function action() {
907
+ var _applySchemeToGlobal;
908
+ return (_applySchemeToGlobal = applySchemeToGlobal === null || applySchemeToGlobal === void 0 ? void 0 : applySchemeToGlobal(gridKey, schemeId)) !== null && _applySchemeToGlobal !== void 0 ? _applySchemeToGlobal : Promise.resolve();
909
+ }
910
+ })();
911
+ }, [createConfirmHandler, applySchemeToGlobal, gridKey]);
912
+
913
+ // 重置为全局配置
914
+ var handleResetToGlobal = (0, _react.useCallback)(function () {
915
+ return createConfirmHandler({
916
+ title: '重置为全局配置',
917
+ content: '确定要删除您的个人配置,使用全局默认配置吗?',
918
+ action: function action() {
919
+ var _resetToGlobal;
920
+ return (_resetToGlobal = resetToGlobal === null || resetToGlobal === void 0 ? void 0 : resetToGlobal(gridKey)) !== null && _resetToGlobal !== void 0 ? _resetToGlobal : Promise.resolve();
921
+ },
922
+ onSuccess: onClose
923
+ })();
924
+ }, [createConfirmHandler, resetToGlobal, gridKey, onClose]);
925
+
926
+ // 重置所有用户配置
927
+ var handleResetAllUsers = (0, _react.useCallback)(function () {
928
+ return createConfirmHandler({
929
+ title: '重置所有用户配置',
930
+ content: /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("p", {
931
+ style: {
932
+ color: '#ff4d4f',
933
+ fontWeight: 'bold'
934
+ }
935
+ }, "\u6B64\u64CD\u4F5C\u4E0D\u53EF\u6062\u590D\uFF01"), /*#__PURE__*/_react.default.createElement("p", null, "\u786E\u5B9A\u8981\u5220\u9664\u6240\u6709\u7528\u6237\u7684\u4E2A\u4EBA\u5217\u914D\u7F6E\u5417\uFF1F"), /*#__PURE__*/_react.default.createElement("p", null, "\u6267\u884C\u540E\uFF0C\u6240\u6709\u7528\u6237\u5C06\u4F7F\u7528\u5168\u5C40\u9ED8\u8BA4\u914D\u7F6E\u3002")),
936
+ okText: '确定重置',
937
+ danger: true,
938
+ action: function action() {
939
+ var _resetAllUsers;
940
+ return (_resetAllUsers = resetAllUsers === null || resetAllUsers === void 0 ? void 0 : resetAllUsers(gridKey)) !== null && _resetAllUsers !== void 0 ? _resetAllUsers : Promise.resolve();
941
+ }
942
+ })();
943
+ }, [createConfirmHandler, resetAllUsers, gridKey]);
944
+
945
+ // 判断是否存在用户个人方案
946
+ var hasUserSchemes = (0, _react.useMemo)(function () {
947
+ return schemes.some(function (s) {
948
+ return !s.isGlobal;
949
+ });
950
+ }, [schemes]);
951
+
831
952
  // 保存编辑
832
- var handleSaveEdit = (0, _react.useCallback)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() {
953
+ var handleSaveEdit = (0, _react.useCallback)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7() {
833
954
  var scheme, createdAt, updatedAt, schemeWithoutTimestamps;
834
- return _regeneratorRuntime().wrap(function _callee6$(_context6) {
835
- while (1) switch (_context6.prev = _context6.next) {
955
+ return _regeneratorRuntime().wrap(function _callee7$(_context7) {
956
+ while (1) switch (_context7.prev = _context7.next) {
836
957
  case 0:
837
958
  if (editingId) {
838
- _context6.next = 2;
959
+ _context7.next = 2;
839
960
  break;
840
961
  }
841
- return _context6.abrupt("return");
962
+ return _context7.abrupt("return");
842
963
  case 2:
843
- _context6.prev = 2;
964
+ _context7.prev = 2;
844
965
  scheme = schemes.find(function (s) {
845
966
  return s.id === editingId;
846
967
  });
847
968
  if (!scheme) {
848
- _context6.next = 10;
969
+ _context7.next = 10;
849
970
  break;
850
971
  }
851
972
  createdAt = scheme.createdAt, updatedAt = scheme.updatedAt, schemeWithoutTimestamps = _objectWithoutProperties(scheme, _excluded3);
852
- _context6.next = 8;
973
+ _context7.next = 8;
853
974
  return saveColumnScheme === null || saveColumnScheme === void 0 ? void 0 : saveColumnScheme(gridKey, _objectSpread(_objectSpread({}, schemeWithoutTimestamps), {}, {
854
975
  name: editingName.trim(),
855
976
  description: editingDescription.trim() || undefined
@@ -859,17 +980,17 @@ var ColumnSetting = function ColumnSetting(_ref) {
859
980
  _antd.message.success('更新成功');
860
981
  setEditingId(null);
861
982
  case 10:
862
- _context6.next = 15;
983
+ _context7.next = 15;
863
984
  break;
864
985
  case 12:
865
- _context6.prev = 12;
866
- _context6.t0 = _context6["catch"](2);
867
- _antd.message.error(_context6.t0.message || '更新失败');
986
+ _context7.prev = 12;
987
+ _context7.t0 = _context7["catch"](2);
988
+ _antd.message.error(_context7.t0.message || '更新失败');
868
989
  case 15:
869
990
  case "end":
870
- return _context6.stop();
991
+ return _context7.stop();
871
992
  }
872
- }, _callee6, null, [[2, 12]]);
993
+ }, _callee7, null, [[2, 12]]);
873
994
  })), [schemes, saveColumnScheme, gridKey, editingId, editingName, editingDescription]);
874
995
 
875
996
  // 筛选方案列表
@@ -908,7 +1029,11 @@ var ColumnSetting = function ColumnSetting(_ref) {
908
1029
  }
909
1030
  return /*#__PURE__*/_react.default.createElement(_antd.Space, {
910
1031
  size: "small"
911
- }, /*#__PURE__*/_react.default.createElement("span", null, record.name), record.isDefault && /*#__PURE__*/_react.default.createElement(_antd.Tag, {
1032
+ }, /*#__PURE__*/_react.default.createElement("span", null, record.name), record.isGlobal ? /*#__PURE__*/_react.default.createElement(_antd.Tag, {
1033
+ color: "purple"
1034
+ }, "\u5168\u5C40") : /*#__PURE__*/_react.default.createElement(_antd.Tag, {
1035
+ color: "cyan"
1036
+ }, "\u4E2A\u4EBA"), record.isDefault && /*#__PURE__*/_react.default.createElement(_antd.Tag, {
912
1037
  color: "blue"
913
1038
  }, "\u9ED8\u8BA4"), record.id === (currentSchemes === null || currentSchemes === void 0 || (_currentSchemes$gridK3 = currentSchemes[gridKey]) === null || _currentSchemes$gridK3 === void 0 ? void 0 : _currentSchemes$gridK3.columnSchemeId) && /*#__PURE__*/_react.default.createElement(_antd.Tag, {
914
1039
  color: "green"
@@ -948,7 +1073,8 @@ var ColumnSetting = function ColumnSetting(_ref) {
948
1073
  }, {
949
1074
  headerName: '操作',
950
1075
  colId: 'actions',
951
- width: 220,
1076
+ width: 280,
1077
+ // 加宽以容纳新按钮
952
1078
  cellRenderer: function cellRenderer(params) {
953
1079
  var record = params.data;
954
1080
  if (!record) return null;
@@ -987,7 +1113,16 @@ var ColumnSetting = function ColumnSetting(_ref) {
987
1113
  onClick: function onClick() {
988
1114
  return handleSetDefault(record.id);
989
1115
  }
990
- })), /*#__PURE__*/_react.default.createElement(_antd.Tooltip, {
1116
+ })), !record.isGlobal && canApplyToGlobal && /*#__PURE__*/_react.default.createElement(_antd.Tooltip, {
1117
+ title: "\u5E94\u7528\u5230\u5168\u5C40"
1118
+ }, /*#__PURE__*/_react.default.createElement(_antd.Button, {
1119
+ type: "link",
1120
+ size: "small",
1121
+ icon: /*#__PURE__*/_react.default.createElement(_icons.GlobalOutlined, null),
1122
+ onClick: function onClick() {
1123
+ return handleApplyToGlobal(record.id);
1124
+ }
1125
+ })), (!record.isGlobal || canApplyToGlobal) && /*#__PURE__*/_react.default.createElement(_antd.Tooltip, {
991
1126
  title: "\u7F16\u8F91"
992
1127
  }, /*#__PURE__*/_react.default.createElement(_antd.Button, {
993
1128
  type: "link",
@@ -996,8 +1131,8 @@ var ColumnSetting = function ColumnSetting(_ref) {
996
1131
  onClick: function onClick() {
997
1132
  return handleEditScheme(record);
998
1133
  }
999
- })), /*#__PURE__*/_react.default.createElement(_antd.Popconfirm, {
1000
- title: "\u786E\u5B9A\u8981\u5220\u9664\u6B64\u65B9\u6848\u5417?",
1134
+ })), (!record.isGlobal || canApplyToGlobal) && /*#__PURE__*/_react.default.createElement(_antd.Popconfirm, {
1135
+ title: record.isGlobal ? "确定要删除此全局方案吗?这将影响所有用户!" : "确定要删除此方案吗?",
1001
1136
  onConfirm: function onConfirm() {
1002
1137
  return handleDeleteScheme(record.id, record.name);
1003
1138
  },
@@ -1046,13 +1181,20 @@ var ColumnSetting = function ColumnSetting(_ref) {
1046
1181
  onClick: function onClick() {
1047
1182
  return setSaveSchemeVisible(true);
1048
1183
  }
1049
- }, "\u53E6\u5B58\u4E3A\u65B9\u6848")) : /*#__PURE__*/_react.default.createElement(_antd.Button, {
1184
+ }, "\u53E6\u5B58\u4E3A\u65B9\u6848")) : /*#__PURE__*/_react.default.createElement(_antd.Space, null, hasUserSchemes && /*#__PURE__*/_react.default.createElement(_antd.Button, {
1185
+ icon: /*#__PURE__*/_react.default.createElement(_icons.RollbackOutlined, null),
1186
+ onClick: handleResetToGlobal
1187
+ }, "\u91CD\u7F6E\u4E3A\u5168\u5C40\u914D\u7F6E"), canResetAllUsers && /*#__PURE__*/_react.default.createElement(_antd.Button, {
1188
+ danger: true,
1189
+ icon: /*#__PURE__*/_react.default.createElement(_icons.ClearOutlined, null),
1190
+ onClick: handleResetAllUsers
1191
+ }, "\u91CD\u7F6E\u6240\u6709\u7528\u6237"), /*#__PURE__*/_react.default.createElement(_antd.Button, {
1050
1192
  type: "primary",
1051
1193
  icon: /*#__PURE__*/_react.default.createElement(_icons.SaveOutlined, null),
1052
1194
  onClick: function onClick() {
1053
1195
  return setSaveSchemeVisible(true);
1054
1196
  }
1055
- }, "\u4FDD\u5B58\u4E3A\u65B0\u65B9\u6848")
1197
+ }, "\u4FDD\u5B58\u4E3A\u65B0\u65B9\u6848"))
1056
1198
  }, /*#__PURE__*/_react.default.createElement(TabPane, {
1057
1199
  tab: "\u5217\u914D\u7F6E",
1058
1200
  key: "columns"
@@ -0,0 +1,22 @@
1
+ /**
2
+ * 全局配置权限信息
3
+ * 由使用端(业务应用)统一传入,而非从后端 API 获取
4
+ * @author nokecy
5
+ *
6
+ * @example
7
+ * ```tsx
8
+ * <GridPlusContext.Provider value={{
9
+ * ...schemeManager,
10
+ * globalConfigPermissions: {
11
+ * canApplyToGlobal: currentUser.hasPermission('TableScheme.ManageGlobalConfig'),
12
+ * canResetAllUsers: currentUser.hasPermission('TableScheme.ManageGlobalConfig'),
13
+ * }
14
+ * }}>
15
+ * ```
16
+ */
17
+ export interface GlobalConfigPermissions {
18
+ /** 是否可以应用到全局 */
19
+ canApplyToGlobal: boolean;
20
+ /** 是否可以重置所有用户配置 */
21
+ canResetAllUsers: boolean;
22
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -42,6 +42,24 @@ export declare class LocalStorageSchemeAdapter implements SchemeStorageAdapter {
42
42
  saveQueryScheme(gridId: string, scheme: QueryScheme): Promise<QueryScheme>;
43
43
  deleteQueryScheme(gridId: string, schemeId: string): Promise<void>;
44
44
  setCurrentScheme(gridId: string, columnSchemeId: string | null, querySchemeId: string | null): Promise<void>;
45
+ /**
46
+ * 将方案应用到全局
47
+ * LocalStorage 实现: 将方案标记为 isGlobal=true
48
+ * @author nokecy
49
+ */
50
+ applyToGlobal(gridId: string, schemeId: string): Promise<string>;
51
+ /**
52
+ * 重置为全局配置
53
+ * LocalStorage 实现: 清除当前方案选择,让其回退到全局方案
54
+ * @author nokecy
55
+ */
56
+ resetToGlobal(gridId: string): Promise<void>;
57
+ /**
58
+ * 重置所有用户配置
59
+ * LocalStorage 实现: 删除所有非全局方案,清除当前方案选择
60
+ * @author nokecy
61
+ */
62
+ resetAllUsers(gridId: string): Promise<void>;
45
63
  /**
46
64
  * 清除所有数据
47
65
  */
@@ -325,10 +325,124 @@ var LocalStorageSchemeAdapter = exports.LocalStorageSchemeAdapter = /*#__PURE__*
325
325
  return _setCurrentScheme.apply(this, arguments);
326
326
  }
327
327
  return setCurrentScheme;
328
+ }() // ========== 全局配置操作(模拟实现) ==========
329
+ /**
330
+ * 将方案应用到全局
331
+ * LocalStorage 实现: 将方案标记为 isGlobal=true
332
+ * @author nokecy
333
+ */
334
+ }, {
335
+ key: "applyToGlobal",
336
+ value: function () {
337
+ var _applyToGlobal = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(gridId, schemeId) {
338
+ var data, schemes, scheme;
339
+ return _regeneratorRuntime().wrap(function _callee7$(_context7) {
340
+ while (1) switch (_context7.prev = _context7.next) {
341
+ case 0:
342
+ data = this.readData();
343
+ schemes = data.columnSchemes[gridId] || [];
344
+ scheme = schemes.find(function (s) {
345
+ return s.id === schemeId;
346
+ });
347
+ if (scheme) {
348
+ _context7.next = 5;
349
+ break;
350
+ }
351
+ throw new Error("\u65B9\u6848\u4E0D\u5B58\u5728: ".concat(schemeId));
352
+ case 5:
353
+ // 先将所有方案的 isGlobal 设为 false
354
+ schemes.forEach(function (s) {
355
+ s.isGlobal = false;
356
+ });
357
+
358
+ // 将目标方案标记为全局方案
359
+ scheme.isGlobal = true;
360
+ scheme.updatedAt = Date.now();
361
+ this.log("\u5E94\u7528\u5230\u5168\u5C40: ".concat(gridId, " - ").concat(scheme.name));
362
+ this.writeData(data);
363
+ return _context7.abrupt("return", schemeId);
364
+ case 11:
365
+ case "end":
366
+ return _context7.stop();
367
+ }
368
+ }, _callee7, this);
369
+ }));
370
+ function applyToGlobal(_x12, _x13) {
371
+ return _applyToGlobal.apply(this, arguments);
372
+ }
373
+ return applyToGlobal;
374
+ }()
375
+ /**
376
+ * 重置为全局配置
377
+ * LocalStorage 实现: 清除当前方案选择,让其回退到全局方案
378
+ * @author nokecy
379
+ */
380
+ }, {
381
+ key: "resetToGlobal",
382
+ value: (function () {
383
+ var _resetToGlobal = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(gridId) {
384
+ var data;
385
+ return _regeneratorRuntime().wrap(function _callee8$(_context8) {
386
+ while (1) switch (_context8.prev = _context8.next) {
387
+ case 0:
388
+ data = this.readData(); // 清除当前用户的列方案选择
389
+ if (data.currentSchemes[gridId]) {
390
+ data.currentSchemes[gridId].columnSchemeId = null;
391
+ }
392
+ this.log("\u91CD\u7F6E\u4E3A\u5168\u5C40\u914D\u7F6E: ".concat(gridId));
393
+ this.writeData(data);
394
+ case 4:
395
+ case "end":
396
+ return _context8.stop();
397
+ }
398
+ }, _callee8, this);
399
+ }));
400
+ function resetToGlobal(_x14) {
401
+ return _resetToGlobal.apply(this, arguments);
402
+ }
403
+ return resetToGlobal;
404
+ }()
405
+ /**
406
+ * 重置所有用户配置
407
+ * LocalStorage 实现: 删除所有非全局方案,清除当前方案选择
408
+ * @author nokecy
409
+ */
410
+ )
411
+ }, {
412
+ key: "resetAllUsers",
413
+ value: (function () {
414
+ var _resetAllUsers = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9(gridId) {
415
+ var data, schemes;
416
+ return _regeneratorRuntime().wrap(function _callee9$(_context9) {
417
+ while (1) switch (_context9.prev = _context9.next) {
418
+ case 0:
419
+ data = this.readData();
420
+ schemes = data.columnSchemes[gridId] || []; // 只保留全局方案
421
+ data.columnSchemes[gridId] = schemes.filter(function (s) {
422
+ return s.isGlobal;
423
+ });
424
+
425
+ // 清除当前方案选择
426
+ if (data.currentSchemes[gridId]) {
427
+ data.currentSchemes[gridId].columnSchemeId = null;
428
+ }
429
+ this.log("\u91CD\u7F6E\u6240\u6709\u7528\u6237\u914D\u7F6E: ".concat(gridId, "\uFF0C\u4FDD\u7559 ").concat(data.columnSchemes[gridId].length, " \u4E2A\u5168\u5C40\u65B9\u6848"));
430
+ this.writeData(data);
431
+ case 6:
432
+ case "end":
433
+ return _context9.stop();
434
+ }
435
+ }, _callee9, this);
436
+ }));
437
+ function resetAllUsers(_x15) {
438
+ return _resetAllUsers.apply(this, arguments);
439
+ }
440
+ return resetAllUsers;
328
441
  }() // ========== 工具方法 ==========
329
442
  /**
330
443
  * 清除所有数据
331
444
  */
445
+ )
332
446
  }, {
333
447
  key: "clearAll",
334
448
  value: function clearAll() {
@@ -101,6 +101,8 @@ export interface ColumnScheme {
101
101
  updatedAt?: number;
102
102
  /** 创建用户ID(可选) */
103
103
  createdBy?: string;
104
+ /** 方案来源标识(便于前端区分展示,由前端计算) */
105
+ isGlobal?: boolean;
104
106
  }
105
107
  /**
106
108
  * 方案同步数据结构
@@ -172,6 +174,29 @@ export interface SchemeStorageAdapter {
172
174
  * @param querySchemeId 查询方案ID (null 表示清除)
173
175
  */
174
176
  setCurrentScheme(gridId: string, columnSchemeId: string | null, querySchemeId: string | null): Promise<void>;
177
+ /**
178
+ * 将方案应用到全局(管理员操作)
179
+ * 将指定的用户方案复制为 UserId=null 的全局方案
180
+ * @param gridId 表格标识
181
+ * @param schemeId 源方案ID(用户的方案)
182
+ * @returns 全局方案ID
183
+ * @throws 403 - 无权限
184
+ * @throws 404 - 源方案不存在
185
+ */
186
+ applyToGlobal?(gridId: string, schemeId: string): Promise<string>;
187
+ /**
188
+ * 重置当前用户配置,回退到全局配置
189
+ * 删除当前用户在指定表格的所有个人方案
190
+ * @param gridId 表格标识
191
+ */
192
+ resetToGlobal?(gridId: string): Promise<void>;
193
+ /**
194
+ * 重置所有用户配置(管理员操作)
195
+ * 删除指定表格下所有用户的个人方案,保留全局方案
196
+ * @param gridId 表格标识
197
+ * @throws 403 - 无权限
198
+ */
199
+ resetAllUsers?(gridId: string): Promise<void>;
175
200
  }
176
201
  /**
177
202
  * 适配器配置基类
@@ -29,5 +29,5 @@ export type * from "./importModal";
29
29
  export type * from "./fullScreenAlert";
30
30
  export type * from "./RuleBuilder";
31
31
  export type { ColumnConfig } from "./array-table/columnHelper";
32
- export type { CentralizedColumnScheme, QueryScheme, SchemeStorageAdapter, SchemeSyncDataDto, CurrentSchemeDto, SchemeStorageConfig, LocalStorageAdapterConfig, BackendApiAdapterConfig, UseSchemeManagerConfig, GridPlusContextValue, } from "./ag-grid-plus";
32
+ export type { CentralizedColumnScheme, QueryScheme, SchemeStorageAdapter, SchemeSyncDataDto, CurrentSchemeDto, SchemeStorageConfig, LocalStorageAdapterConfig, BackendApiAdapterConfig, UseSchemeManagerConfig, GridPlusContextValue, GlobalConfigPermissions, } from "./ag-grid-plus";
33
33
  export type { ParseResult as RegexParseResult, ValidationResult as RegexValidationResult, RegexError, ComplexityMetrics, ASTNode, AstRegExp, RegexTemplate, TestResult as RegexTestResult, CodeMirrorWrapperProps, RegexEditorProps, RegexFlags, MatchResult, RegexTesterProps, FlagsSelectorProps, MatchItemProps, RegexRailroadDiagramProps, } from "./components/RegexEditor";