amis-editor 4.0.2-beta.16 → 4.1.0-beta.19

Sign up to get free protection for your applications and to get access to all the features.
Files changed (195) hide show
  1. package/dist/component/Breadcrumb.d.ts +23 -2
  2. package/dist/component/Editor.d.ts +19 -0
  3. package/dist/component/Panel/RenderersPanel.d.ts +1 -2
  4. package/dist/component/RegionWrapper.d.ts +15 -8
  5. package/dist/component/RendererThumb.d.ts +5 -5
  6. package/dist/component/VRenderer.d.ts +5 -1
  7. package/dist/component/base/SearchCustomRendererPanel.d.ts +15 -0
  8. package/dist/component/base/SearchPanel.d.ts +83 -0
  9. package/dist/component/base/SearchRendererPanel.d.ts +3 -43
  10. package/dist/exports.min.js +1 -1
  11. package/dist/index.d.ts +4 -1
  12. package/dist/index.min.js +1 -1
  13. package/dist/manager.d.ts +14 -3
  14. package/dist/plugin/Card.d.ts +1 -0
  15. package/dist/plugin/Cards.d.ts +1 -0
  16. package/dist/plugin/Carousel.d.ts +1 -0
  17. package/dist/plugin/Chart.d.ts +1 -0
  18. package/dist/plugin/Collapse.d.ts +1 -0
  19. package/dist/plugin/Custom.d.ts +3 -0
  20. package/dist/plugin/CustomRegion.d.ts +43 -0
  21. package/dist/plugin/Flex.d.ts +1 -0
  22. package/dist/plugin/Form/Control.d.ts +1 -0
  23. package/dist/plugin/Form/InputURL.d.ts +1 -0
  24. package/dist/plugin/Grid.d.ts +1 -0
  25. package/dist/plugin/HBox.d.ts +1 -0
  26. package/dist/plugin/Json.d.ts +1 -0
  27. package/dist/plugin/List.d.ts +1 -0
  28. package/dist/plugin/Mapping.d.ts +1 -0
  29. package/dist/plugin/Markdown.d.ts +1 -0
  30. package/dist/plugin/Nav.d.ts +1 -0
  31. package/dist/plugin/Panel/Outline.d.ts +8 -0
  32. package/dist/plugin/Progress.d.ts +1 -0
  33. package/dist/plugin/QRCode.d.ts +1 -0
  34. package/dist/plugin/Reset.d.ts +0 -1
  35. package/dist/plugin/Service.d.ts +1 -0
  36. package/dist/plugin/Sparkline.d.ts +1 -0
  37. package/dist/plugin/Status.d.ts +1 -0
  38. package/dist/plugin/Steps.d.ts +1 -0
  39. package/dist/plugin/Submit.d.ts +0 -1
  40. package/dist/plugin/TableView.d.ts +1 -0
  41. package/dist/plugin/Tasks.d.ts +1 -0
  42. package/dist/plugin/TooltipWrapper.d.ts +2 -0
  43. package/dist/plugin/Video.d.ts +1 -0
  44. package/dist/plugin/WebComponent.d.ts +1 -0
  45. package/dist/plugin/Wrapper.d.ts +1 -0
  46. package/dist/plugin.d.ts +2 -2
  47. package/dist/store/editor.d.ts +20 -2
  48. package/dist/store/node.d.ts +6 -0
  49. package/dist/style.css +1 -1
  50. package/dist/util.d.ts +7 -2
  51. package/package.json +6 -3
  52. package/src/component/schemaTpl.tsx +2155 -0
  53. package/src/plugin/.DS_Store +0 -0
  54. package/src/plugin/Alert.tsx +87 -0
  55. package/src/plugin/AnchorNav.tsx +233 -0
  56. package/src/plugin/Audio.tsx +161 -0
  57. package/src/plugin/Avatar.tsx +77 -0
  58. package/src/plugin/Breadcrumb.tsx +107 -0
  59. package/src/plugin/Button.tsx +283 -0
  60. package/src/plugin/ButtonGroup.tsx +88 -0
  61. package/src/plugin/ButtonToolbar.tsx +89 -0
  62. package/src/plugin/CRUD.tsx +1832 -0
  63. package/src/plugin/Card.tsx +290 -0
  64. package/src/plugin/Cards.tsx +315 -0
  65. package/src/plugin/Carousel.tsx +386 -0
  66. package/src/plugin/Chart.tsx +218 -0
  67. package/src/plugin/CodeView.tsx +60 -0
  68. package/src/plugin/Collapse.tsx +143 -0
  69. package/src/plugin/CollapseGroup.tsx +167 -0
  70. package/src/plugin/Container.tsx +44 -0
  71. package/src/plugin/Custom.tsx +128 -0
  72. package/src/plugin/CustomRegion.tsx +150 -0
  73. package/src/plugin/Date.tsx +81 -0
  74. package/src/plugin/Datetime.tsx +75 -0
  75. package/src/plugin/Dialog.tsx +178 -0
  76. package/src/plugin/Divider.tsx +36 -0
  77. package/src/plugin/Drawer.tsx +217 -0
  78. package/src/plugin/DropDownButton.tsx +234 -0
  79. package/src/plugin/Each.tsx +152 -0
  80. package/src/plugin/ErrorRenderer.tsx +15 -0
  81. package/src/plugin/Flex.tsx +156 -0
  82. package/src/plugin/Form/ButtonGroupSelect.tsx +86 -0
  83. package/src/plugin/Form/ButtonToolbar.tsx +121 -0
  84. package/src/plugin/Form/ChainedSelect.tsx +70 -0
  85. package/src/plugin/Form/Checkbox.tsx +87 -0
  86. package/src/plugin/Form/Checkboxes.tsx +167 -0
  87. package/src/plugin/Form/CodeEditor.tsx +91 -0
  88. package/src/plugin/Form/Combo.tsx +582 -0
  89. package/src/plugin/Form/ConditionBuilder.tsx +324 -0
  90. package/src/plugin/Form/Control.tsx +139 -0
  91. package/src/plugin/Form/DiffEditor.tsx +117 -0
  92. package/src/plugin/Form/FieldSet.tsx +175 -0
  93. package/src/plugin/Form/Form.tsx +692 -0
  94. package/src/plugin/Form/Formula.tsx +91 -0
  95. package/src/plugin/Form/Group.tsx +300 -0
  96. package/src/plugin/Form/Hidden.tsx +56 -0
  97. package/src/plugin/Form/InputArray.tsx +228 -0
  98. package/src/plugin/Form/InputCity.tsx +93 -0
  99. package/src/plugin/Form/InputColor.tsx +123 -0
  100. package/src/plugin/Form/InputDate.tsx +175 -0
  101. package/src/plugin/Form/InputDateRange.tsx +225 -0
  102. package/src/plugin/Form/InputDateTime.tsx +183 -0
  103. package/src/plugin/Form/InputDateTimeRange.tsx +221 -0
  104. package/src/plugin/Form/InputEmail.tsx +33 -0
  105. package/src/plugin/Form/InputExcel.tsx +85 -0
  106. package/src/plugin/Form/InputFile.tsx +228 -0
  107. package/src/plugin/Form/InputGroup.tsx +105 -0
  108. package/src/plugin/Form/InputImage.tsx +277 -0
  109. package/src/plugin/Form/InputKV.tsx +72 -0
  110. package/src/plugin/Form/InputMonth.tsx +35 -0
  111. package/src/plugin/Form/InputMonthRange.tsx +195 -0
  112. package/src/plugin/Form/InputNumber.tsx +97 -0
  113. package/src/plugin/Form/InputPassword.tsx +33 -0
  114. package/src/plugin/Form/InputQuarter.tsx +35 -0
  115. package/src/plugin/Form/InputQuarterRange.tsx +195 -0
  116. package/src/plugin/Form/InputRange.tsx +121 -0
  117. package/src/plugin/Form/InputRating.tsx +78 -0
  118. package/src/plugin/Form/InputRepeat.tsx +69 -0
  119. package/src/plugin/Form/InputRichText.tsx +197 -0
  120. package/src/plugin/Form/InputSubForm.tsx +198 -0
  121. package/src/plugin/Form/InputTable.tsx +434 -0
  122. package/src/plugin/Form/InputTag.tsx +81 -0
  123. package/src/plugin/Form/InputText.tsx +186 -0
  124. package/src/plugin/Form/InputTime.tsx +95 -0
  125. package/src/plugin/Form/InputTree.tsx +240 -0
  126. package/src/plugin/Form/InputURL.tsx +34 -0
  127. package/src/plugin/Form/InputYear.tsx +35 -0
  128. package/src/plugin/Form/Item.tsx +325 -0
  129. package/src/plugin/Form/ListSelect.tsx +84 -0
  130. package/src/plugin/Form/LocationPicker.tsx +75 -0
  131. package/src/plugin/Form/MatrixCheckboxes.tsx +147 -0
  132. package/src/plugin/Form/NestedSelect.tsx +222 -0
  133. package/src/plugin/Form/Picker.tsx +217 -0
  134. package/src/plugin/Form/Radios.tsx +130 -0
  135. package/src/plugin/Form/Select.tsx +216 -0
  136. package/src/plugin/Form/Static.tsx +335 -0
  137. package/src/plugin/Form/Switch.tsx +116 -0
  138. package/src/plugin/Form/TabsTransfer.tsx +270 -0
  139. package/src/plugin/Form/Textarea.tsx +94 -0
  140. package/src/plugin/Form/Transfer.tsx +379 -0
  141. package/src/plugin/Form/TreeSelect.tsx +263 -0
  142. package/src/plugin/Form/UUID.tsx +48 -0
  143. package/src/plugin/Grid.tsx +799 -0
  144. package/src/plugin/HBox.tsx +727 -0
  145. package/src/plugin/IFrame.tsx +72 -0
  146. package/src/plugin/Image.tsx +318 -0
  147. package/src/plugin/Images.tsx +238 -0
  148. package/src/plugin/Json.tsx +76 -0
  149. package/src/plugin/Link.tsx +95 -0
  150. package/src/plugin/List.tsx +278 -0
  151. package/src/plugin/ListItem.tsx +233 -0
  152. package/src/plugin/Log.tsx +52 -0
  153. package/src/plugin/Mapping.tsx +156 -0
  154. package/src/plugin/Markdown.tsx +47 -0
  155. package/src/plugin/Nav.tsx +186 -0
  156. package/src/plugin/Operation.tsx +97 -0
  157. package/src/plugin/Others/Action.tsx +428 -0
  158. package/src/plugin/Others/BasicToolbar.tsx +591 -0
  159. package/src/plugin/Others/DataDebug.tsx +134 -0
  160. package/src/plugin/Others/TableCell.tsx +480 -0
  161. package/src/plugin/Others/Unknown.tsx +37 -0
  162. package/src/plugin/Page.tsx +308 -0
  163. package/src/plugin/Panel/AvailableRenderers.tsx +41 -0
  164. package/src/plugin/Panel/Code.tsx +44 -0
  165. package/src/plugin/Panel/Name.tsx +26 -0
  166. package/src/plugin/Panel/Outline.tsx +40 -0
  167. package/src/plugin/Panel.tsx +243 -0
  168. package/src/plugin/Plain.tsx +91 -0
  169. package/src/plugin/Progress.tsx +132 -0
  170. package/src/plugin/Property.tsx +139 -0
  171. package/src/plugin/QRCode.tsx +98 -0
  172. package/src/plugin/Reset.tsx +23 -0
  173. package/src/plugin/Service.tsx +167 -0
  174. package/src/plugin/Sparkline.tsx +40 -0
  175. package/src/plugin/Status.tsx +78 -0
  176. package/src/plugin/Steps.tsx +140 -0
  177. package/src/plugin/Submit.tsx +23 -0
  178. package/src/plugin/Table.tsx +440 -0
  179. package/src/plugin/TableView.tsx +711 -0
  180. package/src/plugin/Tabs.tsx +364 -0
  181. package/src/plugin/Tasks.tsx +276 -0
  182. package/src/plugin/Time.tsx +75 -0
  183. package/src/plugin/TooltipWrapper.tsx +193 -0
  184. package/src/plugin/Tpl.tsx +162 -0
  185. package/src/plugin/Video.tsx +160 -0
  186. package/src/plugin/WebComponent.tsx +56 -0
  187. package/src/plugin/Wizard.tsx +743 -0
  188. package/src/plugin/Wrapper.tsx +107 -0
  189. package/src/plugin.ts +1046 -0
  190. package/dist/150a58f3318ca7541ed9.png +0 -0
  191. package/dist/471adb97c322b226e589.png +0 -0
  192. package/dist/4de5f42360bc5946c3c2.png +0 -0
  193. package/dist/4e9968bba3855f088fed.png +0 -0
  194. package/dist/7f09c38ebc687fea847a.png +0 -0
  195. package/dist/c94073576487510314ea.png +0 -0
