@bit-sun/business-component 2.4.22 → 2.4.24

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/Components/ChooseStore/index.d.ts +3 -0
  2. package/dist/components/Business/BsLayouts/Components/ChooseStore/services.d.ts +1 -0
  3. package/dist/components/Business/BsLayouts/Components/RightContent/i18n.d.ts +9 -0
  4. package/dist/components/Business/BsLayouts/service.d.ts +1 -1
  5. package/dist/components/Business/BsSulaQueryTable/index.d.ts +1 -0
  6. package/dist/components/Business/BsSulaQueryTable/setting.d.ts +1 -1
  7. package/dist/components/Business/BsSulaQueryTable/utils.d.ts +1 -0
  8. package/dist/components/Business/columnSettingTable/columnSetting.d.ts +1 -0
  9. package/dist/components/Functional/ExportFunctions/ExportIcon/index.d.ts +1 -1
  10. package/dist/components/Functional/QueryMutipleInput/index.d.ts +2 -1
  11. package/dist/components/Solution/RuleComponent/RenderCompItem.d.ts +2 -0
  12. package/dist/components/Solution/RuleComponent/services.d.ts +1 -1
  13. package/dist/index.esm.js +1777 -1251
  14. package/dist/index.js +1760 -1232
  15. package/dist/utils/TableUtils.d.ts +93 -2
  16. package/dist/utils/businessUtils.d.ts +27 -0
  17. package/dist/utils/constant.d.ts +37 -0
  18. package/dist/utils/index.d.ts +6 -4
  19. package/dist/utils/request.d.ts +2 -0
  20. package/dist/utils/utils.d.ts +13 -0
  21. package/package.json +7 -4
  22. package/src/assets/32.svg +27 -27
  23. package/src/assets/addIcon.svg +17 -17
  24. package/src/assets/allfunc.svg +27 -27
  25. package/src/assets/arrowRight.svg +24 -24
  26. package/src/assets/arrow_top.svg +18 -0
  27. package/src/assets/btn-delete.svg +29 -29
  28. package/src/assets/btn-edit.svg +19 -19
  29. package/src/assets/btn-more.svg +17 -17
  30. package/src/assets/btn-submit.svg +19 -19
  31. package/src/assets/close.svg +26 -26
  32. package/src/assets/drag.svg +17 -17
  33. package/src/assets/fixed-left.svg +15 -15
  34. package/src/assets/fixed-right.svg +15 -15
  35. package/src/assets/guanbi.svg +15 -15
  36. package/src/assets/icon-quanping.svg +15 -15
  37. package/src/assets/icon-shezhi.svg +17 -17
  38. package/src/assets/label_icon_bottom.svg +25 -25
  39. package/src/assets/list-no-img.svg +21 -21
  40. package/src/assets/morentouxiang-32.svg +23 -23
  41. package/src/assets/scanning.svg +24 -24
  42. package/src/assets/upExport.svg +22 -22
  43. package/src/common/ENUM.ts +41 -41
  44. package/src/components/Business/AddSelectBusiness/index.tsx +40 -21
  45. package/src/components/Business/BsLayouts/Components/AllFunc/index.less +153 -153
  46. package/src/components/Business/BsLayouts/Components/AllFunc/index.tsx +70 -70
  47. package/src/components/Business/BsLayouts/Components/ChooseStore/index.less +0 -0
  48. package/src/components/Business/BsLayouts/Components/ChooseStore/index.tsx +193 -0
  49. package/src/components/Business/BsLayouts/Components/ChooseStore/services.ts +10 -0
  50. package/src/components/Business/BsLayouts/Components/CustomerMenu/MenuSetting/index.less +90 -90
  51. package/src/components/Business/BsLayouts/Components/CustomerMenu/MenuSetting/index.tsx +37 -37
  52. package/src/components/Business/BsLayouts/Components/CustomerMenu/MenuSetting/leftTree.tsx +242 -242
  53. package/src/components/Business/BsLayouts/Components/CustomerMenu/MenuSetting/rightTree.tsx +384 -384
  54. package/src/components/Business/BsLayouts/Components/CustomerMenu/globalMenu/customMenuHeader.tsx +74 -74
  55. package/src/components/Business/BsLayouts/Components/CustomerMenu/index.less +64 -64
  56. package/src/components/Business/BsLayouts/Components/CustomerMenu/index.tsx +153 -153
  57. package/src/components/Business/BsLayouts/Components/GlobalHeader/index.tsx +163 -157
  58. package/src/components/Business/BsLayouts/Components/RightContent/LoginModal.tsx +85 -85
  59. package/src/components/Business/BsLayouts/Components/RightContent/i18n.ts +9 -0
  60. package/src/components/Business/BsLayouts/Components/RightContent/index.tsx +19 -2
  61. package/src/components/Business/BsLayouts/Components/SearchFunc/index.tsx +75 -75
  62. package/src/components/Business/BsLayouts/index.less +79 -79
  63. package/src/components/Business/BsLayouts/index.tsx +1494 -1484
  64. package/src/components/Business/BsLayouts/service.ts +2 -2
  65. package/src/components/Business/BsLayouts/utils.tsx +203 -203
  66. package/src/components/Business/BsSulaQueryTable/SearchItemSetting.tsx +9 -9
  67. package/src/components/Business/BsSulaQueryTable/bssulaquerytable.less +5 -0
  68. package/src/components/Business/BsSulaQueryTable/index.less +221 -221
  69. package/src/components/Business/BsSulaQueryTable/index.tsx +346 -175
  70. package/src/components/Business/BsSulaQueryTable/setting.tsx +125 -87
  71. package/src/components/Business/BsSulaQueryTable/utils.tsx +57 -34
  72. package/src/components/Business/CommodityEntry/index.md +70 -70
  73. package/src/components/Business/CommodityEntry/index.tsx +80 -80
  74. package/src/components/Business/CommonGuideWrapper/index.less +121 -112
  75. package/src/components/Business/CommonGuideWrapper/index.md +39 -39
  76. package/src/components/Business/CommonGuideWrapper/index.tsx +94 -84
  77. package/src/components/Business/DetailPageWrapper/index.less +9 -1
  78. package/src/components/Business/DetailPageWrapper/index.tsx +121 -110
  79. package/src/components/Business/HomePageWrapper/index.md +45 -45
  80. package/src/components/Business/HomePageWrapper/index.tsx +162 -162
  81. package/src/components/Business/JsonQueryTable/configButton/index.js +20 -20
  82. package/src/components/Business/JsonQueryTable/configTree/component/compactArrayView.js +25 -25
  83. package/src/components/Business/JsonQueryTable/configTree/component/compactObjectView.js +30 -30
  84. package/src/components/Business/JsonQueryTable/configTree/index.js +82 -82
  85. package/src/components/Business/JsonQueryTable/configTree/index.less +44 -44
  86. package/src/components/Business/JsonQueryTable/configTree/parser/highlight.js +57 -57
  87. package/src/components/Business/JsonQueryTable/configTree/parser/index.js +124 -124
  88. package/src/components/Business/JsonQueryTable/configTree/render/iconRender.js +29 -29
  89. package/src/components/Business/JsonQueryTable/configTree/render/nameRender.js +22 -22
  90. package/src/components/Business/JsonQueryTable/configTree/treeNode.js +116 -116
  91. package/src/components/Business/JsonQueryTable/drawer/index.tsx +12 -12
  92. package/src/components/Business/JsonQueryTable/index.less +16 -16
  93. package/src/components/Business/JsonQueryTable/index.md +328 -328
  94. package/src/components/Business/JsonQueryTable/index.tsx +535 -537
  95. package/src/components/Business/JsonQueryTable/jsonEditor/index.js +346 -346
  96. package/src/components/Business/JsonQueryTable/jsonEditor/index.less +22 -22
  97. package/src/components/Business/JsonQueryTable/jsonEditor/lint/basicType.js +147 -147
  98. package/src/components/Business/JsonQueryTable/jsonEditor/lint/index.js +389 -389
  99. package/src/components/Business/JsonQueryTable/jsonEditor/suggestions/actions.js +118 -118
  100. package/src/components/Business/JsonQueryTable/jsonEditor/suggestions/dependency.js +22 -22
  101. package/src/components/Business/JsonQueryTable/jsonEditor/suggestions/index.js +21 -21
  102. package/src/components/Business/JsonQueryTable/jsonEditor/suggestions/request.js +65 -65
  103. package/src/components/Business/SearchSelect/utils.ts +3 -3
  104. package/src/components/Business/StateFlow/index.md +60 -60
  105. package/src/components/Business/StateFlow/index.tsx +29 -29
  106. package/src/components/Business/columnSettingTable/columnSetting.tsx +10 -8
  107. package/src/components/Business/columnSettingTable/index.less +247 -247
  108. package/src/components/Business/columnSettingTable/index.md +357 -357
  109. package/src/components/Business/columnSettingTable/utils.tsx +71 -71
  110. package/src/components/Business/moreTreeTable/FixedScrollBar.tsx +87 -87
  111. package/src/components/Business/moreTreeTable/hooks/useSticky.ts +21 -21
  112. package/src/components/Business/moreTreeTable/index.less +99 -99
  113. package/src/components/Business/moreTreeTable/index.tsx +387 -387
  114. package/src/components/Business/moreTreeTable/utils.ts +126 -126
  115. package/src/components/Functional/AddSelect/helps.ts +4 -3
  116. package/src/components/Functional/AddSelect/index.less +367 -367
  117. package/src/components/Functional/AddSelect/index.tsx +79 -33
  118. package/src/components/Functional/BillEntry/index.less +371 -371
  119. package/src/components/Functional/BillEntry/index.tsx +3 -3
  120. package/src/components/Functional/BsAntdSula/index.ts +2 -2
  121. package/src/components/Functional/DataImport/index.less +63 -63
  122. package/src/components/Functional/DataImport/index.tsx +3 -3
  123. package/src/components/Functional/DataValidation/index.less +63 -63
  124. package/src/components/Functional/DataValidation/index.tsx +3 -3
  125. package/src/components/Functional/EllipsisTooltip/index.d.ts +5 -5
  126. package/src/components/Functional/EllipsisTooltip/index.js +36 -36
  127. package/src/components/Functional/ExportFunctions/ExportIcon/index.tsx +10 -5
  128. package/src/components/Functional/QueryMutipleInput/index.less +37 -37
  129. package/src/components/Functional/QueryMutipleInput/index.tsx +2 -1
  130. package/src/components/Functional/SearchSelect/index.less +6 -0
  131. package/src/components/Functional/SearchSelect/index.tsx +152 -45
  132. package/src/components/Functional/SearchSelect/utils.ts +3 -3
  133. package/src/components/Functional/TreeSearchSelect/index.tsx +24 -22
  134. package/src/components/Solution/RuleComponent/Formula.tsx +335 -335
  135. package/src/components/Solution/RuleComponent/RenderCompItem.tsx +637 -0
  136. package/src/components/Solution/RuleComponent/index.d.ts +29 -29
  137. package/src/components/Solution/RuleComponent/index.js +7 -652
  138. package/src/components/Solution/RuleComponent/index.less +230 -230
  139. package/src/components/Solution/RuleComponent/renderSpecificAction.js +99 -99
  140. package/src/components/Solution/RuleComponent/services.ts +13 -13
  141. package/src/plugin/TableColumnSetting/index.less +247 -247
  142. package/src/plugin/TableColumnSetting/index.md +50 -50
  143. package/src/plugin/TableColumnSetting/index.tsx +2 -2
  144. package/src/plugin/TableColumnSetting/utils.ts +19 -19
  145. package/src/utils/CheckOneUser/index.md +39 -39
  146. package/src/utils/CheckOneUser/index.ts +51 -51
  147. package/src/utils/LocalstorageUtils.ts +95 -95
  148. package/src/utils/TableUtils.less +52 -0
  149. package/src/utils/TableUtils.tsx +691 -18
  150. package/src/utils/businessUtils.ts +441 -0
  151. package/src/utils/checkUtils.ts +39 -39
  152. package/src/utils/constant.ts +39 -0
  153. package/src/utils/enumConfig.ts +11 -11
  154. package/src/utils/getFormMode.js +12 -12
  155. package/src/utils/index.ts +6 -4
  156. package/src/utils/request.ts +53 -0
  157. package/src/utils/requestUtils.ts +29 -2
  158. package/src/utils/serialize.js +7 -7
  159. package/src/utils/utils.ts +64 -21
@@ -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
+ };