@bit-sun/business-component 2.4.24 → 2.4.25

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 (159) hide show
  1. package/dist/components/Business/BsLayouts/service.d.ts +1 -1
  2. package/dist/components/Business/BsSulaQueryTable/index.d.ts +0 -1
  3. package/dist/components/Business/BsSulaQueryTable/setting.d.ts +1 -1
  4. package/dist/components/Business/BsSulaQueryTable/utils.d.ts +0 -1
  5. package/dist/components/Business/columnSettingTable/columnSetting.d.ts +0 -1
  6. package/dist/components/Functional/ExportFunctions/ExportIcon/index.d.ts +1 -1
  7. package/dist/components/Functional/QueryMutipleInput/index.d.ts +1 -2
  8. package/dist/components/Solution/RuleComponent/services.d.ts +1 -1
  9. package/dist/index.esm.js +1181 -1737
  10. package/dist/index.js +1175 -1733
  11. package/dist/utils/TableUtils.d.ts +2 -93
  12. package/dist/utils/index.d.ts +4 -6
  13. package/dist/utils/utils.d.ts +0 -13
  14. package/package.json +4 -7
  15. package/src/assets/32.svg +27 -27
  16. package/src/assets/addIcon.svg +17 -17
  17. package/src/assets/allfunc.svg +27 -27
  18. package/src/assets/arrowRight.svg +24 -24
  19. package/src/assets/btn-delete.svg +29 -29
  20. package/src/assets/btn-edit.svg +19 -19
  21. package/src/assets/btn-more.svg +17 -17
  22. package/src/assets/btn-submit.svg +19 -19
  23. package/src/assets/close.svg +26 -26
  24. package/src/assets/drag.svg +17 -17
  25. package/src/assets/fixed-left.svg +15 -15
  26. package/src/assets/fixed-right.svg +15 -15
  27. package/src/assets/guanbi.svg +15 -15
  28. package/src/assets/icon-quanping.svg +15 -15
  29. package/src/assets/icon-shezhi.svg +17 -17
  30. package/src/assets/label_icon_bottom.svg +25 -25
  31. package/src/assets/list-no-img.svg +21 -21
  32. package/src/assets/morentouxiang-32.svg +23 -23
  33. package/src/assets/scanning.svg +24 -24
  34. package/src/assets/upExport.svg +22 -22
  35. package/src/common/ENUM.ts +41 -41
  36. package/src/components/Business/AddSelectBusiness/index.tsx +22 -40
  37. package/src/components/Business/BsLayouts/Components/AllFunc/index.less +153 -153
  38. package/src/components/Business/BsLayouts/Components/AllFunc/index.tsx +70 -70
  39. package/src/components/Business/BsLayouts/Components/CustomerMenu/MenuSetting/index.less +90 -90
  40. package/src/components/Business/BsLayouts/Components/CustomerMenu/MenuSetting/index.tsx +37 -37
  41. package/src/components/Business/BsLayouts/Components/CustomerMenu/MenuSetting/leftTree.tsx +242 -242
  42. package/src/components/Business/BsLayouts/Components/CustomerMenu/MenuSetting/rightTree.tsx +384 -384
  43. package/src/components/Business/BsLayouts/Components/CustomerMenu/globalMenu/customMenuHeader.tsx +74 -74
  44. package/src/components/Business/BsLayouts/Components/CustomerMenu/index.less +64 -64
  45. package/src/components/Business/BsLayouts/Components/CustomerMenu/index.tsx +153 -153
  46. package/src/components/Business/BsLayouts/Components/GlobalHeader/index.tsx +157 -163
  47. package/src/components/Business/BsLayouts/Components/RightContent/LoginModal.tsx +85 -85
  48. package/src/components/Business/BsLayouts/Components/RightContent/index.tsx +2 -19
  49. package/src/components/Business/BsLayouts/Components/SearchFunc/index.tsx +75 -75
  50. package/src/components/Business/BsLayouts/index.less +79 -79
  51. package/src/components/Business/BsLayouts/index.tsx +1484 -1494
  52. package/src/components/Business/BsLayouts/service.ts +2 -2
  53. package/src/components/Business/BsLayouts/utils.tsx +203 -203
  54. package/src/components/Business/BsSulaQueryTable/SearchItemSetting.tsx +9 -9
  55. package/src/components/Business/BsSulaQueryTable/index.less +221 -221
  56. package/src/components/Business/BsSulaQueryTable/index.tsx +175 -346
  57. package/src/components/Business/BsSulaQueryTable/setting.tsx +87 -125
  58. package/src/components/Business/BsSulaQueryTable/utils.tsx +34 -57
  59. package/src/components/Business/CommodityEntry/index.md +70 -70
  60. package/src/components/Business/CommodityEntry/index.tsx +80 -80
  61. package/src/components/Business/CommonGuideWrapper/index.less +112 -121
  62. package/src/components/Business/CommonGuideWrapper/index.md +39 -39
  63. package/src/components/Business/CommonGuideWrapper/index.tsx +84 -94
  64. package/src/components/Business/DetailPageWrapper/index.less +1 -9
  65. package/src/components/Business/DetailPageWrapper/index.tsx +110 -121
  66. package/src/components/Business/HomePageWrapper/index.md +45 -45
  67. package/src/components/Business/HomePageWrapper/index.tsx +162 -162
  68. package/src/components/Business/JsonQueryTable/configButton/index.js +20 -20
  69. package/src/components/Business/JsonQueryTable/configTree/component/compactArrayView.js +25 -25
  70. package/src/components/Business/JsonQueryTable/configTree/component/compactObjectView.js +30 -30
  71. package/src/components/Business/JsonQueryTable/configTree/index.js +82 -82
  72. package/src/components/Business/JsonQueryTable/configTree/index.less +44 -44
  73. package/src/components/Business/JsonQueryTable/configTree/parser/highlight.js +57 -57
  74. package/src/components/Business/JsonQueryTable/configTree/parser/index.js +124 -124
  75. package/src/components/Business/JsonQueryTable/configTree/render/iconRender.js +29 -29
  76. package/src/components/Business/JsonQueryTable/configTree/render/nameRender.js +22 -22
  77. package/src/components/Business/JsonQueryTable/configTree/treeNode.js +116 -116
  78. package/src/components/Business/JsonQueryTable/drawer/index.tsx +12 -12
  79. package/src/components/Business/JsonQueryTable/index.less +16 -16
  80. package/src/components/Business/JsonQueryTable/index.md +328 -328
  81. package/src/components/Business/JsonQueryTable/index.tsx +537 -535
  82. package/src/components/Business/JsonQueryTable/jsonEditor/index.js +346 -346
  83. package/src/components/Business/JsonQueryTable/jsonEditor/index.less +22 -22
  84. package/src/components/Business/JsonQueryTable/jsonEditor/lint/basicType.js +147 -147
  85. package/src/components/Business/JsonQueryTable/jsonEditor/lint/index.js +389 -389
  86. package/src/components/Business/JsonQueryTable/jsonEditor/suggestions/actions.js +118 -118
  87. package/src/components/Business/JsonQueryTable/jsonEditor/suggestions/dependency.js +22 -22
  88. package/src/components/Business/JsonQueryTable/jsonEditor/suggestions/index.js +21 -21
  89. package/src/components/Business/JsonQueryTable/jsonEditor/suggestions/request.js +65 -65
  90. package/src/components/Business/SearchSelect/utils.ts +3 -3
  91. package/src/components/Business/StateFlow/index.md +60 -60
  92. package/src/components/Business/StateFlow/index.tsx +29 -29
  93. package/src/components/Business/columnSettingTable/columnSetting.tsx +8 -10
  94. package/src/components/Business/columnSettingTable/index.less +247 -247
  95. package/src/components/Business/columnSettingTable/index.md +357 -357
  96. package/src/components/Business/columnSettingTable/utils.tsx +71 -71
  97. package/src/components/Business/moreTreeTable/FixedScrollBar.tsx +87 -87
  98. package/src/components/Business/moreTreeTable/hooks/useSticky.ts +21 -21
  99. package/src/components/Business/moreTreeTable/index.less +99 -99
  100. package/src/components/Business/moreTreeTable/index.tsx +387 -387
  101. package/src/components/Business/moreTreeTable/utils.ts +126 -126
  102. package/src/components/Functional/AddSelect/helps.ts +3 -4
  103. package/src/components/Functional/AddSelect/index.less +367 -367
  104. package/src/components/Functional/AddSelect/index.tsx +33 -79
  105. package/src/components/Functional/BillEntry/index.less +371 -371
  106. package/src/components/Functional/BillEntry/index.tsx +3 -3
  107. package/src/components/Functional/BsAntdSula/index.ts +2 -2
  108. package/src/components/Functional/DataImport/index.less +63 -63
  109. package/src/components/Functional/DataImport/index.tsx +3 -3
  110. package/src/components/Functional/DataValidation/index.less +63 -63
  111. package/src/components/Functional/DataValidation/index.tsx +3 -3
  112. package/src/components/Functional/EllipsisTooltip/index.d.ts +5 -5
  113. package/src/components/Functional/EllipsisTooltip/index.js +36 -36
  114. package/src/components/Functional/ExportFunctions/ExportIcon/index.tsx +5 -10
  115. package/src/components/Functional/QueryMutipleInput/index.less +37 -37
  116. package/src/components/Functional/QueryMutipleInput/index.tsx +1 -2
  117. package/src/components/Functional/SearchSelect/index.less +0 -6
  118. package/src/components/Functional/SearchSelect/index.tsx +45 -152
  119. package/src/components/Functional/SearchSelect/utils.ts +3 -3
  120. package/src/components/Functional/TreeSearchSelect/index.tsx +22 -24
  121. package/src/components/Solution/RuleComponent/Formula.tsx +335 -335
  122. package/src/components/Solution/RuleComponent/index.d.ts +29 -29
  123. package/src/components/Solution/RuleComponent/index.js +652 -7
  124. package/src/components/Solution/RuleComponent/index.less +230 -230
  125. package/src/components/Solution/RuleComponent/renderSpecificAction.js +99 -99
  126. package/src/components/Solution/RuleComponent/services.ts +13 -13
  127. package/src/plugin/TableColumnSetting/index.less +247 -247
  128. package/src/plugin/TableColumnSetting/index.md +50 -50
  129. package/src/plugin/TableColumnSetting/index.tsx +2 -2
  130. package/src/plugin/TableColumnSetting/utils.ts +19 -19
  131. package/src/utils/CheckOneUser/index.md +39 -39
  132. package/src/utils/CheckOneUser/index.ts +51 -51
  133. package/src/utils/LocalstorageUtils.ts +95 -95
  134. package/src/utils/TableUtils.tsx +18 -691
  135. package/src/utils/checkUtils.ts +39 -39
  136. package/src/utils/enumConfig.ts +11 -11
  137. package/src/utils/getFormMode.js +12 -12
  138. package/src/utils/index.ts +4 -6
  139. package/src/utils/requestUtils.ts +2 -29
  140. package/src/utils/serialize.js +7 -7
  141. package/src/utils/utils.ts +21 -64
  142. package/dist/components/Business/BsLayouts/Components/ChooseStore/index.d.ts +0 -3
  143. package/dist/components/Business/BsLayouts/Components/ChooseStore/services.d.ts +0 -1
  144. package/dist/components/Business/BsLayouts/Components/RightContent/i18n.d.ts +0 -9
  145. package/dist/components/Solution/RuleComponent/RenderCompItem.d.ts +0 -2
  146. package/dist/utils/businessUtils.d.ts +0 -27
  147. package/dist/utils/constant.d.ts +0 -37
  148. package/dist/utils/request.d.ts +0 -2
  149. package/src/assets/arrow_top.svg +0 -18
  150. package/src/components/Business/BsLayouts/Components/ChooseStore/index.less +0 -0
  151. package/src/components/Business/BsLayouts/Components/ChooseStore/index.tsx +0 -193
  152. package/src/components/Business/BsLayouts/Components/ChooseStore/services.ts +0 -10
  153. package/src/components/Business/BsLayouts/Components/RightContent/i18n.ts +0 -9
  154. package/src/components/Business/BsSulaQueryTable/bssulaquerytable.less +0 -5
  155. package/src/components/Solution/RuleComponent/RenderCompItem.tsx +0 -637
  156. package/src/utils/TableUtils.less +0 -52
  157. package/src/utils/businessUtils.ts +0 -441
  158. package/src/utils/constant.ts +0 -39
  159. package/src/utils/request.ts +0 -53
