@nokecy/qc-ui 1.0.82 → 1.0.83

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 (81) hide show
  1. package/dist/cjs/ag-grid-plus/_utils/processColumnGroups.d.ts +9 -0
  2. package/dist/cjs/ag-grid-plus/_utils/processColumnGroups.js +43 -0
  3. package/dist/cjs/ag-grid-plus/ag-gridPlus.js +245 -121
  4. package/dist/cjs/ag-grid-plus/schemes/components/SchemeSelector.d.ts +1 -1
  5. package/dist/cjs/ag-grid-plus/schemes/components/SchemeSelector.js +1 -1
  6. package/dist/cjs/ag-grid-plus/schemes/hooks/useColumnSchemes.js +60 -14
  7. package/dist/cjs/ag-grid-plus/schemes/storage/localStorageAdapter.js +12 -26
  8. package/dist/cjs/ag-grid-plus/schemes/types.d.ts +8 -5
  9. package/dist/cjs/ag-grid-plus/schemes/utils/validator.js +14 -18
  10. package/dist/cjs/ag-grid-plus/setting/ColumnConfigForm.d.ts +16 -0
  11. package/dist/cjs/ag-grid-plus/setting/ColumnConfigForm.js +348 -0
  12. package/dist/cjs/ag-grid-plus/setting/ColumnConfigTable.d.ts +20 -0
  13. package/dist/cjs/ag-grid-plus/setting/ColumnConfigTable.js +940 -0
  14. package/dist/cjs/ag-grid-plus/setting/ColumnSetting.js +208 -248
  15. package/dist/cjs/ag-grid-plus/setting/MoveNodeModal.d.ts +15 -0
  16. package/dist/cjs/ag-grid-plus/setting/MoveNodeModal.js +160 -0
  17. package/dist/cjs/ag-grid-plus/setting/NameColumnRenderer.d.ts +18 -0
  18. package/dist/cjs/ag-grid-plus/setting/NameColumnRenderer.js +94 -0
  19. package/dist/cjs/ag-grid-plus/setting/columnGroupTypes.d.ts +59 -0
  20. package/dist/cjs/ag-grid-plus/setting/columnGroupTypes.js +5 -0
  21. package/dist/cjs/ag-grid-plus/setting/columnGroupUtils.d.ts +75 -0
  22. package/dist/cjs/ag-grid-plus/setting/columnGroupUtils.js +281 -0
  23. package/dist/cjs/ag-grid-plus/setting/index.d.ts +2 -1
  24. package/dist/cjs/ag-grid-plus/setting/index.js +4 -2
  25. package/dist/cjs/ag-grid-plus/storage/SchemeSyncManager.d.ts +2 -1
  26. package/dist/cjs/ag-grid-plus/storage/SchemeSyncManager.js +11 -8
  27. package/dist/cjs/ag-grid-plus/types.d.ts +2 -0
  28. package/dist/cjs/array-table/index.js +30 -118
  29. package/dist/cjs/draggableModal/index.d.ts +1 -1
  30. package/dist/cjs/draggableModal/index.js +251 -25
  31. package/dist/cjs/draggableModal/style.less +185 -12
  32. package/dist/esm/ag-grid-plus/_utils/processColumnGroups.d.ts +9 -0
  33. package/dist/esm/ag-grid-plus/_utils/processColumnGroups.js +44 -0
  34. package/dist/esm/ag-grid-plus/ag-gridPlus.js +245 -121
  35. package/dist/esm/ag-grid-plus/schemes/components/SchemeSelector.d.ts +1 -1
  36. package/dist/esm/ag-grid-plus/schemes/components/SchemeSelector.js +1 -1
  37. package/dist/esm/ag-grid-plus/schemes/hooks/useColumnSchemes.js +60 -14
  38. package/dist/esm/ag-grid-plus/schemes/storage/localStorageAdapter.js +13 -27
  39. package/dist/esm/ag-grid-plus/schemes/types.d.ts +8 -5
  40. package/dist/esm/ag-grid-plus/schemes/utils/validator.js +14 -18
  41. package/dist/esm/ag-grid-plus/setting/ColumnConfigForm.d.ts +16 -0
  42. package/dist/esm/ag-grid-plus/setting/ColumnConfigForm.js +338 -0
  43. package/dist/esm/ag-grid-plus/setting/ColumnConfigTable.d.ts +20 -0
  44. package/dist/esm/ag-grid-plus/setting/ColumnConfigTable.js +932 -0
  45. package/dist/esm/ag-grid-plus/setting/ColumnSetting.js +207 -247
  46. package/dist/esm/ag-grid-plus/setting/MoveNodeModal.d.ts +15 -0
  47. package/dist/esm/ag-grid-plus/setting/MoveNodeModal.js +150 -0
  48. package/dist/esm/ag-grid-plus/setting/NameColumnRenderer.d.ts +18 -0
  49. package/dist/esm/ag-grid-plus/setting/NameColumnRenderer.js +87 -0
  50. package/dist/esm/ag-grid-plus/setting/columnGroupTypes.d.ts +59 -0
  51. package/dist/esm/ag-grid-plus/setting/columnGroupTypes.js +1 -0
  52. package/dist/esm/ag-grid-plus/setting/columnGroupUtils.d.ts +75 -0
  53. package/dist/esm/ag-grid-plus/setting/columnGroupUtils.js +265 -0
  54. package/dist/esm/ag-grid-plus/setting/index.d.ts +2 -1
  55. package/dist/esm/ag-grid-plus/setting/index.js +4 -2
  56. package/dist/esm/ag-grid-plus/storage/SchemeSyncManager.d.ts +2 -1
  57. package/dist/esm/ag-grid-plus/storage/SchemeSyncManager.js +11 -8
  58. package/dist/esm/ag-grid-plus/types.d.ts +2 -0
  59. package/dist/esm/array-table/index.js +31 -119
  60. package/dist/esm/draggableModal/index.d.ts +1 -1
  61. package/dist/esm/draggableModal/index.js +252 -27
  62. package/dist/esm/draggableModal/style.less +185 -12
  63. package/dist/umd/qc-ui.min.css +1 -1
  64. package/dist/umd/qc-ui.min.js +1 -1
  65. package/package.json +1 -1
  66. package/dist/cjs/ag-grid-plus/gridManager/index.d.ts +0 -7
  67. package/dist/cjs/ag-grid-plus/gridManager/index.js +0 -40
  68. package/dist/cjs/ag-grid-plus/querySchemes/hooks/useQuerySchemes.refactored.d.ts +0 -7
  69. package/dist/cjs/ag-grid-plus/querySchemes/hooks/useQuerySchemes.refactored.js +0 -32
  70. package/dist/cjs/ag-grid-plus/schemes/hooks/useColumnSchemes.refactored.d.ts +0 -7
  71. package/dist/cjs/ag-grid-plus/schemes/hooks/useColumnSchemes.refactored.js +0 -32
  72. package/dist/cjs/ag-grid-plus/setting/diySetting/index.d.ts +0 -10
  73. package/dist/cjs/ag-grid-plus/setting/diySetting/index.js +0 -268
  74. package/dist/esm/ag-grid-plus/gridManager/index.d.ts +0 -7
  75. package/dist/esm/ag-grid-plus/gridManager/index.js +0 -35
  76. package/dist/esm/ag-grid-plus/querySchemes/hooks/useQuerySchemes.refactored.d.ts +0 -7
  77. package/dist/esm/ag-grid-plus/querySchemes/hooks/useQuerySchemes.refactored.js +0 -27
  78. package/dist/esm/ag-grid-plus/schemes/hooks/useColumnSchemes.refactored.d.ts +0 -7
  79. package/dist/esm/ag-grid-plus/schemes/hooks/useColumnSchemes.refactored.js +0 -27
  80. package/dist/esm/ag-grid-plus/setting/diySetting/index.d.ts +0 -10
  81. package/dist/esm/ag-grid-plus/setting/diySetting/index.js +0 -259
