@tmagic/editor 1.7.7 → 1.7.8-beta.2

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 (242) hide show
  1. package/LICENSE +235 -164
  2. package/dist/es/Editor.js +5 -0
  3. package/dist/es/Editor.vue_vue_type_script_setup_true_lang.js +214 -0
  4. package/dist/es/_virtual/_plugin-vue_export-helper.js +8 -0
  5. package/dist/es/components/CodeBlockEditor.js +5 -0
  6. package/dist/es/components/CodeBlockEditor.vue_vue_type_script_setup_true_lang.js +337 -0
  7. package/dist/es/components/CodeParams.js +5 -0
  8. package/dist/es/components/CodeParams.vue_vue_type_script_setup_true_lang.js +63 -0
  9. package/dist/es/components/ContentMenu.js +5 -0
  10. package/dist/es/components/ContentMenu.vue_vue_type_script_setup_true_lang.js +160 -0
  11. package/dist/es/components/FloatingBox.js +5 -0
  12. package/dist/es/components/FloatingBox.vue_vue_type_script_setup_true_lang.js +161 -0
  13. package/dist/es/components/Icon.js +5 -0
  14. package/dist/es/components/Icon.vue_vue_type_script_setup_true_lang.js +39 -0
  15. package/dist/es/components/Resizer.js +5 -0
  16. package/dist/es/components/Resizer.vue_vue_type_script_setup_true_lang.js +20 -0
  17. package/dist/es/components/ScrollBar.js +6 -0
  18. package/dist/es/components/ScrollBar.vue_vue_type_script_setup_true_lang.js +72 -0
  19. package/dist/es/components/ScrollViewer.js +5 -0
  20. package/dist/es/components/ScrollViewer.vue_vue_type_script_setup_true_lang.js +104 -0
  21. package/dist/es/components/SearchInput.js +5 -0
  22. package/dist/es/components/SearchInput.vue_vue_type_script_setup_true_lang.js +40 -0
  23. package/dist/es/components/SplitView.js +5 -0
  24. package/dist/es/components/SplitView.vue_vue_type_script_setup_true_lang.js +135 -0
  25. package/dist/es/components/ToolButton.js +5 -0
  26. package/dist/es/components/ToolButton.vue_vue_type_script_setup_true_lang.js +131 -0
  27. package/dist/es/components/Tree.js +5 -0
  28. package/dist/es/components/Tree.vue_vue_type_script_setup_true_lang.js +60 -0
  29. package/dist/es/components/TreeNode.js +5 -0
  30. package/dist/es/components/TreeNode.vue_vue_type_script_setup_true_lang.js +126 -0
  31. package/dist/es/editorProps.js +34 -0
  32. package/dist/es/fields/Code.js +5 -0
  33. package/dist/es/fields/Code.vue_vue_type_script_setup_true_lang.js +54 -0
  34. package/dist/es/fields/CodeLink.js +5 -0
  35. package/dist/es/fields/CodeLink.vue_vue_type_script_setup_true_lang.js +69 -0
  36. package/dist/es/fields/CodeSelect.js +5 -0
  37. package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +116 -0
  38. package/dist/es/fields/CodeSelectCol.js +5 -0
  39. package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +145 -0
  40. package/dist/es/fields/CondOpSelect.js +5 -0
  41. package/dist/es/fields/CondOpSelect.vue_vue_type_script_setup_true_lang.js +81 -0
  42. package/dist/es/fields/DataSourceFieldSelect/FieldSelect.js +5 -0
  43. package/dist/es/fields/DataSourceFieldSelect/FieldSelect.vue_vue_type_script_setup_true_lang.js +158 -0
  44. package/dist/es/fields/DataSourceFieldSelect/Index.js +5 -0
  45. package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +155 -0
  46. package/dist/es/fields/DataSourceFields.js +5 -0
  47. package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +390 -0
  48. package/dist/es/fields/DataSourceInput.js +5 -0
  49. package/dist/es/fields/DataSourceInput.vue_vue_type_script_setup_true_lang.js +268 -0
  50. package/dist/es/fields/DataSourceMethodSelect.js +5 -0
  51. package/dist/es/fields/DataSourceMethodSelect.vue_vue_type_script_setup_true_name_true_lang.js +144 -0
  52. package/dist/es/fields/DataSourceMethods.js +5 -0
  53. package/dist/es/fields/DataSourceMethods.vue_vue_type_script_setup_true_lang.js +148 -0
  54. package/dist/es/fields/DataSourceMocks.js +5 -0
  55. package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +259 -0
  56. package/dist/es/fields/DataSourceSelect.js +5 -0
  57. package/dist/es/fields/DataSourceSelect.vue_vue_type_script_setup_true_lang.js +101 -0
  58. package/dist/es/fields/DisplayConds.js +5 -0
  59. package/dist/es/fields/DisplayConds.vue_vue_type_script_setup_true_lang.js +156 -0
  60. package/dist/es/fields/EventSelect.js +5 -0
  61. package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +338 -0
  62. package/dist/es/fields/KeyValue.js +5 -0
  63. package/dist/es/fields/KeyValue.vue_vue_type_script_setup_true_lang.js +158 -0
  64. package/dist/es/fields/PageFragmentSelect.js +5 -0
  65. package/dist/es/fields/PageFragmentSelect.vue_vue_type_script_setup_true_lang.js +81 -0
  66. package/dist/es/fields/StyleSetter/Index.js +5 -0
  67. package/dist/es/fields/StyleSetter/Index.vue_vue_type_script_setup_true_lang.js +92 -0
  68. package/dist/es/fields/StyleSetter/components/BackgroundPosition.js +5 -0
  69. package/dist/es/fields/StyleSetter/components/BackgroundPosition.vue_vue_type_script_setup_true_lang.js +96 -0
  70. package/dist/es/fields/StyleSetter/components/Border.js +5 -0
  71. package/dist/es/fields/StyleSetter/components/Border.vue_vue_type_script_setup_true_lang.js +100 -0
  72. package/dist/es/fields/StyleSetter/components/Box.js +5 -0
  73. package/dist/es/fields/StyleSetter/components/Box.vue_vue_type_script_setup_true_lang.js +81 -0
  74. package/dist/es/fields/StyleSetter/icons/background-repeat/NoRepeat.js +17 -0
  75. package/dist/es/fields/StyleSetter/icons/background-repeat/Repeat.js +14 -0
  76. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatX.js +17 -0
  77. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatY.js +17 -0
  78. package/dist/es/fields/StyleSetter/icons/display/Block.js +14 -0
  79. package/dist/es/fields/StyleSetter/icons/display/Flex.js +14 -0
  80. package/dist/es/fields/StyleSetter/icons/display/Inline.js +14 -0
  81. package/dist/es/fields/StyleSetter/icons/display/InlineBlock.js +14 -0
  82. package/dist/es/fields/StyleSetter/icons/display/None.js +14 -0
  83. package/dist/es/fields/StyleSetter/icons/flex-direction/Column.js +14 -0
  84. package/dist/es/fields/StyleSetter/icons/flex-direction/ColumnReverse.js +14 -0
  85. package/dist/es/fields/StyleSetter/icons/flex-direction/Row.js +14 -0
  86. package/dist/es/fields/StyleSetter/icons/flex-direction/RowReverse.js +14 -0
  87. package/dist/es/fields/StyleSetter/icons/justify-content/Center.js +14 -0
  88. package/dist/es/fields/StyleSetter/icons/justify-content/FlexEnd.js +14 -0
  89. package/dist/es/fields/StyleSetter/icons/justify-content/FlexStart.js +14 -0
  90. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceAround.js +14 -0
  91. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceBetween.js +14 -0
  92. package/dist/es/fields/StyleSetter/icons/text-align/Center.js +14 -0
  93. package/dist/es/fields/StyleSetter/icons/text-align/Left.js +14 -0
  94. package/dist/es/fields/StyleSetter/icons/text-align/Right.js +14 -0
  95. package/dist/es/fields/StyleSetter/pro/Background.js +5 -0
  96. package/dist/es/fields/StyleSetter/pro/Background.vue_vue_type_script_setup_true_lang.js +114 -0
  97. package/dist/es/fields/StyleSetter/pro/Border.js +5 -0
  98. package/dist/es/fields/StyleSetter/pro/Border.vue_vue_type_script_setup_true_lang.js +50 -0
  99. package/dist/es/fields/StyleSetter/pro/Font.js +5 -0
  100. package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +98 -0
  101. package/dist/es/fields/StyleSetter/pro/Layout.js +5 -0
  102. package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +288 -0
  103. package/dist/es/fields/StyleSetter/pro/Position.js +5 -0
  104. package/dist/es/fields/StyleSetter/pro/Position.vue_vue_type_script_setup_true_lang.js +95 -0
  105. package/dist/es/fields/UISelect.js +6 -0
  106. package/dist/es/fields/UISelect.vue_vue_type_script_setup_true_lang.js +161 -0
  107. package/dist/es/hooks/use-code-block-edit.js +54 -0
  108. package/dist/es/hooks/use-data-source-edit.js +29 -0
  109. package/dist/es/hooks/use-editor-content-height.js +17 -0
  110. package/dist/es/hooks/use-filter.js +35 -0
  111. package/dist/es/hooks/use-float-box.js +76 -0
  112. package/dist/es/hooks/use-getso.js +28 -0
  113. package/dist/es/hooks/use-next-float-box-position.js +27 -0
  114. package/dist/es/hooks/use-node-status.js +28 -0
  115. package/dist/es/hooks/use-services.js +9 -0
  116. package/dist/es/hooks/use-stage.js +107 -0
  117. package/dist/es/hooks/use-window-rect.js +19 -0
  118. package/dist/es/icons/CenterIcon.js +5 -0
  119. package/dist/es/icons/CenterIcon.vue_vue_type_script_setup_true_lang.js +40 -0
  120. package/dist/es/icons/CodeIcon.js +5 -0
  121. package/dist/es/icons/CodeIcon.vue_vue_type_script_setup_true_lang.js +19 -0
  122. package/dist/es/icons/FolderMinusIcon.js +5 -0
  123. package/dist/es/icons/FolderMinusIcon.vue_vue_type_script_setup_true_lang.js +27 -0
  124. package/dist/es/index.js +79 -0
  125. package/dist/es/initService.js +392 -0
  126. package/dist/es/layouts/AddPageBox.js +5 -0
  127. package/dist/es/layouts/AddPageBox.vue_vue_type_script_setup_true_lang.js +38 -0
  128. package/dist/es/layouts/CodeEditor.js +5 -0
  129. package/dist/es/layouts/CodeEditor.vue_vue_type_script_setup_true_lang.js +270 -0
  130. package/dist/es/layouts/Framework.js +5 -0
  131. package/dist/es/layouts/Framework.vue_vue_type_script_setup_true_lang.js +134 -0
  132. package/dist/es/layouts/NavMenu.js +5 -0
  133. package/dist/es/layouts/NavMenu.vue_vue_type_script_setup_true_lang.js +181 -0
  134. package/dist/es/layouts/page-bar/AddButton.js +5 -0
  135. package/dist/es/layouts/page-bar/AddButton.vue_vue_type_script_setup_true_lang.js +57 -0
  136. package/dist/es/layouts/page-bar/PageBar.js +5 -0
  137. package/dist/es/layouts/page-bar/PageBar.vue_vue_type_script_setup_true_lang.js +135 -0
  138. package/dist/es/layouts/page-bar/PageBarScrollContainer.js +5 -0
  139. package/dist/es/layouts/page-bar/PageBarScrollContainer.vue_vue_type_script_setup_true_lang.js +119 -0
  140. package/dist/es/layouts/page-bar/PageList.js +5 -0
  141. package/dist/es/layouts/page-bar/PageList.vue_vue_type_script_setup_true_lang.js +54 -0
  142. package/dist/es/layouts/page-bar/Search.js +5 -0
  143. package/dist/es/layouts/page-bar/Search.vue_vue_type_script_setup_true_lang.js +60 -0
  144. package/dist/es/layouts/props-panel/FormPanel.js +5 -0
  145. package/dist/es/layouts/props-panel/FormPanel.vue_vue_type_script_setup_true_lang.js +129 -0
  146. package/dist/es/layouts/props-panel/PropsPanel.js +5 -0
  147. package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +179 -0
  148. package/dist/es/layouts/props-panel/use-style-panel.js +40 -0
  149. package/dist/es/layouts/sidebar/ComponentListPanel.js +5 -0
  150. package/dist/es/layouts/sidebar/ComponentListPanel.vue_vue_type_script_setup_true_lang.js +121 -0
  151. package/dist/es/layouts/sidebar/Sidebar.js +5 -0
  152. package/dist/es/layouts/sidebar/Sidebar.vue_vue_type_script_setup_true_lang.js +314 -0
  153. package/dist/es/layouts/sidebar/code-block/CodeBlockList.js +5 -0
  154. package/dist/es/layouts/sidebar/code-block/CodeBlockList.vue_vue_type_script_setup_true_lang.js +161 -0
  155. package/dist/es/layouts/sidebar/code-block/CodeBlockListPanel.js +5 -0
  156. package/dist/es/layouts/sidebar/code-block/CodeBlockListPanel.vue_vue_type_script_setup_true_lang.js +113 -0
  157. package/dist/es/layouts/sidebar/code-block/useContentMenu.js +60 -0
  158. package/dist/es/layouts/sidebar/data-source/DataSourceAddButton.js +5 -0
  159. package/dist/es/layouts/sidebar/data-source/DataSourceAddButton.vue_vue_type_script_setup_true_lang.js +44 -0
  160. package/dist/es/layouts/sidebar/data-source/DataSourceConfigPanel.js +5 -0
  161. package/dist/es/layouts/sidebar/data-source/DataSourceConfigPanel.vue_vue_type_script_setup_true_lang.js +103 -0
  162. package/dist/es/layouts/sidebar/data-source/DataSourceList.js +5 -0
  163. package/dist/es/layouts/sidebar/data-source/DataSourceList.vue_vue_type_script_setup_true_lang.js +162 -0
  164. package/dist/es/layouts/sidebar/data-source/DataSourceListPanel.js +5 -0
  165. package/dist/es/layouts/sidebar/data-source/DataSourceListPanel.vue_vue_type_script_setup_true_lang.js +133 -0
  166. package/dist/es/layouts/sidebar/data-source/useContentMenu.js +59 -0
  167. package/dist/es/layouts/sidebar/layer/LayerMenu.js +5 -0
  168. package/dist/es/layouts/sidebar/layer/LayerMenu.vue_vue_type_script_setup_true_lang.js +90 -0
  169. package/dist/es/layouts/sidebar/layer/LayerNodeTool.js +5 -0
  170. package/dist/es/layouts/sidebar/layer/LayerNodeTool.vue_vue_type_script_setup_true_lang.js +35 -0
  171. package/dist/es/layouts/sidebar/layer/LayerPanel.js +5 -0
  172. package/dist/es/layouts/sidebar/layer/LayerPanel.vue_vue_type_script_setup_true_lang.js +99 -0
  173. package/dist/es/layouts/sidebar/layer/use-click.js +68 -0
  174. package/dist/es/layouts/sidebar/layer/use-drag.js +118 -0
  175. package/dist/es/layouts/sidebar/layer/use-keybinding.js +36 -0
  176. package/dist/es/layouts/sidebar/layer/use-node-status.js +75 -0
  177. package/dist/es/layouts/workspace/Breadcrumb.js +5 -0
  178. package/dist/es/layouts/workspace/Breadcrumb.vue_vue_type_script_setup_true_lang.js +39 -0
  179. package/dist/es/layouts/workspace/Workspace.js +5 -0
  180. package/dist/es/layouts/workspace/Workspace.vue_vue_type_script_setup_true_lang.js +43 -0
  181. package/dist/es/layouts/workspace/viewer/NodeListMenu.js +5 -0
  182. package/dist/es/layouts/workspace/viewer/NodeListMenu.vue_vue_type_script_setup_true_lang.js +88 -0
  183. package/dist/es/layouts/workspace/viewer/Stage.js +5 -0
  184. package/dist/es/layouts/workspace/viewer/Stage.vue_vue_type_script_setup_true_lang.js +206 -0
  185. package/dist/es/layouts/workspace/viewer/StageOverlay.js +5 -0
  186. package/dist/es/layouts/workspace/viewer/StageOverlay.vue_vue_type_script_setup_true_lang.js +89 -0
  187. package/dist/es/layouts/workspace/viewer/ViewerMenu.js +5 -0
  188. package/dist/es/layouts/workspace/viewer/ViewerMenu.vue_vue_type_script_setup_true_lang.js +132 -0
  189. package/dist/es/plugin.js +61 -0
  190. package/dist/es/services/BaseService.js +148 -0
  191. package/dist/es/services/codeBlock.js +251 -0
  192. package/dist/es/services/componentList.js +29 -0
  193. package/dist/es/services/dataSource.js +157 -0
  194. package/dist/es/services/dep.js +173 -0
  195. package/dist/es/services/editor.js +752 -0
  196. package/dist/es/services/events.js +64 -0
  197. package/dist/es/services/history.js +84 -0
  198. package/dist/es/services/keybinding.js +182 -0
  199. package/dist/es/services/props.js +216 -0
  200. package/dist/es/services/stageOverlay.js +161 -0
  201. package/dist/es/services/storage.js +127 -0
  202. package/dist/es/services/ui.js +112 -0
  203. package/dist/es/style.css +1937 -0
  204. package/dist/es/type.js +90 -0
  205. package/dist/es/utils/compose.js +44 -0
  206. package/dist/es/utils/config.js +8 -0
  207. package/dist/es/utils/const.js +15 -0
  208. package/dist/es/utils/content-menu.js +76 -0
  209. package/dist/es/utils/data-source/formConfigs/base.js +28 -0
  210. package/dist/es/utils/data-source/formConfigs/http.js +74 -0
  211. package/dist/es/utils/data-source/index.js +202 -0
  212. package/dist/es/utils/dep/idle-task.js +76 -0
  213. package/dist/es/utils/dep/worker.js +19 -0
  214. package/dist/es/utils/editor.js +261 -0
  215. package/dist/es/utils/keybinding-config.js +106 -0
  216. package/dist/es/utils/logger.js +18 -0
  217. package/dist/es/utils/monaco-editor.js +13 -0
  218. package/dist/es/utils/operator.js +73 -0
  219. package/dist/es/utils/props.js +232 -0
  220. package/dist/es/utils/scroll-viewer.js +115 -0
  221. package/dist/es/utils/tree.js +11 -0
  222. package/dist/es/utils/undo-redo.js +43 -0
  223. package/dist/style.css +10 -10
  224. package/dist/tmagic-editor.umd.cjs +18430 -21979
  225. package/package.json +16 -12
  226. package/src/components/CodeBlockEditor.vue +2 -8
  227. package/src/fields/CodeLink.vue +2 -2
  228. package/src/fields/CodeSelectCol.vue +1 -1
  229. package/src/fields/DataSourceFieldSelect/Index.vue +16 -3
  230. package/src/fields/DataSourceFields.vue +4 -1
  231. package/src/fields/EventSelect.vue +11 -11
  232. package/src/fields/StyleSetter/components/BackgroundPosition.vue +2 -2
  233. package/src/fields/StyleSetter/pro/Layout.vue +8 -8
  234. package/src/index.ts +1 -73
  235. package/src/plugin.ts +92 -0
  236. package/src/services/props.ts +3 -1
  237. package/src/type.ts +1 -1
  238. package/src/utils/data-source/index.ts +71 -73
  239. package/src/utils/index.ts +1 -0
  240. package/src/utils/props.ts +9 -7
  241. package/types/index.d.ts +3369 -3319
  242. package/dist/tmagic-editor.js +0 -17053