@@ -0,0 +1,591 @@
1
+ import {
2
+ BasePlugin,
3
+ BaseEventContext,
4
+ BasicToolbarItem,
5
+ ContextMenuItem,
6
+ ContextMenuEventContext,
7
+ BasicPanelItem,
8
+ BuildPanelEventContext,
9
+ PluginEvent,
10
+ ActiveEventContext,
11
+ InsertEventContext
12
+ } from '../../plugin';
13
+ import {registerEditorPlugin} from '../../manager';
14
+ import find from 'lodash/find';
15
+ import {EditorStoreType} from '../../store/editor';
16
+ import {EditorNodeType} from '../../store/node';
17
+ import {AddBTNSvg} from '../../component/RegionHLBox';
18
+ import {MenuItem} from 'amis/lib/components/ContextMenu';
19
+
20
+ /**
21
+ * 用来给当前选中的元素添加一些基本的工具栏按钮。
22
+ */
23
+ export class BasicToolbarPlugin extends BasePlugin {
24
+ order = -9999;
25
+
26
+ buildEditorToolbar(
27
+ {id, schema}: BaseEventContext,
28
+ toolbars: Array<BasicToolbarItem>
29
+ ) {
30
+ const store = this.manager.store;
31
+ const node = store.getNodeById(id)!;
32
+ const parent = store.getSchemaParentById(id);
33
+ // let vertical = true;
34
+ const regionNode = node.parent as EditorNodeType; // 父级节点
35
+ if (Array.isArray(parent) && regionNode?.isRegion) {
36
+ const host = node.host as EditorNodeType;
37
+
38
+ if (node.draggable) {
39
+ toolbars.push({
40
+ iconSvg: 'drag-btn',
41
+ icon: 'fa fa-arrows',
42
+ tooltip: '按住拖动调整位置',
43
+ placement: 'bottom',
44
+ draggable: true,
45
+ order: -1000,
46
+ onDragStart: this.manager.startDrag.bind(this.manager, id)
47
+ });
48
+ }
49
+
50
+ const idx = parent.indexOf(schema);
51
+
52
+ // if (idx > 0 && node.moveable) {
53
+ // let icon = 'fa fa-arrow-up';
54
+ // let tooltip = '向上移动';
55
+
56
+ // const dom = this.manager.store
57
+ // .getDoc()
58
+ // .querySelector(`[data-editor-id="${id}"]`);
59
+ // const prevDom = this.manager.store
60
+ // .getDoc()
61
+ // .querySelector(`[data-editor-id="${parent[idx - 1]?.$$id}"]`);
62
+
63
+ // if (dom && prevDom) {
64
+ // const prevRect = prevDom.getBoundingClientRect();
65
+ // const rect = dom.getBoundingClientRect();
66
+
67
+ // if (Math.abs(rect.x - prevRect.x) > Math.abs(rect.y - prevRect.y)) {
68
+ // vertical = false;
69
+ // icon = 'fa fa-arrow-left';
70
+ // tooltip = '向前移动';
71
+ // }
72
+
73
+ // toolbars.push({
74
+ // icon: icon,
75
+ // // tooltip: '向前移动(⌘ + ←)',
76
+ // tooltip: tooltip,
77
+ // onClick: () => this.manager.moveUp()
78
+ // });
79
+ // }
80
+ // }
81
+
82
+ // if (idx < parent.length - 1 && node.moveable) {
83
+ // let icon = 'fa fa-arrow-down';
84
+ // let tooltip = '向下移动';
85
+
86
+ // const dom = this.manager.store
87
+ // .getDoc()
88
+ // .querySelector(`[data-editor-id="${id}"]`);
89
+ // const nextDom = this.manager.store
90
+ // .getDoc()
91
+ // .querySelector(`[data-editor-id="${parent[idx + 1]?.$$id}"]`);
92
+
93
+ // if (dom && nextDom) {
94
+ // const nextRect = nextDom.getBoundingClientRect();
95
+ // const rect = dom.getBoundingClientRect();
96
+
97
+ // if (Math.abs(rect.x - nextRect.x) > Math.abs(rect.y - nextRect.y)) {
98
+ // vertical = false;
99
+ // icon = 'fa fa-arrow-right';
100
+ // tooltip = '向后移动';
101
+ // }
102
+
103
+ // toolbars.push({
104
+ // icon: icon,
105
+ // // tooltip: '向后移动(⌘ + →)',
106
+ // tooltip: tooltip,
107
+ // onClick: () => this.manager.moveDown()
108
+ // });
109
+ // }
110
+ // }
111
+
112
+ // if (node.removable) {
113
+ // toolbars.push({
114
+ // icon: 'fa fa-trash-o',
115
+ // // tooltip: '删除(Del)',
116
+ // tooltip: '删除',
117
+ // onClick: () => this.manager.del(id)
118
+ // });
119
+ // }
120
+
121
+ if (
122
+ !host?.memberImmutable(regionNode.region) &&
123
+ store.panels.some(Panel => Panel.key === 'renderers')
124
+ ) {
125
+ const nextId = parent[idx + 1]?.$$id;
126
+
127
+ toolbars.push(
128
+ {
129
+ iconSvg: 'left-arrow-to-left',
130
+ tooltip: '向前插入组件',
131
+ // level: 'special',
132
+ placement: 'bottom',
133
+ // placement: vertical ? 'bottom' : 'right',
134
+ // className: vertical
135
+ // ? 'ae-InsertBefore is-vertical'
136
+ // : 'ae-InsertBefore',
137
+ onClick: () =>
138
+ this.manager.showInsertPanel(
139
+ regionNode.region,
140
+ regionNode.id,
141
+ regionNode.preferTag,
142
+ 'insert',
143
+ undefined,
144
+ id
145
+ )
146
+ },
147
+ {
148
+ iconSvg: 'arrow-to-right',
149
+ tooltip: '向后插入组件',
150
+ // level: 'special',
151
+ placement: 'bottom',
152
+ // placement: vertical ? 'top' : 'left',
153
+ // className: vertical
154
+ // ? 'ae-InsertAfter is-vertical'
155
+ // : 'ae-InsertAfter',
156
+ onClick: () =>
157
+ this.manager.showInsertPanel(
158
+ regionNode.region,
159
+ regionNode.id,
160
+ regionNode.preferTag,
161
+ 'insert',
162
+ undefined,
163
+ nextId
164
+ )
165
+ }
166
+ );
167
+ }
168
+ }
169
+
170
+ if (
171
+ !node.isVitualRenderer &&
172
+ (node.info.plugin.popOverBody || node.info.plugin.popOverBodyCreator)
173
+ ) {
174
+ toolbars.push({
175
+ icon: 'fa fa-pencil',
176
+ tooltip: '编辑',
177
+ placement: 'bottom',
178
+ onClick: e => this.manager.openNodePopOverForm(node.id)
179
+ });
180
+ }
181
+
182
+ // if (node.duplicatable || node.duplicatable === undefined) {
183
+ // toolbars.push({
184
+ // iconSvg: 'copy-btn',
185
+ // icon: 'fa',
186
+ // tooltip: '复制',
187
+ // placement: 'bottom',
188
+ // order: 999,
189
+ // onClick: this.manager.duplicate.bind(this.manager, id)
190
+ // });
191
+ // }
192
+
193
+ if (node.removable || node.removable === undefined) {
194
+ toolbars.push({
195
+ iconSvg: 'delete-btn',
196
+ icon: 'fa',
197
+ tooltip: '删除',
198
+ placement: 'bottom',
199
+ order: 999,
200
+ onClick: this.manager.del.bind(this.manager, id)
201
+ });
202
+ }
203
+
204
+ toolbars.push({
205
+ iconSvg: 'more-btn',
206
+ icon: 'fa fa-cog',
207
+ tooltip: '更多',
208
+ placement: 'bottom',
209
+ order: 1000,
210
+ onClick: e => {
211
+ if (!e.defaultPrevented) {
212
+ const info = (
213
+ e.target as HTMLElement
214
+ ).parentElement!.getBoundingClientRect();
215
+ this.manager.openContextMenu(id, '', {
216
+ x: window.scrollX + info.left + info.width - 155,
217
+ y: window.scrollY + info.top + info.height + 8
218
+ });
219
+ }
220
+ }
221
+ });
222
+ }
223
+
224
+ buildEditorContextMenu(
225
+ {id, schema, region, selections}: ContextMenuEventContext,
226
+ menus: Array<ContextMenuItem>
227
+ ) {
228
+ const manager = this.manager;
229
+ const store = manager.store;
230
+ const parent = store.getSchemaParentById(id);
231
+ const node = store.getNodeById(id)!;
232
+ const paths = store.getNodePathById(id);
233
+ const first = paths.pop()!;
234
+ const host = node.host as EditorNodeType;
235
+ const regionNode = node.parent as EditorNodeType;
236
+
237
+ if (selections.length) {
238
+ // 多选时的右键菜单
239
+ menus.push({
240
+ label: '重复一份',
241
+ icon: 'copy-icon',
242
+ disabled: selections.some(item => !item.node.duplicatable),
243
+ onSelect: () => manager.duplicate(selections.map(item => item.id))
244
+ });
245
+
246
+ menus.push({
247
+ label: '取消多选',
248
+ icon: 'cancel-icon',
249
+ onSelect: () => store.setActiveId(id)
250
+ });
251
+
252
+ menus.push({
253
+ label: '删除',
254
+ icon: 'delete-icon',
255
+ disabled: selections.some(item => !item.node.removable),
256
+ className: 'text-danger',
257
+ onSelect: () => manager.del(selections.map(item => item.id))
258
+ });
259
+ } else if (region) {
260
+ const renderersPanel = store.panels.find(
261
+ item => item.key === 'renderers'
262
+ );
263
+
264
+ if (renderersPanel) {
265
+ // region增加点选后就不需要'插入组件'了
266
+ /*
267
+ menus.push({
268
+ label: '插入组件',
269
+ onHighlight: (isOn: boolean) => isOn && store.setHoverId(id, region),
270
+ onSelect: () => manager.showInsertPanel(region, id)
271
+ });
272
+ */
273
+ menus.push({
274
+ label: '插入组件',
275
+ onHighlight: (isOn: boolean) => isOn && store.setHoverId(id, region),
276
+ onSelect: () => store.showInsertRendererPanel()
277
+ });
278
+
279
+ menus.push({
280
+ label: '清空',
281
+ onSelect: () => manager.emptyRegion(id, region)
282
+ });
283
+
284
+ menus.push({
285
+ label: '粘贴',
286
+ onSelect: () => manager.paste(id, region)
287
+ });
288
+ }
289
+ } else {
290
+ menus.push({
291
+ label: `选中${first.label}`,
292
+ disabled: store.activeId === first.id,
293
+ data: id,
294
+ onSelect: (id: string) => store.setActiveId(id),
295
+ onHighlight: (isHiglight: boolean, id: string) =>
296
+ isHiglight && store.setHoverId(id)
297
+ });
298
+
299
+ if (paths.length) {
300
+ const children = paths
301
+ .filter(node => !node.isRegion && node.info?.editable !== false)
302
+ .reverse()
303
+ .map(node => ({
304
+ label: node.label,
305
+ data: node.id,
306
+ onSelect: (id: string) => store.setActiveId(id),
307
+ onHighlight: (isHiglight: boolean, currentId: string) =>
308
+ isHiglight && store.setHoverId(currentId)
309
+ }));
310
+
311
+ children.length &&
312
+ menus.push({
313
+ label: '选中层级',
314
+ children: children
315
+ });
316
+ }
317
+
318
+ menus.push({
319
+ label: '取消选中',
320
+ disabled: !store.activeId || store.activeId !== id,
321
+ onSelect: () => store.setActiveId('')
322
+ });
323
+
324
+ menus.push('|');
325
+
326
+ menus.push({
327
+ label: '重复一份',
328
+ disabled: !node.duplicatable,
329
+ onSelect: () => manager.duplicate(id)
330
+ });
331
+
332
+ menus.push({
333
+ label: '复制配置',
334
+ onSelect: () => manager.copy(id)
335
+ });
336
+
337
+ menus.push({
338
+ label: '剪切配置',
339
+ disabled: !node.removable,
340
+ onSelect: () => manager.cut(id)
341
+ });
342
+
343
+ menus.push({
344
+ label: '粘贴配置',
345
+ disabled:
346
+ !Array.isArray(parent) ||
347
+ !node.parent ||
348
+ node.info?.typeMutable === false ||
349
+ !node.replaceable,
350
+ onSelect: () => manager.paste(id)
351
+ });
352
+
353
+ menus.push({
354
+ label: '删除',
355
+ disabled: !node.removable,
356
+ className: 'text-danger',
357
+ onSelect: () => manager.del(id)
358
+ });
359
+
360
+ menus.push('|');
361
+
362
+ const idx = Array.isArray(parent) ? parent.indexOf(schema) : -1;
363
+
364
+ menus.push({
365
+ label: '向前移动',
366
+ disabled:
367
+ !(Array.isArray(parent) && idx > 0) ||
368
+ !node.moveable ||
369
+ !node.prevSibling,
370
+ onSelect: () => manager.moveUp()
371
+ });
372
+
373
+ menus.push({
374
+ label: '向后移动',
375
+ disabled:
376
+ !(Array.isArray(parent) && idx < parent.length - 1) ||
377
+ !node.moveable ||
378
+ !node.nextSibling,
379
+ onSelect: () => manager.moveDown()
380
+ });
381
+
382
+ /** 「点选(默认向后插入)」+ 「向前移动」可以替换 「前面插入节点」 */
383
+ /*
384
+ menus.push({
385
+ label: '前面插入节点',
386
+ disabled:
387
+ !Array.isArray(parent) ||
388
+ !regionNode ||
389
+ !regionNode.isRegion ||
390
+ !host ||
391
+ host.memberImmutable(regionNode.region) ||
392
+ !store.panels.some(Panel => Panel.key === 'renderers'),
393
+ onSelect: () =>
394
+ this.manager.showInsertPanel(
395
+ regionNode.region,
396
+ regionNode.id,
397
+ regionNode.preferTag,
398
+ 'insert',
399
+ undefined,
400
+ id
401
+ )
402
+ });
403
+ */
404
+
405
+ /** 「点选(默认向后插入)」可以替换 「后面插入节点」 */
406
+ /*
407
+ menus.push({
408
+ label: '后面插入节点',
409
+ disabled:
410
+ !Array.isArray(parent) ||
411
+ !regionNode ||
412
+ !regionNode.isRegion ||
413
+ !host ||
414
+ host.memberImmutable(regionNode.region) ||
415
+ !store.panels.some(Panel => Panel.key === 'renderers'),
416
+ onSelect: () =>
417
+ this.manager.showInsertPanel(
418
+ regionNode.region,
419
+ regionNode.id,
420
+ regionNode.preferTag,
421
+ 'insert',
422
+ undefined,
423
+ parent[idx + 1]?.$$id
424
+ )
425
+ });
426
+ */
427
+
428
+ menus.push('|');
429
+
430
+ // const configPanel = store.panels.find(item => item.key === 'config');
431
+ // menus.push({
432
+ // label: '设置',
433
+ // onSelect: () => manager.openConfigPanel(id),
434
+ // disabled: !configPanel
435
+ // });
436
+
437
+ // const codePanel = store.panels.find(item => item.key === 'code');
438
+ // menus.push({
439
+ // label: '编辑代码',
440
+ // onSelect: () => manager.openCodePanel(id),
441
+ // disabled:
442
+ // !codePanel || (store.activeId === id && store.getPanelKey() === 'code')
443
+ // });
444
+
445
+ menus.push({
446
+ label: '撤销(Undo)',
447
+ disabled: !store.canUndo,
448
+ onSelect: () => store.undo()
449
+ });
450
+
451
+ menus.push({
452
+ label: '重做(Redo)',
453
+ disabled: !store.canRedo,
454
+ onSelect: () => store.redo()
455
+ });
456
+
457
+ // menus.push('|');
458
+
459
+ /** 可使用「点选(默认向后插入)」替代 */
460
+ /*
461
+ const renderersPanel = store.panels.find(
462
+ item => item.key === 'renderers'
463
+ );
464
+ if (first.childRegions.length && renderersPanel) {
465
+ if (first.childRegions.length > 1) {
466
+ menus.push({
467
+ label: '插入组件',
468
+ children: first.childRegions.map(region => ({
469
+ label: `${region.label}`,
470
+ data: region.region,
471
+ onHighlight: (isOn: boolean, region: string) =>
472
+ isOn ? store.setHoverId(id, region) : store.setHoverId(''),
473
+ onSelect: (region: string) => manager.showInsertPanel(region, id)
474
+ }))
475
+ });
476
+ } else {
477
+ menus.push({
478
+ label: '插入组件',
479
+ data: first.childRegions[0].region,
480
+ onHighlight: (isOn: boolean, region: string) =>
481
+ isOn ? store.setHoverId(id, region) : store.setHoverId(''),
482
+ onSelect: (region: string) => manager.showInsertPanel(region, id)
483
+ });
484
+ }
485
+ }
486
+ */
487
+
488
+ // 使用新版插入组件面板(抽屉弹出式)
489
+ const renderersPanel = store.panels.find(
490
+ item => item.key === 'renderers'
491
+ );
492
+ if (first.childRegions.length && renderersPanel) {
493
+ if (first.childRegions.length > 1) {
494
+ menus.push({
495
+ label: '插入组件',
496
+ children: first.childRegions.map(region => ({
497
+ label: `${region.label}`,
498
+ data: region.region,
499
+ onHighlight: (isOn: boolean, region: string) =>
500
+ isOn ? store.setHoverId(id, region) : store.setHoverId(''),
501
+ onSelect: () => store.showInsertRendererPanel()
502
+ }))
503
+ });
504
+ } else {
505
+ menus.push({
506
+ label: '插入组件',
507
+ data: first.childRegions[0].region,
508
+ onHighlight: (isOn: boolean, region: string) =>
509
+ isOn ? store.setHoverId(id, region) : store.setHoverId(''),
510
+ onSelect: () => store.showInsertRendererPanel()
511
+ });
512
+ }
513
+ }
514
+
515
+ /** 「点选(默认向后插入)」+ 「删除」可以替换 「更改类型」 */
516
+ /*
517
+ menus.push({
518
+ label: '更改类型',
519
+ disabled:
520
+ !node.host ||
521
+ node.info?.typeMutable === false ||
522
+ !node.parent.isRegion ||
523
+ !store.panels.some(Panel => Panel.key === 'renderers') ||
524
+ !node.replaceable,
525
+ onSelect: () => manager.showReplacePanel(id)
526
+ });
527
+ */
528
+ }
529
+ }
530
+
531
+ buildEditorPanel(
532
+ context: BuildPanelEventContext,
533
+ panels: Array<BasicPanelItem>
534
+ ) {
535
+ if (!context.selections.length) {
536
+ return;
537
+ }
538
+
539
+ let menus: Array<ContextMenuItem> = [];
540
+ const contextMenuContext: ContextMenuEventContext = {
541
+ ...context,
542
+ data: menus,
543
+ region: ''
544
+ };
545
+
546
+ menus = this.manager.buildContextMenus(contextMenuContext);
547
+
548
+ if (menus.length) {
549
+ panels.push({
550
+ key: 'contextmenu',
551
+ icon: 'fa fa-cog',
552
+ title: '操作',
553
+ menus: menus,
554
+ render: this.manager.makeSchemaFormRender({
555
+ body: [
556
+ {
557
+ type: 'button-group',
558
+ block: true,
559
+ buttons: menus
560
+ .filter(item => item !== '|')
561
+ .map(menu => ({
562
+ ...(menu as MenuItem),
563
+ type: 'button',
564
+ onClick: (menu as MenuItem).onSelect
565
+ }))
566
+ }
567
+ ]
568
+ })
569
+ });
570
+ }
571
+ }
572
+
573
+ afterInsert(event: PluginEvent<InsertEventContext>) {
574
+ const context = event.context;
575
+
576
+ if (context.node && context.subRenderer?.plugin?.popOverBody) {
577
+ const id = context.data.$$id;
578
+
579
+ if (id) {
580
+ setTimeout(() => {
581
+ this.manager.setActiveId(id);
582
+ requestAnimationFrame(() => {
583
+ this.manager.openNodePopOverForm(id);
584
+ });
585
+ }, 200);
586
+ }
587
+ }
588
+ }
589
+ }
590
+
591
+ registerEditorPlugin(BasicToolbarPlugin);