@@ -73,7 +73,7 @@ export var SchemeSyncManager = /*#__PURE__*/function () {
73
73
  schemes = _ref2[1];
74
74
  serializedColumnSchemes[gridId] = schemes.map(function (scheme) {
75
75
  return _objectSpread(_objectSpread({}, scheme), {}, {
76
- columnState: JSON.stringify(scheme.columnState)
76
+ columnState: JSON.stringify(scheme.columnConfig)
77
77
  });
78
78
  });
79
79
  });
@@ -593,15 +593,15 @@ export var SchemeSyncManager = /*#__PURE__*/function () {
593
593
  if (types.has('current')) dirtyCurrentGrids.add(gridId);
594
594
  });
595
595
 
596
- // 添加列方案数据(将 columnState 序列化为 JSON 字符串)
596
+ // 添加列方案数据(将 columnConfig 序列化为 JSON 字符串并映射到 columnState 字段)
597
597
  if (dirtyColumnGrids.size > 0) {
598
598
  requestData.columnSchemes = {};
599
599
  dirtyColumnGrids.forEach(function (gridId) {
600
600
  var schemes = _this4.allData.columnSchemes[gridId] || [];
601
- // 将每个方案的 columnState 从数组转换为 JSON 字符串
601
+ // 将每个方案的 columnConfig 从数组转换为 JSON 字符串,并映射到 columnState 字段
602
602
  requestData.columnSchemes[gridId] = schemes.map(function (scheme) {
603
603
  return _objectSpread(_objectSpread({}, scheme), {}, {
604
- columnState: JSON.stringify(scheme.columnState)
604
+ columnState: JSON.stringify(scheme.columnConfig)
605
605
  });
606
606
  });
607
607
  });
@@ -771,7 +771,8 @@ export var SchemeSyncManager = /*#__PURE__*/function () {
771
771
 
772
772
  /**
773
773
  * 反序列化从后端接收的方案数据
774
- * 将 columnState 和 itemsOrder 从 JSON 字符串转换为数组
774
+ * 将 columnState(后端字段) 映射为 columnConfig 并从 JSON 字符串转换为数组
775
+ * 将 itemsOrder 从 JSON 字符串转换为数组
775
776
  */
776
777
  }, {
777
778
  key: "deserializeSchemesData",
@@ -787,10 +788,12 @@ export var SchemeSyncManager = /*#__PURE__*/function () {
787
788
  gridId = _ref6[0],
788
789
  schemes = _ref6[1];
789
790
  result.columnSchemes[gridId] = schemes.map(function (scheme) {
790
- // 如果 columnState 是字符串,则解析为数组
791
- var columnState = typeof scheme.columnState === 'string' ? JSON.parse(scheme.columnState) : scheme.columnState;
791
+ // 后端返回的数据中,columnState 字段存储的是 columnConfig 的 JSON 字符串
792
+ // 需要将其解析为数组并映射到 columnConfig 字段
793
+ var schemeWithState = scheme; // 类型断言处理后端数据
794
+ var columnConfig = typeof schemeWithState.columnState === 'string' ? JSON.parse(schemeWithState.columnState) : schemeWithState.columnState;
792
795
  return _objectSpread(_objectSpread({}, scheme), {}, {
793
- columnState: columnState
796
+ columnConfig: columnConfig
794
797
  });
795
798
  });
796
799
  });
@@ -146,6 +146,8 @@ export interface ExtendedColDef extends ColDef {
146
146
  formatWithCommas?: boolean;
147
147
  /** 自定义单元格渲染器 (用于跳过计算) */
148
148
  customCellRenderer?: (params: any) => any;
149
+ /** 列分组的子列 (支持列分组功能) */
150
+ children?: ExtendedColDef[];
149
151
  }
150
152
  /**
151
153
  * 扩展的列状态 (包含 AG-Grid 列状态 + 自定义属性)
@@ -11,7 +11,7 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
11
11
  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; }
12
12
  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; } }
13
13
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
14
- import React, { Fragment, useEffect, useRef, useState, useCallback } from "react";
14
+ import React, { Fragment, useEffect, useRef, useState } from "react";
15
15
  import { AgGridReact } from "ag-grid-react";
16
16
  import { useField, observer, RecursionField } from "@formily/react";
17
17
  import { useFieldSchema } from "@formily/react";
@@ -25,47 +25,7 @@ import PreviewArrayTable from "./preview";
25
25
  import { Space } from "antd";
26
26
  import Setting from "../ag-grid-plus/setting";
27
27
  import { useGridPlusColumnState } from "../ag-grid-plus/hooks/useGridPlusColumnState";
28
-
29
- /**
30
- * ArrayTable 内置的列状态管理 Hook
31
- * 使用 localStorage 进行持久化存储
32
- */
33
- var useArrayTableColumnState = function useArrayTableColumnState(gridKey) {
34
- var STORAGE_KEY = 'array-table-column-state';
35
-
36
- // 从 localStorage 读取所有列状态
37
- var getColumnStateFromStorage = useCallback(function () {
38
- try {
39
- var stored = localStorage.getItem(STORAGE_KEY);
40
- return stored ? JSON.parse(stored) : {};
41
- } catch (error) {
42
- console.error('Failed to read column state from localStorage:', error);
43
- return {};
44
- }
45
- }, []);
46
-
47
- // 保存列状态到 localStorage
48
- var saveColumnStateToStorage = useCallback(function (key, state) {
49
- try {
50
- var allStates = getColumnStateFromStorage();
51
- allStates[key] = state;
52
- localStorage.setItem(STORAGE_KEY, JSON.stringify(allStates));
53
- } catch (error) {
54
- console.error('Failed to save column state to localStorage:', error);
55
- }
56
- }, [getColumnStateFromStorage]);
57
-
58
- // 获取指定 gridKey 的列状态
59
- var getColumnState = useCallback(function (key) {
60
- if (!key) return undefined;
61
- var allStates = getColumnStateFromStorage();
62
- return allStates[key];
63
- }, [getColumnStateFromStorage]);
64
- return {
65
- getColumnState: getColumnState,
66
- saveColumnState: saveColumnStateToStorage
67
- };
68
- };
28
+ import { useColumnSchemes } from "../ag-grid-plus/schemes/hooks/useColumnSchemes";
69
29
 
70
30
  //@ts-ignore
71
31
  var ArrayTable = observer(function (props) {
@@ -97,10 +57,14 @@ var ArrayTable = observer(function (props) {
97
57
  // 尝试从 Context 获取列状态管理(如果被 Provider 包裹)
98
58
  var contextColumnState = useGridPlusColumnState();
99
59
 
100
- // 使用内置的列状态管理作为后备方案
101
- var _useArrayTableColumnS = useArrayTableColumnState(props.gridKey),
102
- getColumnState = _useArrayTableColumnS.getColumnState,
103
- saveColumnState = _useArrayTableColumnS.saveColumnState;
60
+ // ArrayTable 内部集成列方案管理(统一使用 AgGridPlus 的方案系统)
61
+ var internalSchemeManager = useColumnSchemes({
62
+ gridId: props.gridKey || 'array-table-default',
63
+ enableAutoSave: false // 手动控制保存时机
64
+ });
65
+
66
+ // 使用 Context 的 schemeManager 或内部的 schemeManager
67
+ var schemeManager = (contextColumnState === null || contextColumnState === void 0 ? void 0 : contextColumnState.schemeManager) || internalSchemeManager;
104
68
 
105
69
  // 使用自定义 hooks
106
70
  var _useCellFocus = useCellFocus(),
@@ -110,45 +74,36 @@ var ArrayTable = observer(function (props) {
110
74
  var _useRowDrag = useRowDrag(field),
111
75
  handleRowDragMove = _useRowDrag.handleRowDragMove;
112
76
 
113
- // 恢复列状态(优先使用 Context,否则使用内置的 localStorage)
77
+ // 恢复列状态(从方案系统)
114
78
  useEffect(function () {
115
- var _contextColumnState$c;
116
- if (!props.gridKey || !gridApiState) {
79
+ if (!props.gridKey || !gridApiState || !schemeManager) {
117
80
  return;
118
81
  }
119
- var stateToApply = null;
120
- var hasRealProvider = (contextColumnState === null || contextColumnState === void 0 ? void 0 : contextColumnState.columnState) !== undefined;
121
82
 
122
- // 优先使用 Context 中的列状态(但只有在有真正的 Provider 时)
123
- if (hasRealProvider && contextColumnState !== null && contextColumnState !== void 0 && (_contextColumnState$c = contextColumnState.columnState) !== null && _contextColumnState$c !== void 0 && _contextColumnState$c[props.gridKey]) {
124
- stateToApply = contextColumnState.columnState[props.gridKey];
125
- }
126
- // 后备方案:使用内置的 localStorage 列状态
127
- else {
128
- stateToApply = getColumnState(props.gridKey);
129
- }
130
- if (stateToApply && Array.isArray(stateToApply)) {
131
- // 转换为 AG-Grid 需要的格式
132
- var formattedState = stateToApply.map(function (col) {
83
+ // 使用方案系统恢复列状态
84
+ // schemeManager 会自动加载默认方案或最后使用的方案
85
+ var currentScheme = schemeManager.currentScheme;
86
+ if (currentScheme && currentScheme.columnConfig) {
87
+ // 从 columnConfig (FlatColumnItem[]) 提取列状态
88
+ var columnState = currentScheme.columnConfig.filter(function (item) {
89
+ return item.type === 'column' && item.field;
90
+ }).map(function (item) {
133
91
  return {
134
- colId: col.colId || col.field,
135
- width: col.width,
136
- hide: col.hide,
137
- pinned: col.pinned === 'notPinned' ? null : col.pinned,
138
- sort: col.sort,
139
- sortIndex: col.sortIndex,
140
- aggFunc: col.aggFunc,
141
- flex: col.flex
92
+ colId: item.field,
93
+ width: item.width,
94
+ hide: item.hide,
95
+ pinned: item.pinned === 'notPinned' ? null : item.pinned,
96
+ flex: item.flex
142
97
  };
143
98
  });
144
99
  setTimeout(function () {
145
100
  gridApiState.applyColumnState({
146
- state: formattedState,
101
+ state: columnState,
147
102
  applyOrder: true
148
103
  });
149
104
  }, 100);
150
105
  }
151
- }, [props.gridKey, gridApiState, contextColumnState === null || contextColumnState === void 0 ? void 0 : contextColumnState.columnState, getColumnState]);
106
+ }, [props.gridKey, gridApiState, schemeManager === null || schemeManager === void 0 ? void 0 : schemeManager.currentScheme]);
152
107
 
153
108
  //@ts-ignore
154
109
  if (columns.length > 0) {
@@ -156,22 +111,9 @@ var ArrayTable = observer(function (props) {
156
111
  columns[0].rowDrag = props.onRowDrag ? true : false;
157
112
  }
158
113
 
159
- // 保存列状态(优先使用 Context,否则使用内置的 localStorage)
160
- var onColumnStateChanged = function onColumnStateChanged(columnState) {
161
- if (!props.gridKey) return;
114
+ // 不再需要 onColumnStateChanged 回调
115
+ // 保存逻辑统一由 ColumnSetting 通过 schemeManager 处理
162
116
 
163
- // 判断是否有真正的 Provider:检查 columnState 是否不是 undefined(默认值)
164
- var hasRealProvider = (contextColumnState === null || contextColumnState === void 0 ? void 0 : contextColumnState.columnState) !== undefined;
165
-
166
- // 优先使用 Context 的保存方法(但只有在有真正的 Provider 时)
167
- if (hasRealProvider && contextColumnState !== null && contextColumnState !== void 0 && contextColumnState.onSaveColumnState) {
168
- contextColumnState.onSaveColumnState(props.gridKey, columnState);
169
- }
170
- // 后备方案:使用内置的 localStorage 保存
171
- else {
172
- saveColumnState(props.gridKey, columnState);
173
- }
174
- };
175
117
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
176
118
  ref: ref,
177
119
  style: {
@@ -219,7 +161,7 @@ var ArrayTable = observer(function (props) {
219
161
  gridApi: apiRef.current,
220
162
  gridApiState: gridApiState,
221
163
  type: 'formArrayTable',
222
- onSaveColumnState: onColumnStateChanged
164
+ schemeManager: schemeManager
223
165
  })), /*#__PURE__*/React.createElement("div", {
224
166
  style: {
225
167
  flex: 1,
@@ -231,37 +173,7 @@ var ArrayTable = observer(function (props) {
231
173
  apiRef.current = params.api;
232
174
  setGridApiState(params.api);
233
175
 
234
- // 立即尝试恢复列状态
235
- if (props.gridKey) {
236
- var _contextColumnState$c2;
237
- var hasRealProvider = (contextColumnState === null || contextColumnState === void 0 ? void 0 : contextColumnState.columnState) !== undefined;
238
- var stateToApply = null;
239
- if (hasRealProvider && contextColumnState !== null && contextColumnState !== void 0 && (_contextColumnState$c2 = contextColumnState.columnState) !== null && _contextColumnState$c2 !== void 0 && _contextColumnState$c2[props.gridKey]) {
240
- stateToApply = contextColumnState.columnState[props.gridKey];
241
- } else {
242
- stateToApply = getColumnState(props.gridKey);
243
- }
244
- if (stateToApply && Array.isArray(stateToApply)) {
245
- var formattedState = stateToApply.map(function (col) {
246
- return {
247
- colId: col.colId || col.field,
248
- width: col.width,
249
- hide: col.hide,
250
- pinned: col.pinned === 'notPinned' ? null : col.pinned,
251
- sort: col.sort,
252
- sortIndex: col.sortIndex,
253
- aggFunc: col.aggFunc,
254
- flex: col.flex
255
- };
256
- });
257
- setTimeout(function () {
258
- params.api.applyColumnState({
259
- state: formattedState,
260
- applyOrder: true
261
- });
262
- }, 50);
263
- }
264
- }
176
+ // 恢复列状态将由 useEffect 处理(使用方案系统)
265
177
  },
266
178
  suppressColumnVirtualisation: true,
267
179
  gridOptions: {
@@ -2,7 +2,7 @@ import { ModalProps } from 'antd/lib/modal';
2
2
  import React from 'react';
3
3
  import "./style.less";
4
4
  /**
5
- * 可拖拽Modal
5
+ * 可拖拽Modal - 支持拖拽、全屏切换和缩放
6
6
  * @param props
7
7
  * @returns
8
8
  */
@@ -1,20 +1,22 @@
1
+ var _excluded = ["wrapClassName", "width"];
1
2
  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); }
3
+ 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; }
4
+ 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; }
2
5
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
3
6
  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."); }
4
7
  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); }
5
8
  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; }
6
9
  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
10
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
8
- import { ShrinkOutlined, ArrowsAltOutlined } from '@ant-design/icons';
11
+ import { ShrinkOutlined, ArrowsAltOutlined, ZoomInOutlined, ZoomOutOutlined } from '@ant-design/icons';
9
12
  import { Modal } from 'antd';
10
13
  import React, { useRef, useState } from 'react';
11
14
  import Draggable from 'react-draggable';
12
15
  import "./style.less";
13
-
14
16
  /**
15
- * 可拖拽Modal
16
- * @param props
17
- * @returns
17
+ * 可拖拽Modal - 支持拖拽、全屏切换和缩放
18
+ * @param props
19
+ * @returns
18
20
  */
19
21
  var DraggableModal = function DraggableModal(props) {
20
22
  var _useState = useState(true),
@@ -35,6 +37,39 @@ var DraggableModal = function DraggableModal(props) {
35
37
  _useState6 = _slicedToArray(_useState5, 2),
36
38
  fullScreen = _useState6[0],
37
39
  setFullScreen = _useState6[1];
40
+ var _useState7 = useState('normal'),
41
+ _useState8 = _slicedToArray(_useState7, 2),
42
+ zoom = _useState8[0],
43
+ setZoom = _useState8[1];
44
+
45
+ // 调整大小相关状态
46
+ var _useState9 = useState(false),
47
+ _useState10 = _slicedToArray(_useState9, 2),
48
+ isResizing = _useState10[0],
49
+ setIsResizing = _useState10[1];
50
+ var _useState11 = useState(''),
51
+ _useState12 = _slicedToArray(_useState11, 2),
52
+ resizeDirection = _useState12[0],
53
+ setResizeDirection = _useState12[1];
54
+ var _useState13 = useState({
55
+ width: 0,
56
+ height: 0
57
+ }),
58
+ _useState14 = _slicedToArray(_useState13, 2),
59
+ modalSize = _useState14[0],
60
+ setModalSize = _useState14[1];
61
+ var _useState15 = useState({
62
+ x: 0,
63
+ y: 0
64
+ }),
65
+ _useState16 = _slicedToArray(_useState15, 2),
66
+ modalPosition = _useState16[0],
67
+ setModalPosition = _useState16[1];
68
+
69
+ // 解构 props,分离出 wrapClassName
70
+ var propsWrapClassName = props.wrapClassName,
71
+ width = props.width,
72
+ restProps = _objectWithoutProperties(props, _excluded);
38
73
  var _onStart = function onStart(_event, uiData) {
39
74
  var _draggleRef$current;
40
75
  var _window$document$docu = window.document.documentElement,
@@ -54,50 +89,240 @@ var DraggableModal = function DraggableModal(props) {
54
89
  var toggleFullScreen = function toggleFullScreen() {
55
90
  setFullScreen(!fullScreen);
56
91
  };
57
- var titleRender = function titleRender() {
58
- var title = props.title;
59
- return /*#__PURE__*/React.createElement(React.Fragment, null, title, /*#__PURE__*/React.createElement("button", {
60
- type: "button",
61
- className: "ant-modal-close",
62
- style: {
63
- right: 42
64
- },
65
- onClick: toggleFullScreen
66
- }, /*#__PURE__*/React.createElement("span", {
67
- className: "ant-modal-close-x"
68
- }, fullScreen ? /*#__PURE__*/React.createElement(ShrinkOutlined, null) : /*#__PURE__*/React.createElement(ArrowsAltOutlined, null))));
92
+ var handleZoomIn = function handleZoomIn() {
93
+ if (zoom === 'small') {
94
+ setZoom('normal');
95
+ } else if (zoom === 'normal') {
96
+ setZoom('large');
97
+ }
98
+ };
99
+ var handleZoomOut = function handleZoomOut() {
100
+ if (zoom === 'large') {
101
+ setZoom('normal');
102
+ } else if (zoom === 'normal') {
103
+ setZoom('small');
104
+ }
69
105
  };
106
+
107
+ // 拖动调整大小的处理函数
108
+ var handleResizeMouseDown = function handleResizeMouseDown(e, direction) {
109
+ var _draggleRef$current2;
110
+ e.preventDefault();
111
+ e.stopPropagation();
112
+ if (fullScreen) return;
113
+
114
+ // 查找.ant-modal,它在draggleRef的父级
115
+ var modal = (_draggleRef$current2 = draggleRef.current) === null || _draggleRef$current2 === void 0 ? void 0 : _draggleRef$current2.closest('.ant-modal');
116
+ if (!modal) {
117
+ return;
118
+ }
119
+ var rect = modal.getBoundingClientRect();
120
+ setModalSize({
121
+ width: rect.width,
122
+ height: rect.height
123
+ });
124
+ setModalPosition({
125
+ x: rect.left,
126
+ y: rect.top
127
+ });
128
+ setResizeDirection(direction);
129
+ setIsResizing(true);
130
+ var startX = e.clientX;
131
+ var startY = e.clientY;
132
+ var startWidth = rect.width;
133
+ var startHeight = rect.height;
134
+ var startLeft = rect.left;
135
+ var startTop = rect.top;
136
+ var handleMouseMove = function handleMouseMove(moveEvent) {
137
+ var deltaX = moveEvent.clientX - startX;
138
+ var deltaY = moveEvent.clientY - startY;
139
+ var newWidth = startWidth;
140
+ var newHeight = startHeight;
141
+ var newLeft = startLeft;
142
+ var newTop = startTop;
143
+
144
+ // 根据方向计算新尺寸
145
+ if (direction.includes('e')) {
146
+ newWidth = Math.max(400, startWidth + deltaX);
147
+ }
148
+ if (direction.includes('w')) {
149
+ newWidth = Math.max(400, startWidth - deltaX);
150
+ newLeft = startLeft + (startWidth - newWidth);
151
+ }
152
+ if (direction.includes('s')) {
153
+ newHeight = Math.max(300, startHeight + deltaY);
154
+ }
155
+ if (direction.includes('n')) {
156
+ newHeight = Math.max(300, startHeight - deltaY);
157
+ newTop = startTop + (startHeight - newHeight);
158
+ }
159
+
160
+ // 限制最大尺寸
161
+ var maxWidth = window.innerWidth * 0.95;
162
+ var maxHeight = window.innerHeight * 0.95;
163
+ newWidth = Math.min(newWidth, maxWidth);
164
+ newHeight = Math.min(newHeight, maxHeight);
165
+
166
+ // 直接更新DOM以实现实时效果
167
+ modal.style.width = "".concat(newWidth, "px");
168
+ modal.style.height = "".concat(newHeight, "px");
169
+
170
+ // 同时更新 modal-content 的高度
171
+ var modalContent = modal.querySelector('.ant-modal-content');
172
+ if (modalContent) {
173
+ modalContent.style.height = "".concat(newHeight, "px");
174
+ modalContent.style.display = 'flex';
175
+ modalContent.style.flexDirection = 'column';
176
+ }
177
+
178
+ // 仍然更新state以保持React状态同步
179
+ setModalSize({
180
+ width: newWidth,
181
+ height: newHeight
182
+ });
183
+ setModalPosition({
184
+ x: newLeft,
185
+ y: newTop
186
+ });
187
+ };
188
+ var handleMouseUp = function handleMouseUp() {
189
+ setIsResizing(false);
190
+ setResizeDirection('');
191
+ document.removeEventListener('mousemove', handleMouseMove);
192
+ document.removeEventListener('mouseup', handleMouseUp);
193
+ };
194
+ document.addEventListener('mousemove', handleMouseMove);
195
+ document.addEventListener('mouseup', handleMouseUp);
196
+ };
197
+
198
+ // 合并类名
199
+ var zoomClass = !fullScreen && zoom !== 'normal' ? "modal-wrap-zoom-".concat(zoom) : '';
200
+ var fullScreenClass = fullScreen ? 'modal-wrap-fullscreen' : '';
201
+ var resizingClass = isResizing ? 'modal-wrap-resizing' : '';
202
+ var mergedWrapClassName = [propsWrapClassName, fullScreenClass, zoomClass, resizingClass].filter(Boolean).join(' ');
70
203
  return /*#__PURE__*/React.createElement(Modal, _extends({
71
204
  maskClosable: false,
72
- wrapClassName: "".concat(fullScreen ? 'modal-wrap-fullscreen' : '')
73
- }, props, {
205
+ width: width
206
+ }, restProps, {
207
+ wrapClassName: mergedWrapClassName,
74
208
  title: /*#__PURE__*/React.createElement("div", {
75
209
  style: {
76
210
  width: '100%',
77
- cursor: 'move'
211
+ cursor: fullScreen ? 'default' : 'move'
78
212
  },
79
213
  onMouseOver: function onMouseOver() {
80
- if (disabled) {
214
+ if (!fullScreen && disabled) {
81
215
  setDisabled(false);
82
216
  }
83
217
  },
84
218
  onMouseOut: function onMouseOut() {
85
- setDisabled(true);
219
+ if (!fullScreen) {
220
+ setDisabled(true);
221
+ }
86
222
  },
87
223
  onFocus: function onFocus() {},
88
224
  onBlur: function onBlur() {}
89
- }, titleRender()),
225
+ }, props.title, !fullScreen && zoom !== 'large' && /*#__PURE__*/React.createElement("button", {
226
+ type: "button",
227
+ className: "ant-modal-close",
228
+ style: {
229
+ right: 106
230
+ },
231
+ onClick: function onClick(e) {
232
+ e.stopPropagation();
233
+ handleZoomIn();
234
+ },
235
+ title: "\u653E\u5927"
236
+ }, /*#__PURE__*/React.createElement("span", {
237
+ className: "ant-modal-close-x"
238
+ }, /*#__PURE__*/React.createElement(ZoomInOutlined, null))), !fullScreen && zoom !== 'small' && /*#__PURE__*/React.createElement("button", {
239
+ type: "button",
240
+ className: "ant-modal-close",
241
+ style: {
242
+ right: 74
243
+ },
244
+ onClick: function onClick(e) {
245
+ e.stopPropagation();
246
+ handleZoomOut();
247
+ },
248
+ title: "\u7F29\u5C0F"
249
+ }, /*#__PURE__*/React.createElement("span", {
250
+ className: "ant-modal-close-x"
251
+ }, /*#__PURE__*/React.createElement(ZoomOutOutlined, null))), /*#__PURE__*/React.createElement("button", {
252
+ type: "button",
253
+ className: "ant-modal-close",
254
+ style: {
255
+ right: 42
256
+ },
257
+ onClick: function onClick(e) {
258
+ e.stopPropagation();
259
+ toggleFullScreen();
260
+ },
261
+ title: fullScreen ? '退出全屏' : '全屏'
262
+ }, /*#__PURE__*/React.createElement("span", {
263
+ className: "ant-modal-close-x"
264
+ }, fullScreen ? /*#__PURE__*/React.createElement(ShrinkOutlined, null) : /*#__PURE__*/React.createElement(ArrowsAltOutlined, null)))),
90
265
  modalRender: function modalRender(modal) {
91
266
  return /*#__PURE__*/React.createElement(Draggable, {
92
- disabled: disabled,
267
+ disabled: disabled || fullScreen,
93
268
  bounds: bounds,
94
269
  nodeRef: draggleRef,
95
270
  onStart: function onStart(event, uiData) {
96
271
  return _onStart(event, uiData);
97
- }
272
+ },
273
+ cancel: ".resize-handle"
98
274
  }, /*#__PURE__*/React.createElement("div", {
99
- ref: draggleRef
100
- }, modal));
275
+ ref: draggleRef,
276
+ style: isResizing && modalSize.width > 0 ? {
277
+ position: 'relative',
278
+ height: '100%',
279
+ '--modal-width': "".concat(modalSize.width, "px"),
280
+ '--modal-height': "".concat(modalSize.height, "px")
281
+ } : {
282
+ position: 'relative',
283
+ height: '100%'
284
+ }
285
+ }, modal, !fullScreen && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
286
+ className: "resize-handle resize-handle-e",
287
+ onMouseDown: function onMouseDown(e) {
288
+ return handleResizeMouseDown(e, 'e');
289
+ }
290
+ }), /*#__PURE__*/React.createElement("div", {
291
+ className: "resize-handle resize-handle-s",
292
+ onMouseDown: function onMouseDown(e) {
293
+ return handleResizeMouseDown(e, 's');
294
+ }
295
+ }), /*#__PURE__*/React.createElement("div", {
296
+ className: "resize-handle resize-handle-w",
297
+ onMouseDown: function onMouseDown(e) {
298
+ return handleResizeMouseDown(e, 'w');
299
+ }
300
+ }), /*#__PURE__*/React.createElement("div", {
301
+ className: "resize-handle resize-handle-n",
302
+ onMouseDown: function onMouseDown(e) {
303
+ return handleResizeMouseDown(e, 'n');
304
+ }
305
+ }), /*#__PURE__*/React.createElement("div", {
306
+ className: "resize-handle resize-handle-se",
307
+ onMouseDown: function onMouseDown(e) {
308
+ return handleResizeMouseDown(e, 'se');
309
+ }
310
+ }), /*#__PURE__*/React.createElement("div", {
311
+ className: "resize-handle resize-handle-sw",
312
+ onMouseDown: function onMouseDown(e) {
313
+ return handleResizeMouseDown(e, 'sw');
314
+ }
315
+ }), /*#__PURE__*/React.createElement("div", {
316
+ className: "resize-handle resize-handle-ne",
317
+ onMouseDown: function onMouseDown(e) {
318
+ return handleResizeMouseDown(e, 'ne');
319
+ }
320
+ }), /*#__PURE__*/React.createElement("div", {
321
+ className: "resize-handle resize-handle-nw",
322
+ onMouseDown: function onMouseDown(e) {
323
+ return handleResizeMouseDown(e, 'nw');
324
+ }
325
+ }))));
101
326
  }
102
327
  }));
103
328
  };