@@ -0,0 +1,64 @@
1
+ import BaseService_default from "./BaseService.js";
2
+ import { toLine } from "@tmagic/utils";
3
+ import { reactive } from "vue";
4
+ import { cloneDeep } from "lodash-es";
5
+ //#region packages/editor/src/services/events.ts
6
+ var canUsePluginMethods = {
7
+ async: [],
8
+ sync: [
9
+ "setEvent",
10
+ "getEvent",
11
+ "setMethod",
12
+ "getMethod"
13
+ ]
14
+ };
15
+ var eventMap = reactive({});
16
+ var methodMap = reactive({});
17
+ var Events = class extends BaseService_default {
18
+ constructor() {
19
+ super([...canUsePluginMethods.async.map((methodName) => ({
20
+ name: methodName,
21
+ isAsync: true
22
+ })), ...canUsePluginMethods.sync.map((methodName) => ({
23
+ name: methodName,
24
+ isAsync: false
25
+ }))]);
26
+ }
27
+ setEvents(events) {
28
+ Object.keys(events).forEach((type) => {
29
+ this.setEvent(toLine(type), events[type] || []);
30
+ });
31
+ }
32
+ setEvent(type, events) {
33
+ eventMap[toLine(type)] = [...events];
34
+ }
35
+ getEvent(type) {
36
+ return cloneDeep(eventMap[toLine(type)]) || [];
37
+ }
38
+ setMethods(methods) {
39
+ Object.keys(methods).forEach((type) => {
40
+ this.setMethod(toLine(type), methods[type] || []);
41
+ });
42
+ }
43
+ setMethod(type, method) {
44
+ methodMap[toLine(type)] = [...method];
45
+ }
46
+ getMethod(type, _targetId) {
47
+ return cloneDeep(methodMap[toLine(type)]) || [];
48
+ }
49
+ resetState() {
50
+ eventMap = reactive({});
51
+ methodMap = reactive({});
52
+ }
53
+ destroy() {
54
+ this.resetState();
55
+ this.removeAllListeners();
56
+ this.removeAllPlugins();
57
+ }
58
+ usePlugin(options) {
59
+ super.usePlugin(options);
60
+ }
61
+ };
62
+ var events_default = new Events();
63
+ //#endregion
64
+ export { events_default as default };
@@ -0,0 +1,84 @@
1
+ import BaseService_default from "./BaseService.js";
2
+ import { UndoRedo } from "../utils/undo-redo.js";
3
+ import { reactive } from "vue";
4
+ //#region packages/editor/src/services/history.ts
5
+ var History = class extends BaseService_default {
6
+ state = reactive({
7
+ pageSteps: {},
8
+ pageId: void 0,
9
+ canRedo: false,
10
+ canUndo: false
11
+ });
12
+ constructor() {
13
+ super([]);
14
+ this.on("change", this.setCanUndoRedo);
15
+ }
16
+ reset() {
17
+ this.state.pageSteps = {};
18
+ this.resetPage();
19
+ }
20
+ resetPage() {
21
+ this.state.pageId = void 0;
22
+ this.state.canRedo = false;
23
+ this.state.canUndo = false;
24
+ }
25
+ changePage(page) {
26
+ if (!page) return;
27
+ this.state.pageId = page.id;
28
+ if (!this.state.pageSteps[this.state.pageId]) {
29
+ const undoRedo = new UndoRedo();
30
+ undoRedo.pushElement({
31
+ data: page,
32
+ modifiedNodeIds: /* @__PURE__ */ new Map(),
33
+ nodeId: page.id
34
+ });
35
+ this.state.pageSteps[this.state.pageId] = undoRedo;
36
+ }
37
+ this.setCanUndoRedo();
38
+ this.emit("page-change", this.state.pageSteps[this.state.pageId]);
39
+ }
40
+ resetState() {
41
+ this.state.pageId = void 0;
42
+ this.state.pageSteps = {};
43
+ this.state.canRedo = false;
44
+ this.state.canUndo = false;
45
+ }
46
+ push(state) {
47
+ const undoRedo = this.getUndoRedo();
48
+ if (!undoRedo) return null;
49
+ undoRedo.pushElement(state);
50
+ this.emit("change", state);
51
+ return state;
52
+ }
53
+ undo() {
54
+ const undoRedo = this.getUndoRedo();
55
+ if (!undoRedo) return null;
56
+ const state = undoRedo.undo();
57
+ this.emit("change", state);
58
+ return state;
59
+ }
60
+ redo() {
61
+ const undoRedo = this.getUndoRedo();
62
+ if (!undoRedo) return null;
63
+ const state = undoRedo.redo();
64
+ this.emit("change", state);
65
+ return state;
66
+ }
67
+ destroy() {
68
+ this.resetState();
69
+ this.removeAllListeners();
70
+ this.removeAllPlugins();
71
+ }
72
+ getUndoRedo() {
73
+ if (!this.state.pageId) return null;
74
+ return this.state.pageSteps[this.state.pageId];
75
+ }
76
+ setCanUndoRedo() {
77
+ const undoRedo = this.getUndoRedo();
78
+ this.state.canRedo = undoRedo?.canRedo() || false;
79
+ this.state.canUndo = undoRedo?.canUndo() || false;
80
+ }
81
+ };
82
+ var history_default = new History();
83
+ //#endregion
84
+ export { history_default as default };
@@ -0,0 +1,182 @@
1
+ import { KeyBindingCommand } from "../type.js";
2
+ import BaseService_default from "./BaseService.js";
3
+ import editor_default from "./editor.js";
4
+ import ui_default from "./ui.js";
5
+ import { isPage, isPageFragment } from "@tmagic/utils";
6
+ import KeyController from "keycon";
7
+ //#region packages/editor/src/services/keybinding.ts
8
+ var Keybinding = class extends BaseService_default {
9
+ ctrlKey = /mac os x/.test(navigator.userAgent.toLowerCase()) ? "meta" : "ctrl";
10
+ controllers = /* @__PURE__ */ new Map();
11
+ bindingList = [];
12
+ commands = {
13
+ [KeyBindingCommand.DELETE_NODE]: () => {
14
+ const nodes = editor_default.get("nodes");
15
+ if (!nodes || isPage(nodes[0]) || isPageFragment(nodes[0])) return;
16
+ editor_default.remove(nodes);
17
+ },
18
+ [KeyBindingCommand.COPY_NODE]: () => {
19
+ const nodes = editor_default.get("nodes");
20
+ nodes && editor_default.copy(nodes);
21
+ },
22
+ [KeyBindingCommand.CUT_NODE]: () => {
23
+ const nodes = editor_default.get("nodes");
24
+ if (!nodes || isPage(nodes[0]) || isPageFragment(nodes[0])) return;
25
+ editor_default.copy(nodes);
26
+ editor_default.remove(nodes);
27
+ },
28
+ [KeyBindingCommand.PASTE_NODE]: () => {
29
+ editor_default.get("nodes") && editor_default.paste({
30
+ offsetX: 10,
31
+ offsetY: 10
32
+ });
33
+ },
34
+ [KeyBindingCommand.UNDO]: () => {
35
+ editor_default.undo();
36
+ },
37
+ [KeyBindingCommand.REDO]: () => {
38
+ editor_default.redo();
39
+ },
40
+ [KeyBindingCommand.ZOOM_IN]: () => {
41
+ ui_default.zoom(.1);
42
+ },
43
+ [KeyBindingCommand.ZOOM_OUT]: () => {
44
+ ui_default.zoom(-.1);
45
+ },
46
+ [KeyBindingCommand.ZOOM_RESET]: () => {
47
+ ui_default.set("zoom", 1);
48
+ },
49
+ [KeyBindingCommand.ZOOM_FIT]: async () => {
50
+ ui_default.set("zoom", await ui_default.calcZoom());
51
+ },
52
+ [KeyBindingCommand.MOVE_UP_1]: () => {
53
+ editor_default.move(0, -1);
54
+ },
55
+ [KeyBindingCommand.MOVE_DOWN_1]: () => {
56
+ editor_default.move(0, 1);
57
+ },
58
+ [KeyBindingCommand.MOVE_LEFT_1]: () => {
59
+ editor_default.move(-1, 0);
60
+ },
61
+ [KeyBindingCommand.MOVE_RIGHT_1]: () => {
62
+ editor_default.move(1, 0);
63
+ },
64
+ [KeyBindingCommand.MOVE_UP_10]: () => {
65
+ editor_default.move(0, -10);
66
+ },
67
+ [KeyBindingCommand.MOVE_DOWN_10]: () => {
68
+ editor_default.move(0, 10);
69
+ },
70
+ [KeyBindingCommand.MOVE_LEFT_10]: () => {
71
+ editor_default.move(-10, 0);
72
+ },
73
+ [KeyBindingCommand.MOVE_RIGHT_10]: () => {
74
+ editor_default.move(10, 0);
75
+ },
76
+ [KeyBindingCommand.SWITCH_NODE]: () => {
77
+ editor_default.selectNextNode();
78
+ }
79
+ };
80
+ registerCommand(command, handler) {
81
+ this.commands[command] = handler;
82
+ }
83
+ /**
84
+ * @deprecated
85
+ */
86
+ registeCommand(command, handler) {
87
+ this.registerCommand(command, handler);
88
+ }
89
+ unregisterCommand(command) {
90
+ delete this.commands[command];
91
+ }
92
+ /**
93
+ * @deprecated
94
+ */
95
+ unregisteCommand(command) {
96
+ this.unregisterCommand(command);
97
+ }
98
+ registerEl(name, el) {
99
+ if (name !== "global" && !el) throw new Error("只有name为global可以不传el");
100
+ const keycon = new KeyController(el);
101
+ this.controllers.set(name, keycon);
102
+ this.bind(name);
103
+ }
104
+ /**
105
+ * @deprecated
106
+ */
107
+ registeEl(name, el) {
108
+ this.registerEl(name, el);
109
+ }
110
+ unregisterEl(name) {
111
+ this.controllers.get(name)?.destroy();
112
+ this.controllers.delete(name);
113
+ this.bindingList.forEach((item) => {
114
+ item.bound = false;
115
+ });
116
+ }
117
+ /**
118
+ * @deprecated
119
+ */
120
+ unregisteEl(name) {
121
+ this.unregisterEl(name);
122
+ }
123
+ register(maps) {
124
+ for (const keybindingItem of maps) {
125
+ const { command, keybinding, when } = keybindingItem;
126
+ for (const [type = "", eventType = "keydown"] of when) {
127
+ const cacheItem = {
128
+ type,
129
+ command,
130
+ keybinding,
131
+ eventType,
132
+ bound: false
133
+ };
134
+ if (this.bindingList.find((item) => item.command === command && item.eventType === eventType && item.type === type && item.keybinding === keybinding)) continue;
135
+ this.bindingList.push(cacheItem);
136
+ }
137
+ }
138
+ this.bind();
139
+ }
140
+ /**
141
+ * @deprecated
142
+ */
143
+ registe(map) {
144
+ this.register(map);
145
+ }
146
+ reset() {
147
+ this.controllers.forEach((keycon) => {
148
+ keycon.destroy();
149
+ });
150
+ this.controllers.clear();
151
+ this.bindingList = [];
152
+ }
153
+ destroy() {
154
+ this.reset();
155
+ }
156
+ bind(name) {
157
+ for (const item of this.bindingList) {
158
+ const { type, eventType, command, keybinding, bound } = item;
159
+ if (name && name !== type) continue;
160
+ if (bound) continue;
161
+ const keycon = this.controllers.get(type);
162
+ if (!keycon) continue;
163
+ const handler = (e) => {
164
+ e.inputEvent.preventDefault();
165
+ this.commands[command]?.(e.inputEvent);
166
+ };
167
+ this.getKeyconKeys(keybinding).forEach((keys) => {
168
+ if (keys[0]) keycon[eventType](keys, handler);
169
+ else keycon[eventType](handler);
170
+ });
171
+ item.bound = true;
172
+ }
173
+ }
174
+ getKeyconKeys(keybinding = "") {
175
+ const splitKey = (key) => key.split("+").map((k) => k === "ctrl" ? this.ctrlKey : k);
176
+ if (Array.isArray(keybinding)) return keybinding.map((key) => splitKey(key));
177
+ return [splitKey(keybinding)];
178
+ }
179
+ };
180
+ var keybinding_default = new Keybinding();
181
+ //#endregion
182
+ export { keybinding_default as default };
@@ -0,0 +1,216 @@
1
+ import BaseService_default from "./BaseService.js";
2
+ import { fillConfig } from "../utils/props.js";
3
+ import editor_default from "./editor.js";
4
+ import { getNodePath, getValueByKeyPath, guid, setValueByKeyPath, toLine } from "@tmagic/utils";
5
+ import { Target, Watcher } from "@tmagic/core";
6
+ import { reactive } from "vue";
7
+ import { cloneDeep, mergeWith } from "lodash-es";
8
+ //#region packages/editor/src/services/props.ts
9
+ var canUsePluginMethods = {
10
+ async: [
11
+ "setPropsConfig",
12
+ "getPropsConfig",
13
+ "setPropsValue",
14
+ "getPropsValue",
15
+ "fillConfig",
16
+ "getDefaultPropsValue"
17
+ ],
18
+ sync: ["createId", "setNewItemId"]
19
+ };
20
+ var Props = class extends BaseService_default {
21
+ state = reactive({
22
+ propsConfigMap: {},
23
+ propsValueMap: {},
24
+ relateIdMap: {},
25
+ disabledDataSource: false,
26
+ disabledCodeBlock: false
27
+ });
28
+ constructor() {
29
+ super([...canUsePluginMethods.async.map((methodName) => ({
30
+ name: methodName,
31
+ isAsync: true
32
+ })), ...canUsePluginMethods.sync.map((methodName) => ({
33
+ name: methodName,
34
+ isAsync: false
35
+ }))]);
36
+ }
37
+ setDisabledDataSource(disabled) {
38
+ this.state.disabledDataSource = disabled;
39
+ }
40
+ setDisabledCodeBlock(disabled) {
41
+ this.state.disabledCodeBlock = disabled;
42
+ }
43
+ getDisabledDataSource() {
44
+ return this.state.disabledDataSource;
45
+ }
46
+ getDisabledCodeBlock() {
47
+ return this.state.disabledCodeBlock;
48
+ }
49
+ setPropsConfigs(configs) {
50
+ Object.keys(configs).forEach((type) => {
51
+ this.setPropsConfig(toLine(type), configs[type]);
52
+ });
53
+ this.emit("props-configs-change");
54
+ }
55
+ async fillConfig(config, labelWidth) {
56
+ return fillConfig(config, {
57
+ labelWidth: typeof labelWidth !== "function" ? labelWidth : "80px",
58
+ disabledDataSource: this.getDisabledDataSource(),
59
+ disabledCodeBlock: this.getDisabledCodeBlock()
60
+ });
61
+ }
62
+ async setPropsConfig(type, config) {
63
+ let c;
64
+ if (typeof config === "function") c = config({ editorService: editor_default });
65
+ else c = config;
66
+ this.state.propsConfigMap[toLine(type)] = await this.fillConfig(Array.isArray(c) ? c : [c]);
67
+ }
68
+ /**
69
+ * 获取指点类型的组件属性表单配置
70
+ * @param type 组件类型
71
+ * @returns 组件属性表单配置
72
+ */
73
+ async getPropsConfig(type) {
74
+ if (type === "area") return await this.getPropsConfig("button");
75
+ return cloneDeep(this.state.propsConfigMap[toLine(type)] || await this.fillConfig([]));
76
+ }
77
+ setPropsValues(values) {
78
+ Object.keys(values).forEach((type) => {
79
+ this.setPropsValue(toLine(type), values[type]);
80
+ });
81
+ }
82
+ /**
83
+ * 为指点类型组件设置组件初始值
84
+ * @param type 组件类型
85
+ * @param value 组件初始值
86
+ */
87
+ async setPropsValue(type, value) {
88
+ let v = value;
89
+ if (typeof value === "function") v = value({ editorService: editor_default });
90
+ this.state.propsValueMap[toLine(type)] = v;
91
+ }
92
+ /**
93
+ * 获取指定类型的组件初始值
94
+ * @param type 组件类型
95
+ * @returns 组件初始值
96
+ */
97
+ async getPropsValue(componentType, { inputEvent, ...defaultValue } = {}) {
98
+ const type = toLine(componentType);
99
+ if (type === "area") {
100
+ const value = await this.getPropsValue("button");
101
+ value.className = "action-area";
102
+ value.text = "";
103
+ if (value.style) value.style.backgroundColor = "rgba(255, 255, 255, 0)";
104
+ return value;
105
+ }
106
+ const id = this.createId(type);
107
+ const defaultPropsValue = this.getDefaultPropsValue(type);
108
+ const data = this.setNewItemId(cloneDeep({
109
+ type,
110
+ ...defaultValue
111
+ }));
112
+ return {
113
+ id,
114
+ ...defaultPropsValue,
115
+ ...mergeWith({}, cloneDeep(this.state.propsValueMap[type] || {}), data)
116
+ };
117
+ }
118
+ createId(type) {
119
+ return `${type}_${guid()}`;
120
+ }
121
+ /**
122
+ * 将组件与组件的子元素配置中的id都设置成一个新的ID
123
+ * 如果没有相同ID并且force为false则保持不变
124
+ * @param {Object} config 组件配置
125
+ * @param {Boolean} force 是否强制设置新的ID
126
+ */
127
+ setNewItemId(config, force = true) {
128
+ if (force || editor_default.getNodeById(config.id)) {
129
+ const newId = this.createId(config.type || "component");
130
+ this.setRelateId(config.id, newId);
131
+ config.id = newId;
132
+ }
133
+ if (config.items && Array.isArray(config.items)) for (const item of config.items) this.setNewItemId(item);
134
+ return config;
135
+ }
136
+ /**
137
+ * 获取默认属性配置
138
+ * @param type 组件类型
139
+ * @returns Object
140
+ */
141
+ getDefaultPropsValue(type) {
142
+ return ["page", "container"].includes(type) ? {
143
+ type,
144
+ layout: "absolute",
145
+ style: {},
146
+ name: type,
147
+ items: []
148
+ } : {
149
+ type,
150
+ style: {},
151
+ name: type
152
+ };
153
+ }
154
+ resetState() {
155
+ this.state.propsConfigMap = {};
156
+ this.state.propsValueMap = {};
157
+ }
158
+ /**
159
+ * 替换关联ID
160
+ * @param originConfigs 原组件配置
161
+ * @param targetConfigs 待替换的组件配置
162
+ */
163
+ replaceRelateId(originConfigs, targetConfigs, collectorOptions) {
164
+ const relateIdMap = this.getRelateIdMap();
165
+ if (Object.keys(relateIdMap).length === 0) return;
166
+ const target = new Target({ ...collectorOptions });
167
+ const coperWatcher = new Watcher();
168
+ coperWatcher.addTarget(target);
169
+ coperWatcher.collect(originConfigs, {}, true, collectorOptions.type);
170
+ originConfigs.forEach((config) => {
171
+ const newId = relateIdMap[config.id];
172
+ const path = getNodePath(newId, targetConfigs);
173
+ const targetConfig = path[path.length - 1];
174
+ if (!targetConfig) return;
175
+ target.deps[config.id]?.keys?.forEach((fullKey) => {
176
+ const relateTargetId = relateIdMap[getValueByKeyPath(fullKey, config)];
177
+ if (!relateTargetId) return;
178
+ setValueByKeyPath(fullKey, relateTargetId, targetConfig);
179
+ });
180
+ if (config.items && Array.isArray(config.items)) this.replaceRelateId(config.items, targetConfigs, collectorOptions);
181
+ });
182
+ }
183
+ /**
184
+ * 清除setNewItemId前后映射关系
185
+ */
186
+ clearRelateId() {
187
+ this.state.relateIdMap = {};
188
+ }
189
+ destroy() {
190
+ this.resetState();
191
+ this.removeAllListeners();
192
+ this.removeAllPlugins();
193
+ }
194
+ usePlugin(options) {
195
+ super.usePlugin(options);
196
+ }
197
+ /**
198
+ * 获取setNewItemId前后映射关系
199
+ * @param oldId 原组件ID
200
+ * @returns 新旧ID映射
201
+ */
202
+ getRelateIdMap() {
203
+ return this.state.relateIdMap;
204
+ }
205
+ /**
206
+ * 记录setNewItemId前后映射关系
207
+ * @param oldId 原组件ID
208
+ * @param newId 分配的新ID
209
+ */
210
+ setRelateId(oldId, newId) {
211
+ this.state.relateIdMap[oldId] = newId;
212
+ }
213
+ };
214
+ var props_default = new Props();
215
+ //#endregion
216
+ export { props_default as default };
@@ -0,0 +1,161 @@
1
+ import BaseService_default from "./BaseService.js";
2
+ import editor_default from "./editor.js";
3
+ import { useStage } from "../hooks/use-stage.js";
4
+ import { getIdFromEl } from "@tmagic/utils";
5
+ import { shallowReactive } from "vue";
6
+ //#region packages/editor/src/services/stageOverlay.ts
7
+ var canUsePluginMethods = {
8
+ async: [],
9
+ sync: [
10
+ "openOverlay",
11
+ "closeOverlay",
12
+ "updateOverlay",
13
+ "createStage"
14
+ ]
15
+ };
16
+ var StageOverlay = class extends BaseService_default {
17
+ state = shallowReactive({
18
+ wrapDiv: document.createElement("div"),
19
+ sourceEl: null,
20
+ contentEl: null,
21
+ stage: null,
22
+ stageOptions: null,
23
+ wrapWidth: 0,
24
+ wrapHeight: 0,
25
+ stageOverlayVisible: false
26
+ });
27
+ constructor() {
28
+ super(canUsePluginMethods.sync.map((methodName) => ({
29
+ name: methodName,
30
+ isAsync: false
31
+ })));
32
+ this.get("wrapDiv").classList.add("tmagic-editor-sub-stage-wrap");
33
+ }
34
+ get(name) {
35
+ return this.state[name];
36
+ }
37
+ set(name, value) {
38
+ this.state[name] = value;
39
+ }
40
+ openOverlay(el) {
41
+ const stageOptions = this.get("stageOptions");
42
+ if (!el || !stageOptions) return;
43
+ this.set("sourceEl", el);
44
+ this.createContentEl();
45
+ this.set("stageOverlayVisible", true);
46
+ editor_default.on("update", this.updateHandler);
47
+ editor_default.on("add", this.addHandler);
48
+ editor_default.on("remove", this.removeHandler);
49
+ editor_default.on("drag-to", this.updateHandler);
50
+ editor_default.on("move-layer", this.updateHandler);
51
+ }
52
+ closeOverlay() {
53
+ this.set("stageOverlayVisible", false);
54
+ const subStage = this.get("stage");
55
+ const wrapDiv = this.get("wrapDiv");
56
+ subStage?.destroy();
57
+ for (let i = 0, l = wrapDiv.children.length; i < l; i++) wrapDiv.children[i].remove();
58
+ wrapDiv.remove();
59
+ this.set("stage", null);
60
+ this.set("sourceEl", null);
61
+ this.set("contentEl", null);
62
+ editor_default.off("update", this.updateHandler);
63
+ editor_default.off("add", this.addHandler);
64
+ editor_default.off("remove", this.removeHandler);
65
+ editor_default.off("drag-to", this.updateHandler);
66
+ editor_default.off("move-layer", this.updateHandler);
67
+ }
68
+ updateOverlay() {
69
+ const sourceEl = this.get("sourceEl");
70
+ if (!sourceEl) return;
71
+ const { scrollWidth, scrollHeight } = sourceEl;
72
+ this.set("wrapWidth", scrollWidth);
73
+ this.set("wrapHeight", scrollHeight);
74
+ }
75
+ createStage(stageOptions = {}) {
76
+ return useStage({
77
+ ...stageOptions,
78
+ runtimeUrl: "",
79
+ autoScrollIntoView: false,
80
+ disabledRule: true,
81
+ render: async (stage) => {
82
+ this.copyDocumentElement();
83
+ const rootEls = stage.renderer?.getDocument()?.body.children;
84
+ if (rootEls) Array.from(rootEls).forEach((element) => {
85
+ if (["SCRIPT", "STYLE"].includes(element.tagName)) return;
86
+ element.remove();
87
+ });
88
+ const wrapDiv = this.get("wrapDiv");
89
+ await this.render();
90
+ return wrapDiv;
91
+ }
92
+ });
93
+ }
94
+ usePlugin(options) {
95
+ super.usePlugin(options);
96
+ }
97
+ createContentEl() {
98
+ const sourceEl = this.get("sourceEl");
99
+ if (!sourceEl) return;
100
+ const contentEl = sourceEl.cloneNode(true);
101
+ this.set("contentEl", contentEl);
102
+ contentEl.style.position = "static";
103
+ contentEl.style.overflow = "visible";
104
+ }
105
+ copyDocumentElement() {
106
+ const subStage = this.get("stage");
107
+ const stage = editor_default.get("stage");
108
+ const doc = subStage?.renderer?.getDocument();
109
+ const documentElement = stage?.renderer?.getDocument()?.documentElement;
110
+ if (doc && documentElement) doc.replaceChild(documentElement.cloneNode(true), doc.documentElement);
111
+ }
112
+ async render() {
113
+ this.createContentEl();
114
+ const contentEl = this.get("contentEl");
115
+ const sourceEl = this.get("sourceEl");
116
+ const wrapDiv = this.get("wrapDiv");
117
+ const subStage = this.get("stage");
118
+ const stageOptions = this.get("stageOptions");
119
+ if (!contentEl) return;
120
+ wrapDiv.style.cssText = `
121
+ width: ${sourceEl?.scrollWidth}px;
122
+ height: ${sourceEl?.scrollHeight}px;
123
+ background-color: #fff;
124
+ `;
125
+ for (let i = 0, l = wrapDiv.children.length; i < l; i++) wrapDiv.children[i].remove();
126
+ wrapDiv.appendChild(contentEl);
127
+ setTimeout(() => {
128
+ subStage?.renderer?.contentWindow?.magic.onPageElUpdate(wrapDiv);
129
+ });
130
+ if (await stageOptions?.canSelect?.(contentEl)) {
131
+ const id = getIdFromEl()(contentEl);
132
+ id && subStage?.select(id);
133
+ }
134
+ }
135
+ updateHandler = () => {
136
+ setTimeout(() => {
137
+ this.render();
138
+ this.updateOverlay();
139
+ this.updateSelectStatus();
140
+ });
141
+ };
142
+ addHandler = () => {
143
+ this.render();
144
+ this.updateOverlay();
145
+ this.updateSelectStatus();
146
+ };
147
+ removeHandler = () => {
148
+ this.render();
149
+ this.updateOverlay();
150
+ this.updateSelectStatus();
151
+ };
152
+ updateSelectStatus() {
153
+ const subStage = this.get("stage");
154
+ const nodes = editor_default.get("nodes");
155
+ if (nodes.length > 1) subStage?.multiSelect(nodes.map((n) => n.id));
156
+ else subStage?.select(nodes[0].id);
157
+ }
158
+ };
159
+ var stageOverlay_default = new StageOverlay();
160
+ //#endregion
161
+ export { stageOverlay_default as default };