@@ -1,346 +1,346 @@
1
- import React, { useEffect } from 'react';
2
- import {
3
- Typography,
4
- Button,
5
- message,
6
- Popconfirm,
7
- Tooltip,
8
- Row,
9
- Col,
10
- Space,
11
- } from 'antd';
12
- import Editor, { monaco } from '@monaco-editor/react';
13
- import serialize, { deserialize } from '@/utils/serialize';
14
- import {
15
- BulbOutlined,
16
- PlayCircleOutlined,
17
- DeleteOutlined,
18
- CopyOutlined,
19
- SaveOutlined,
20
- FullscreenOutlined,
21
- FullscreenExitOutlined,
22
- } from '@ant-design/icons';
23
- import validateSulaConfig from './lint';
24
- import * as acorn from 'acorn';
25
- import * as walk from 'acorn-walk';
26
- import ConfigTree, { iconRender, nameRender } from '../configTree';
27
- import registerSuggestions from './suggestions';
28
- import style from './index.less';
29
-
30
- const { Title } = Typography;
31
- const STRTEMP = 'const config = ';
32
-
33
- const getEditorValue = data => {
34
- return `${STRTEMP}${serialize(data, { space: 2, unsafe: true })}`;
35
- };
36
-
37
- let isRegister;
38
- let decorations = [];
39
-
40
- export default props => {
41
- const monacoRef = React.useRef(null);
42
- const {
43
- onRun,
44
- value,
45
- type,
46
- onFullScreen = () => {},
47
- shallowHeight = 0,
48
- } = props;
49
-
50
- const editorRef = React.useRef(null);
51
- const [highLightLine, setHighLightLine] = React.useState();
52
- const [isFull, setFull] = React.useState(false);
53
-
54
- const isTableAllValue = !!value?.columns;
55
-
56
- const finalValue = getEditorValue(isTableAllValue ? {columns: value?.columns, fields: value?.fields} : value);
57
- const [treeData, setTreeData] = React.useState(finalValue);
58
-
59
- const handleCopy = () => {
60
- const value1 = editorRef.current.getValue().slice(STRTEMP.length);
61
-
62
- try {
63
- const res = deserialize(value1);
64
- onRun(isTableAllValue ? {...value, columns: res.columns, fields: res.fields}: res, true);
65
- formatDocument();
66
- setFull(false);
67
- } catch (e) {
68
- message.error(`JSON 格式错误`);
69
- }
70
- };
71
-
72
- const formatDocument = () => {
73
- setTimeout(() => {
74
- editorRef.current &&
75
- editorRef.current.getAction('editor.action.formatDocument').run();
76
- }, 300);
77
- };
78
-
79
- monaco.init().then(ref => {
80
- monacoRef.current = ref;
81
- if (!isRegister) {
82
- registerSuggestions(ref);
83
- isRegister = true;
84
- }
85
- });
86
-
87
- const onEditorDidMount = (_monaco, editor) => {
88
- editorRef.current = editor;
89
- const model = editor.getModel();
90
-
91
- formatDocument();
92
-
93
- editor.onKeyDown(e => {
94
- if (e.shiftKey) {
95
- editorRef.current &&
96
- editorRef.current.trigger(
97
- 'auto completion',
98
- 'editor.action.triggerSuggest',
99
- );
100
- }
101
- });
102
-
103
- editor.onDidChangeCursorPosition(e => {
104
- const lineCount = editor.getModel().getLineCount();
105
- if (e.position.lineNumber === 1) {
106
- editor.setPosition({
107
- lineNumber: 2,
108
- column: 1,
109
- });
110
- } else if (e.position.lineNumber === lineCount) {
111
- editor.setPosition({
112
- lineNumber: lineCount - 1,
113
- column: 1,
114
- });
115
- }
116
- });
117
-
118
- editor.onMouseDown(event => {
119
- clearDecorations();
120
- onEditorLineChange(event.target.position);
121
- });
122
-
123
- editor.onKeyDown(event => {
124
- setTimeout(() => {
125
- const position = editor.getPosition();
126
- onEditorLineChange(position);
127
- setTreeData(editor.getValue());
128
- });
129
- });
130
-
131
- editor.onDidChangeModelContent(() => {
132
- const content = editor.getValue();
133
- const markers = monacoRef.current.editor.getModelMarkers();
134
-
135
- if (markers.length > 0) {
136
- markers.forEach(marker => {
137
- monacoRef.current.editor.setModelMarkers(
138
- editor.getModel(),
139
- marker.owner,
140
- [],
141
- );
142
- });
143
- }
144
- const ast = acorn.parse(content, { locations: true });
145
- walk.full(ast, node => {
146
- // if (node?.loc?.start?.column < 5) {
147
- validateSulaConfig(node, monacoRef.current, editor);
148
- // }
149
- });
150
- });
151
- };
152
-
153
- function onEditorLineChange(position) {
154
- const { lineNumber } = position || {};
155
- setHighLightLine(lineNumber);
156
- }
157
-
158
- // console.log(`点击字段: ${clickType}, 点击字段所属字段: ${type}, 提示: ${suggestionType}`);
159
-
160
- const onClickRun = () => {
161
- const value1 = editorRef.current.getValue().slice(STRTEMP.length);
162
-
163
- try {
164
- const res = deserialize(value1);
165
- onRun(isTableAllValue ? {...value, columns: res.columns, fields: res.fields}: res);
166
- formatDocument();
167
- setFull(false);
168
- message.success(`Run Success 🎉`);
169
- } catch (e) {
170
- message.error(`JSON 格式错误`);
171
- }
172
- };
173
-
174
- const onClickDelete = () => {
175
- editorRef.current.setValue(`${STRTEMP}{\n\n}`);
176
- };
177
-
178
- function clearDecorations() {
179
- if (decorations.length) {
180
- decorations = editorRef.current.deltaDecorations(decorations, []);
181
- }
182
- }
183
-
184
- function setDecorations(range) {
185
- const [startLineNumber, startColumn, endLineNumber, endColumn] = range;
186
- const newDecorations = editorRef.current.deltaDecorations(
187
- [],
188
- [
189
- {
190
- range: {
191
- endColumn,
192
- endLineNumber,
193
- startColumn,
194
- startLineNumber,
195
- },
196
- options: {
197
- className: 'si-editor-highlight',
198
- },
199
- },
200
- ],
201
- );
202
- decorations = decorations.concat(newDecorations);
203
- }
204
-
205
- const handleSelect = (node, hasChildren) => {
206
- const { loc, name } = node;
207
- clearDecorations();
208
- // 高亮
209
- if (hasChildren) {
210
- const [line, startColumn] = loc;
211
- const keyPosition = [line, startColumn, line, 100];
212
- setDecorations(keyPosition);
213
- } else {
214
- setDecorations(loc);
215
- }
216
- editorRef.current.revealLine(loc[0]); // 行跳转
217
- };
218
-
219
- const handleFullScreen = () => {
220
- setFull(true);
221
- };
222
-
223
- const handleExitFullScreen = () => {
224
- setFull(false);
225
- };
226
-
227
- useEffect(() => {
228
- editorRef?.current?.layout();
229
- onFullScreen && onFullScreen(isFull);
230
- }, [isFull]);
231
-
232
- useEffect(() => {
233
- editorRef?.current?.layout();
234
- }, [shallowHeight]);
235
-
236
- const hasConfigTree = type !== 'editor';
237
-
238
- return (
239
- <div className={isFull ? style.editorWrapper : ''}>
240
- <div style={{ overflow: 'hidden' }}>
241
- <Title style={{ float: 'left' }} level={4}>
242
- 代码展示
243
- </Title>
244
- <Tooltip title="按 shift 键快速呼出提示">
245
- <BulbOutlined
246
- style={{ marginLeft: 8, lineHeight: '32px', cursor: 'pointer' }}
247
- />
248
- </Tooltip>
249
- <Space style={{ float: 'right' }}>
250
- <Tooltip title="运行代码">
251
- <Button
252
- shape="circle"
253
- size="small"
254
- type="primary"
255
- icon={<PlayCircleOutlined />}
256
- onClick={onClickRun}
257
- shape="circle"
258
- />
259
- </Tooltip>
260
- {/* <Popconfirm title="确定要清空吗?" onConfirm={onClickDelete}>
261
- <Tooltip title="清空代码">
262
- <Button
263
- type="primary"
264
- icon={<DeleteOutlined />}
265
- size="small"
266
- shape="circle"
267
- />
268
- </Tooltip>
269
- </Popconfirm> */}
270
- <Tooltip title="保存">
271
- <Button
272
- type="primary"
273
- icon={<SaveOutlined />}
274
- onClick={handleCopy}
275
- style={{
276
- border: 'none',
277
- }}
278
- shape="circle"
279
- size="small"
280
- />
281
- </Tooltip>
282
- <div>
283
- <Tooltip title="退出全屏">
284
- <Button
285
- type="primary"
286
- icon={<FullscreenExitOutlined />}
287
- onClick={handleExitFullScreen}
288
- style={{
289
- border: 'none',
290
- display: !isFull ? 'none' : '',
291
- }}
292
- shape="circle"
293
- size="small"
294
- />
295
- </Tooltip>
296
- {/* <Tooltip title="全屏编辑">
297
- <Button
298
- type="primary"
299
- icon={<FullscreenOutlined />}
300
- onClick={handleFullScreen}
301
- style={{
302
- border: 'none',
303
- display: isFull ? 'none' : '',
304
- }}
305
- shape="circle"
306
- size="small"
307
- />
308
- </Tooltip> */}
309
- </div>
310
- </Space>
311
- </div>
312
- <Row>
313
- <Col span={hasConfigTree ? 16 : 24}>
314
- <Editor
315
- height={`calc(100vh - ${shallowHeight + 100}px)`}
316
- language="javascript"
317
- editorDidMount={onEditorDidMount}
318
- options={{
319
- selectOnLineNumbers: true,
320
- renderSideBySide: false,
321
- }}
322
- value={finalValue}
323
- // value={{columns: finalValue.columns, fields: finalValue.fields}}
324
- />
325
- </Col>
326
- {hasConfigTree && (
327
- <Col span={8}>
328
- <div className={style.title}>属性节点树</div>
329
- <ConfigTree
330
- style={{
331
- height: 'calc(100vh - 300px)',
332
- overflowY: 'scroll',
333
- }}
334
- level={1}
335
- data={treeData}
336
- onSelect={handleSelect}
337
- currentLine={highLightLine}
338
- iconRender={iconRender}
339
- nameRender={nameRender}
340
- />
341
- </Col>
342
- )}
343
- </Row>
344
- </div>
345
- );
346
- };
1
+ import React, { useEffect } from 'react';
2
+ import {
3
+ Typography,
4
+ Button,
5
+ message,
6
+ Popconfirm,
7
+ Tooltip,
8
+ Row,
9
+ Col,
10
+ Space,
11
+ } from 'antd';
12
+ import Editor, { monaco } from '@monaco-editor/react';
13
+ import serialize, { deserialize } from '@/utils/serialize';
14
+ import {
15
+ BulbOutlined,
16
+ PlayCircleOutlined,
17
+ DeleteOutlined,
18
+ CopyOutlined,
19
+ SaveOutlined,
20
+ FullscreenOutlined,
21
+ FullscreenExitOutlined,
22
+ } from '@ant-design/icons';
23
+ import validateSulaConfig from './lint';
24
+ import * as acorn from 'acorn';
25
+ import * as walk from 'acorn-walk';
26
+ import ConfigTree, { iconRender, nameRender } from '../configTree';
27
+ import registerSuggestions from './suggestions';
28
+ import style from './index.less';
29
+
30
+ const { Title } = Typography;
31
+ const STRTEMP = 'const config = ';
32
+
33
+ const getEditorValue = data => {
34
+ return `${STRTEMP}${serialize(data, { space: 2, unsafe: true })}`;
35
+ };
36
+
37
+ let isRegister;
38
+ let decorations = [];
39
+
40
+ export default props => {
41
+ const monacoRef = React.useRef(null);
42
+ const {
43
+ onRun,
44
+ value,
45
+ type,
46
+ onFullScreen = () => {},
47
+ shallowHeight = 0,
48
+ } = props;
49
+
50
+ const editorRef = React.useRef(null);
51
+ const [highLightLine, setHighLightLine] = React.useState();
52
+ const [isFull, setFull] = React.useState(false);
53
+
54
+ const isTableAllValue = !!value?.columns;
55
+
56
+ const finalValue = getEditorValue(isTableAllValue ? {columns: value?.columns, fields: value?.fields} : value);
57
+ const [treeData, setTreeData] = React.useState(finalValue);
58
+
59
+ const handleCopy = () => {
60
+ const value1 = editorRef.current.getValue().slice(STRTEMP.length);
61
+
62
+ try {
63
+ const res = deserialize(value1);
64
+ onRun(isTableAllValue ? {...value, columns: res.columns, fields: res.fields}: res, true);
65
+ formatDocument();
66
+ setFull(false);
67
+ } catch (e) {
68
+ message.error(`JSON 格式错误`);
69
+ }
70
+ };
71
+
72
+ const formatDocument = () => {
73
+ setTimeout(() => {
74
+ editorRef.current &&
75
+ editorRef.current.getAction('editor.action.formatDocument').run();
76
+ }, 300);
77
+ };
78
+
79
+ monaco.init().then(ref => {
80
+ monacoRef.current = ref;
81
+ if (!isRegister) {
82
+ registerSuggestions(ref);
83
+ isRegister = true;
84
+ }
85
+ });
86
+
87
+ const onEditorDidMount = (_monaco, editor) => {
88
+ editorRef.current = editor;
89
+ const model = editor.getModel();
90
+
91
+ formatDocument();
92
+
93
+ editor.onKeyDown(e => {
94
+ if (e.shiftKey) {
95
+ editorRef.current &&
96
+ editorRef.current.trigger(
97
+ 'auto completion',
98
+ 'editor.action.triggerSuggest',
99
+ );
100
+ }
101
+ });
102
+
103
+ editor.onDidChangeCursorPosition(e => {
104
+ const lineCount = editor.getModel().getLineCount();
105
+ if (e.position.lineNumber === 1) {
106
+ editor.setPosition({
107
+ lineNumber: 2,
108
+ column: 1,
109
+ });
110
+ } else if (e.position.lineNumber === lineCount) {
111
+ editor.setPosition({
112
+ lineNumber: lineCount - 1,
113
+ column: 1,
114
+ });
115
+ }
116
+ });
117
+
118
+ editor.onMouseDown(event => {
119
+ clearDecorations();
120
+ onEditorLineChange(event.target.position);
121
+ });
122
+
123
+ editor.onKeyDown(event => {
124
+ setTimeout(() => {
125
+ const position = editor.getPosition();
126
+ onEditorLineChange(position);
127
+ setTreeData(editor.getValue());
128
+ });
129
+ });
130
+
131
+ editor.onDidChangeModelContent(() => {
132
+ const content = editor.getValue();
133
+ const markers = monacoRef.current.editor.getModelMarkers();
134
+
135
+ if (markers.length > 0) {
136
+ markers.forEach(marker => {
137
+ monacoRef.current.editor.setModelMarkers(
138
+ editor.getModel(),
139
+ marker.owner,
140
+ [],
141
+ );
142
+ });
143
+ }
144
+ const ast = acorn.parse(content, { locations: true });
145
+ walk.full(ast, node => {
146
+ // if (node?.loc?.start?.column < 5) {
147
+ validateSulaConfig(node, monacoRef.current, editor);
148
+ // }
149
+ });
150
+ });
151
+ };
152
+
153
+ function onEditorLineChange(position) {
154
+ const { lineNumber } = position || {};
155
+ setHighLightLine(lineNumber);
156
+ }
157
+
158
+ // console.log(`点击字段: ${clickType}, 点击字段所属字段: ${type}, 提示: ${suggestionType}`);
159
+
160
+ const onClickRun = () => {
161
+ const value1 = editorRef.current.getValue().slice(STRTEMP.length);
162
+
163
+ try {
164
+ const res = deserialize(value1);
165
+ onRun(isTableAllValue ? {...value, columns: res.columns, fields: res.fields}: res);
166
+ formatDocument();
167
+ setFull(false);
168
+ message.success(`Run Success 🎉`);
169
+ } catch (e) {
170
+ message.error(`JSON 格式错误`);
171
+ }
172
+ };
173
+
174
+ const onClickDelete = () => {
175
+ editorRef.current.setValue(`${STRTEMP}{\n\n}`);
176
+ };
177
+
178
+ function clearDecorations() {
179
+ if (decorations.length) {
180
+ decorations = editorRef.current.deltaDecorations(decorations, []);
181
+ }
182
+ }
183
+
184
+ function setDecorations(range) {
185
+ const [startLineNumber, startColumn, endLineNumber, endColumn] = range;
186
+ const newDecorations = editorRef.current.deltaDecorations(
187
+ [],
188
+ [
189
+ {
190
+ range: {
191
+ endColumn,
192
+ endLineNumber,
193
+ startColumn,
194
+ startLineNumber,
195
+ },
196
+ options: {
197
+ className: 'si-editor-highlight',
198
+ },
199
+ },
200
+ ],
201
+ );
202
+ decorations = decorations.concat(newDecorations);
203
+ }
204
+
205
+ const handleSelect = (node, hasChildren) => {
206
+ const { loc, name } = node;
207
+ clearDecorations();
208
+ // 高亮
209
+ if (hasChildren) {
210
+ const [line, startColumn] = loc;
211
+ const keyPosition = [line, startColumn, line, 100];
212
+ setDecorations(keyPosition);
213
+ } else {
214
+ setDecorations(loc);
215
+ }
216
+ editorRef.current.revealLine(loc[0]); // 行跳转
217
+ };
218
+
219
+ const handleFullScreen = () => {
220
+ setFull(true);
221
+ };
222
+
223
+ const handleExitFullScreen = () => {
224
+ setFull(false);
225
+ };
226
+
227
+ useEffect(() => {
228
+ editorRef?.current?.layout();
229
+ onFullScreen && onFullScreen(isFull);
230
+ }, [isFull]);
231
+
232
+ useEffect(() => {
233
+ editorRef?.current?.layout();
234
+ }, [shallowHeight]);
235
+
236
+ const hasConfigTree = type !== 'editor';
237
+
238
+ return (
239
+ <div className={isFull ? style.editorWrapper : ''}>
240
+ <div style={{ overflow: 'hidden' }}>
241
+ <Title style={{ float: 'left' }} level={4}>
242
+ 代码展示
243
+ </Title>
244
+ <Tooltip title="按 shift 键快速呼出提示">
245
+ <BulbOutlined
246
+ style={{ marginLeft: 8, lineHeight: '32px', cursor: 'pointer' }}
247
+ />
248
+ </Tooltip>
249
+ <Space style={{ float: 'right' }}>
250
+ <Tooltip title="运行代码">
251
+ <Button
252
+ shape="circle"
253
+ size="small"
254
+ type="primary"
255
+ icon={<PlayCircleOutlined />}
256
+ onClick={onClickRun}
257
+ shape="circle"
258
+ />
259
+ </Tooltip>
260
+ {/* <Popconfirm title="确定要清空吗?" onConfirm={onClickDelete}>
261
+ <Tooltip title="清空代码">
262
+ <Button
263
+ type="primary"
264
+ icon={<DeleteOutlined />}
265
+ size="small"
266
+ shape="circle"
267
+ />
268
+ </Tooltip>
269
+ </Popconfirm> */}
270
+ <Tooltip title="保存">
271
+ <Button
272
+ type="primary"
273
+ icon={<SaveOutlined />}
274
+ onClick={handleCopy}
275
+ style={{
276
+ border: 'none',
277
+ }}
278
+ shape="circle"
279
+ size="small"
280
+ />
281
+ </Tooltip>
282
+ <div>
283
+ <Tooltip title="退出全屏">
284
+ <Button
285
+ type="primary"
286
+ icon={<FullscreenExitOutlined />}
287
+ onClick={handleExitFullScreen}
288
+ style={{
289
+ border: 'none',
290
+ display: !isFull ? 'none' : '',
291
+ }}
292
+ shape="circle"
293
+ size="small"
294
+ />
295
+ </Tooltip>
296
+ {/* <Tooltip title="全屏编辑">
297
+ <Button
298
+ type="primary"
299
+ icon={<FullscreenOutlined />}
300
+ onClick={handleFullScreen}
301
+ style={{
302
+ border: 'none',
303
+ display: isFull ? 'none' : '',
304
+ }}
305
+ shape="circle"
306
+ size="small"
307
+ />
308
+ </Tooltip> */}
309
+ </div>
310
+ </Space>
311
+ </div>
312
+ <Row>
313
+ <Col span={hasConfigTree ? 16 : 24}>
314
+ <Editor
315
+ height={`calc(100vh - ${shallowHeight + 100}px)`}
316
+ language="javascript"
317
+ editorDidMount={onEditorDidMount}
318
+ options={{
319
+ selectOnLineNumbers: true,
320
+ renderSideBySide: false,
321
+ }}
322
+ value={finalValue}
323
+ // value={{columns: finalValue.columns, fields: finalValue.fields}}
324
+ />
325
+ </Col>
326
+ {hasConfigTree && (
327
+ <Col span={8}>
328
+ <div className={style.title}>属性节点树</div>
329
+ <ConfigTree
330
+ style={{
331
+ height: 'calc(100vh - 300px)',
332
+ overflowY: 'scroll',
333
+ }}
334
+ level={1}
335
+ data={treeData}
336
+ onSelect={handleSelect}
337
+ currentLine={highLightLine}
338
+ iconRender={iconRender}
339
+ nameRender={nameRender}
340
+ />
341
+ </Col>
342
+ )}
343
+ </Row>
344
+ </div>
345
+ );
346
+ };