@tmagic/editor 1.1.0-beta.1 → 1.1.0-beta.10
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.
- package/dist/style.css +5 -1
- package/dist/{tmagic-editor.es.js → tmagic-editor.mjs} +1405 -1190
- package/dist/tmagic-editor.mjs.map +1 -0
- package/dist/tmagic-editor.umd.js +1420 -1204
- package/dist/tmagic-editor.umd.js.map +1 -1
- package/package.json +21 -19
- package/src/Editor.vue +23 -15
- package/src/components/ContentMenu.vue +87 -99
- package/src/components/Icon.vue +1 -1
- package/src/components/ScrollViewer.vue +2 -2
- package/src/components/ToolButton.vue +150 -167
- package/src/fields/UISelect.vue +49 -70
- package/src/index.ts +2 -1
- package/src/layouts/AddPageBox.vue +2 -2
- package/src/layouts/Framework.vue +1 -1
- package/src/layouts/NavMenu.vue +2 -2
- package/src/layouts/PropsPanel.vue +1 -1
- package/src/layouts/Resizer.vue +1 -1
- package/src/layouts/sidebar/ComponentListPanel.vue +6 -17
- package/src/layouts/sidebar/LayerMenu.vue +2 -2
- package/src/layouts/sidebar/LayerPanel.vue +13 -4
- package/src/layouts/sidebar/Sidebar.vue +1 -1
- package/src/layouts/sidebar/TabPane.vue +2 -2
- package/src/layouts/workspace/PageBar.vue +63 -192
- package/src/layouts/workspace/PageBarScrollContainer.vue +111 -0
- package/src/layouts/workspace/Stage.vue +198 -219
- package/src/layouts/workspace/ViewerMenu.vue +140 -147
- package/src/layouts/workspace/Workspace.vue +11 -11
- package/src/services/BaseService.ts +5 -10
- package/src/services/componentList.ts +3 -3
- package/src/services/editor.ts +197 -147
- package/src/services/events.ts +1 -1
- package/src/services/history.ts +1 -1
- package/src/services/props.ts +63 -11
- package/src/services/storage.ts +133 -0
- package/src/services/ui.ts +10 -4
- package/src/theme/component-list-panel.scss +5 -0
- package/src/theme/framework.scss +1 -1
- package/src/theme/stage.scss +2 -2
- package/src/type.ts +25 -7
- package/src/utils/config.ts +1 -1
- package/src/utils/editor.ts +20 -12
- package/src/utils/operator.ts +109 -0
- package/src/utils/props.ts +2 -24
- package/src/utils/scroll-viewer.ts +1 -1
- package/tsconfig.build.json +13 -0
- package/{dist/types/src → types}/Editor.vue.d.ts +17 -9
- package/types/components/ContentMenu.vue.d.ts +116 -0
- package/types/components/Icon.vue.d.ts +13 -0
- package/types/components/ScrollViewer.vue.d.ts +22 -0
- package/types/components/ToolButton.vue.d.ts +109 -0
- package/types/fields/Code.vue.d.ts +23 -0
- package/{dist/types/src → types}/fields/CodeLink.vue.d.ts +4 -6
- package/types/fields/UISelect.vue.d.ts +83 -0
- package/{dist/types/src → types}/index.d.ts +4 -1
- package/types/layouts/AddPageBox.vue.d.ts +4 -0
- package/{dist/types/src → types}/layouts/CodeEditor.vue.d.ts +11 -13
- package/types/layouts/Framework.vue.d.ts +22 -0
- package/types/layouts/NavMenu.vue.d.ts +25 -0
- package/types/layouts/PropsPanel.vue.d.ts +245 -0
- package/types/layouts/Resizer.vue.d.ts +12 -0
- package/types/layouts/sidebar/ComponentListPanel.vue.d.ts +14 -0
- package/types/layouts/sidebar/LayerMenu.vue.d.ts +100 -0
- package/types/layouts/sidebar/LayerPanel.vue.d.ts +1099 -0
- package/{dist/types/src → types}/layouts/sidebar/Sidebar.vue.d.ts +3 -5
- package/types/layouts/sidebar/TabPane.vue.d.ts +14 -0
- package/types/layouts/workspace/PageBar.vue.d.ts +54 -0
- package/types/layouts/workspace/PageBarScrollContainer.vue.d.ts +48 -0
- package/types/layouts/workspace/Stage.vue.d.ts +46 -0
- package/types/layouts/workspace/ViewerMenu.vue.d.ts +88 -0
- package/types/layouts/workspace/Workspace.vue.d.ts +6 -0
- package/{dist/types/src → types}/services/BaseService.d.ts +0 -0
- package/types/services/componentList.d.ts +14 -0
- package/{dist/types/src → types}/services/editor.d.ts +21 -14
- package/{dist/types/src → types}/services/events.d.ts +0 -0
- package/{dist/types/src → types}/services/history.d.ts +0 -0
- package/{dist/types/src → types}/services/props.d.ts +26 -2
- package/types/services/storage.d.ts +56 -0
- package/{dist/types/src → types}/services/ui.d.ts +1 -1
- package/{dist/types/src → types}/type.d.ts +18 -1
- package/{dist/types/src → types}/utils/compose.d.ts +1 -1
- package/{dist/types/src → types}/utils/config.d.ts +0 -0
- package/{dist/types/src → types}/utils/editor.d.ts +6 -3
- package/{dist/types/src → types}/utils/index.d.ts +0 -0
- package/{dist/types/src → types}/utils/logger.d.ts +0 -0
- package/types/utils/operator.d.ts +21 -0
- package/{dist/types/src → types}/utils/polyfills.d.ts +0 -0
- package/{dist/types/src → types}/utils/props.d.ts +2 -22
- package/{dist/types/src → types}/utils/scroll-viewer.d.ts +0 -0
- package/{dist/types/src → types}/utils/undo-redo.d.ts +0 -0
- package/dist/tmagic-editor.es.js.map +0 -1
- package/dist/types/src/components/Icon.vue.d.ts +0 -14
- package/dist/types/src/components/ScrollViewer.vue.d.ts +0 -24
- package/dist/types/src/fields/Code.vue.d.ts +0 -25
- package/dist/types/src/layouts/AddPageBox.vue.d.ts +0 -5
- package/dist/types/src/layouts/Framework.vue.d.ts +0 -24
- package/dist/types/src/layouts/NavMenu.vue.d.ts +0 -27
- package/dist/types/src/layouts/PropsPanel.vue.d.ts +0 -13
- package/dist/types/src/layouts/Resizer.vue.d.ts +0 -14
- package/dist/types/src/layouts/sidebar/ComponentListPanel.vue.d.ts +0 -16
- package/dist/types/src/layouts/sidebar/TabPane.vue.d.ts +0 -16
- package/dist/types/src/layouts/workspace/Workspace.vue.d.ts +0 -8
- package/dist/types/src/shims-vue.d.ts +0 -6
- package/dist/types/src/vite-env.d.ts +0 -1
- package/src/vite-env.d.ts +0 -1
|
@@ -50,180 +50,163 @@
|
|
|
50
50
|
</div>
|
|
51
51
|
</template>
|
|
52
52
|
|
|
53
|
-
<script lang="ts">
|
|
54
|
-
import { computed,
|
|
53
|
+
<script lang="ts" setup>
|
|
54
|
+
import { computed, inject, markRaw, PropType } from 'vue';
|
|
55
55
|
import { ArrowDown, Back, Delete, Grid, Right, ScaleToOriginal, ZoomIn, ZoomOut } from '@element-plus/icons-vue';
|
|
56
56
|
|
|
57
57
|
import { NodeType } from '@tmagic/schema';
|
|
58
58
|
|
|
59
|
-
import MIcon from '
|
|
60
|
-
import type { MenuButton, MenuComponent, MenuItem, Services } from '
|
|
59
|
+
import MIcon from '../components/Icon.vue';
|
|
60
|
+
import type { MenuButton, MenuComponent, MenuItem, Services } from '../type';
|
|
61
|
+
|
|
62
|
+
const props = defineProps({
|
|
63
|
+
data: {
|
|
64
|
+
type: [Object, String] as PropType<MenuItem | string>,
|
|
65
|
+
require: true,
|
|
66
|
+
default: () => ({
|
|
67
|
+
type: 'text',
|
|
68
|
+
display: false,
|
|
69
|
+
}),
|
|
70
|
+
},
|
|
61
71
|
|
|
62
|
-
|
|
63
|
-
|
|
72
|
+
eventType: {
|
|
73
|
+
type: String as PropType<'mousedown' | 'mouseup' | 'click'>,
|
|
74
|
+
default: 'click',
|
|
75
|
+
},
|
|
76
|
+
});
|
|
64
77
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
78
|
+
const services = inject<Services>('services');
|
|
79
|
+
const uiService = services?.uiService;
|
|
80
|
+
|
|
81
|
+
const zoom = computed((): number => uiService?.get<number>('zoom') ?? 1);
|
|
82
|
+
const showGuides = computed((): boolean => uiService?.get<boolean>('showGuides') ?? true);
|
|
83
|
+
const showRule = computed((): boolean => uiService?.get<boolean>('showRule') ?? true);
|
|
84
|
+
|
|
85
|
+
const zoomInHandler = () => uiService?.zoom(0.1);
|
|
86
|
+
const zoomOutHandler = () => uiService?.zoom(-0.1);
|
|
87
|
+
|
|
88
|
+
const item = computed((): MenuButton | MenuComponent => {
|
|
89
|
+
if (typeof props.data !== 'string') {
|
|
90
|
+
return props.data;
|
|
91
|
+
}
|
|
92
|
+
switch (props.data) {
|
|
93
|
+
case '/':
|
|
94
|
+
return {
|
|
95
|
+
type: 'divider',
|
|
96
|
+
};
|
|
97
|
+
case 'zoom':
|
|
98
|
+
return {
|
|
99
|
+
type: 'zoom',
|
|
100
|
+
};
|
|
101
|
+
case 'delete':
|
|
102
|
+
return {
|
|
103
|
+
type: 'button',
|
|
104
|
+
icon: markRaw(Delete),
|
|
105
|
+
tooltip: '刪除',
|
|
106
|
+
disabled: () => services?.editorService.get('node')?.type === NodeType.PAGE,
|
|
107
|
+
handler: () => services?.editorService.remove(services?.editorService.get('node')),
|
|
108
|
+
};
|
|
109
|
+
case 'undo':
|
|
110
|
+
return {
|
|
111
|
+
type: 'button',
|
|
112
|
+
icon: markRaw(Back),
|
|
113
|
+
tooltip: '后退',
|
|
114
|
+
disabled: () => !services?.historyService.state.canUndo,
|
|
115
|
+
handler: () => services?.editorService.undo(),
|
|
116
|
+
};
|
|
117
|
+
case 'redo':
|
|
118
|
+
return {
|
|
119
|
+
type: 'button',
|
|
120
|
+
icon: markRaw(Right),
|
|
121
|
+
tooltip: '前进',
|
|
122
|
+
disabled: () => !services?.historyService.state.canRedo,
|
|
123
|
+
handler: () => services?.editorService.redo(),
|
|
124
|
+
};
|
|
125
|
+
case 'zoom-in':
|
|
126
|
+
return {
|
|
127
|
+
type: 'button',
|
|
128
|
+
icon: markRaw(ZoomIn),
|
|
129
|
+
tooltip: '放大',
|
|
130
|
+
handler: zoomInHandler,
|
|
131
|
+
};
|
|
132
|
+
case 'zoom-out':
|
|
133
|
+
return {
|
|
134
|
+
type: 'button',
|
|
135
|
+
icon: markRaw(ZoomOut),
|
|
136
|
+
tooltip: '縮小',
|
|
137
|
+
handler: zoomOutHandler,
|
|
138
|
+
};
|
|
139
|
+
case 'rule':
|
|
140
|
+
return {
|
|
141
|
+
type: 'button',
|
|
142
|
+
icon: markRaw(ScaleToOriginal),
|
|
143
|
+
tooltip: showRule.value ? '隐藏标尺' : '显示标尺',
|
|
144
|
+
handler: () => uiService?.set('showRule', !showRule.value),
|
|
145
|
+
};
|
|
146
|
+
case 'guides':
|
|
147
|
+
return {
|
|
148
|
+
type: 'button',
|
|
149
|
+
icon: markRaw(Grid),
|
|
150
|
+
tooltip: showGuides.value ? '隐藏参考线' : '显示参考线',
|
|
151
|
+
handler: () => uiService?.set('showGuides', !showGuides.value),
|
|
152
|
+
};
|
|
153
|
+
default:
|
|
154
|
+
return {
|
|
70
155
|
type: 'text',
|
|
71
|
-
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
eventType: {
|
|
76
|
-
type: String as PropType<'mousedown' | 'mouseup' | 'click'>,
|
|
77
|
-
default: 'click',
|
|
78
|
-
},
|
|
79
|
-
},
|
|
156
|
+
text: props.data,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
});
|
|
80
160
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
};
|
|
105
|
-
case 'delete':
|
|
106
|
-
return {
|
|
107
|
-
type: 'button',
|
|
108
|
-
icon: markRaw(Delete),
|
|
109
|
-
tooltip: '刪除',
|
|
110
|
-
disabled: () => services?.editorService.get('node')?.type === NodeType.PAGE,
|
|
111
|
-
handler: () => services?.editorService.remove(services?.editorService.get('node')),
|
|
112
|
-
};
|
|
113
|
-
case 'undo':
|
|
114
|
-
return {
|
|
115
|
-
type: 'button',
|
|
116
|
-
icon: markRaw(Back),
|
|
117
|
-
tooltip: '后退',
|
|
118
|
-
disabled: () => !services?.historyService.state.canUndo,
|
|
119
|
-
handler: () => services?.editorService.undo(),
|
|
120
|
-
};
|
|
121
|
-
case 'redo':
|
|
122
|
-
return {
|
|
123
|
-
type: 'button',
|
|
124
|
-
icon: markRaw(Right),
|
|
125
|
-
tooltip: '前进',
|
|
126
|
-
disabled: () => !services?.historyService.state.canRedo,
|
|
127
|
-
handler: () => services?.editorService.redo(),
|
|
128
|
-
};
|
|
129
|
-
case 'zoom-in':
|
|
130
|
-
return {
|
|
131
|
-
type: 'button',
|
|
132
|
-
icon: markRaw(ZoomIn),
|
|
133
|
-
tooltip: '放大',
|
|
134
|
-
handler: zoomInHandler,
|
|
135
|
-
};
|
|
136
|
-
case 'zoom-out':
|
|
137
|
-
return {
|
|
138
|
-
type: 'button',
|
|
139
|
-
icon: markRaw(ZoomOut),
|
|
140
|
-
tooltip: '縮小',
|
|
141
|
-
handler: zoomOutHandler,
|
|
142
|
-
};
|
|
143
|
-
case 'rule':
|
|
144
|
-
return {
|
|
145
|
-
type: 'button',
|
|
146
|
-
icon: markRaw(ScaleToOriginal),
|
|
147
|
-
tooltip: showRule.value ? '隐藏标尺' : '显示标尺',
|
|
148
|
-
handler: () => uiService?.set('showRule', !showRule.value),
|
|
149
|
-
};
|
|
150
|
-
case 'guides':
|
|
151
|
-
return {
|
|
152
|
-
type: 'button',
|
|
153
|
-
icon: markRaw(Grid),
|
|
154
|
-
tooltip: showGuides.value ? '隐藏参考线' : '显示参考线',
|
|
155
|
-
handler: () => uiService?.set('showGuides', !showGuides.value),
|
|
156
|
-
};
|
|
157
|
-
default:
|
|
158
|
-
return {
|
|
159
|
-
type: 'text',
|
|
160
|
-
text: props.data,
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
const disabled = computed(() => {
|
|
166
|
-
if (typeof item.value === 'string') return false;
|
|
167
|
-
if (item.value.type === 'component') return false;
|
|
168
|
-
if (typeof item.value.disabled === 'function') {
|
|
169
|
-
return item.value.disabled(services);
|
|
170
|
-
}
|
|
171
|
-
return item.value.disabled;
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
const buttonHandler = (item: MenuButton | MenuComponent, event: MouseEvent) => {
|
|
175
|
-
if (disabled.value) return;
|
|
176
|
-
if (typeof (item as MenuButton).handler === 'function' && services) {
|
|
177
|
-
(item as MenuButton).handler?.(services, event);
|
|
178
|
-
}
|
|
179
|
-
};
|
|
180
|
-
|
|
181
|
-
return {
|
|
182
|
-
ZoomIn: markRaw(ZoomIn),
|
|
183
|
-
ZoomOut: markRaw(ZoomOut),
|
|
184
|
-
|
|
185
|
-
item,
|
|
186
|
-
zoom,
|
|
187
|
-
disabled,
|
|
188
|
-
display: computed(() => {
|
|
189
|
-
if (!item.value) return false;
|
|
190
|
-
if (typeof item.value === 'string') return true;
|
|
191
|
-
if (typeof item.value.display === 'function') {
|
|
192
|
-
return item.value.display(services);
|
|
193
|
-
}
|
|
194
|
-
return item.value.display ?? true;
|
|
195
|
-
}),
|
|
196
|
-
|
|
197
|
-
zoomInHandler,
|
|
198
|
-
zoomOutHandler,
|
|
199
|
-
|
|
200
|
-
dropdownHandler(command: any) {
|
|
201
|
-
if (command.item.handler) {
|
|
202
|
-
command.item.handler(services);
|
|
203
|
-
}
|
|
204
|
-
},
|
|
205
|
-
|
|
206
|
-
clickHandler(item: MenuButton | MenuComponent, event: MouseEvent) {
|
|
207
|
-
if (props.eventType !== 'click') return;
|
|
208
|
-
if (item.type === 'button') {
|
|
209
|
-
buttonHandler(item, event);
|
|
210
|
-
}
|
|
211
|
-
},
|
|
212
|
-
|
|
213
|
-
mousedownHandler(item: MenuButton | MenuComponent, event: MouseEvent) {
|
|
214
|
-
if (props.eventType !== 'mousedown') return;
|
|
215
|
-
if (item.type === 'button') {
|
|
216
|
-
buttonHandler(item, event);
|
|
217
|
-
}
|
|
218
|
-
},
|
|
219
|
-
|
|
220
|
-
mouseupHandler(item: MenuButton | MenuComponent, event: MouseEvent) {
|
|
221
|
-
if (props.eventType !== 'mouseup') return;
|
|
222
|
-
if (item.type === 'button') {
|
|
223
|
-
buttonHandler(item, event);
|
|
224
|
-
}
|
|
225
|
-
},
|
|
226
|
-
};
|
|
227
|
-
},
|
|
161
|
+
const disabled = computed(() => {
|
|
162
|
+
if (typeof item.value === 'string') return false;
|
|
163
|
+
if (item.value.type === 'component') return false;
|
|
164
|
+
if (typeof item.value.disabled === 'function') {
|
|
165
|
+
return item.value.disabled(services);
|
|
166
|
+
}
|
|
167
|
+
return item.value.disabled;
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
const buttonHandler = (item: MenuButton | MenuComponent, event: MouseEvent) => {
|
|
171
|
+
if (disabled.value) return;
|
|
172
|
+
if (typeof (item as MenuButton).handler === 'function' && services) {
|
|
173
|
+
(item as MenuButton).handler?.(services, event);
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
const display = computed(() => {
|
|
178
|
+
if (!item.value) return false;
|
|
179
|
+
if (typeof item.value === 'string') return true;
|
|
180
|
+
if (typeof item.value.display === 'function') {
|
|
181
|
+
return item.value.display(services);
|
|
182
|
+
}
|
|
183
|
+
return item.value.display ?? true;
|
|
228
184
|
});
|
|
185
|
+
|
|
186
|
+
const dropdownHandler = (command: any) => {
|
|
187
|
+
if (command.item.handler) {
|
|
188
|
+
command.item.handler(services);
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
const clickHandler = (item: MenuButton | MenuComponent, event: MouseEvent) => {
|
|
193
|
+
if (props.eventType !== 'click') return;
|
|
194
|
+
if (item.type === 'button') {
|
|
195
|
+
buttonHandler(item, event);
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
const mousedownHandler = (item: MenuButton | MenuComponent, event: MouseEvent) => {
|
|
200
|
+
if (props.eventType !== 'mousedown') return;
|
|
201
|
+
if (item.type === 'button') {
|
|
202
|
+
buttonHandler(item, event);
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
const mouseupHandler = (item: MenuButton | MenuComponent, event: MouseEvent) => {
|
|
207
|
+
if (props.eventType !== 'mouseup') return;
|
|
208
|
+
if (item.type === 'button') {
|
|
209
|
+
buttonHandler(item, event);
|
|
210
|
+
}
|
|
211
|
+
};
|
|
229
212
|
</script>
|
package/src/fields/UISelect.vue
CHANGED
|
@@ -12,89 +12,68 @@
|
|
|
12
12
|
</div>
|
|
13
13
|
</template>
|
|
14
14
|
|
|
15
|
-
<script lang="ts">
|
|
16
|
-
import { computed,
|
|
17
|
-
import { Close, Delete
|
|
15
|
+
<script lang="ts" setup>
|
|
16
|
+
import { computed, inject, ref } from 'vue';
|
|
17
|
+
import { Close, Delete } from '@element-plus/icons-vue';
|
|
18
18
|
|
|
19
19
|
import { FormState } from '@tmagic/form';
|
|
20
20
|
|
|
21
|
-
import { Services } from '
|
|
21
|
+
import { Services } from '../type';
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
const props = defineProps<{
|
|
24
|
+
config: any;
|
|
25
|
+
model: any;
|
|
26
|
+
prop: string;
|
|
27
|
+
name: string;
|
|
28
|
+
}>();
|
|
25
29
|
|
|
26
|
-
|
|
27
|
-
labelWidth: String,
|
|
28
|
-
config: Object,
|
|
29
|
-
model: Object,
|
|
30
|
-
prop: {
|
|
31
|
-
type: String,
|
|
32
|
-
default() {
|
|
33
|
-
return '';
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
name: String,
|
|
37
|
-
},
|
|
30
|
+
const emit = defineEmits(['change']);
|
|
38
31
|
|
|
39
|
-
|
|
32
|
+
const services = inject<Services>('services');
|
|
33
|
+
const mForm = inject<FormState>('mForm');
|
|
34
|
+
const val = computed(() => props.model[props.name]);
|
|
35
|
+
const uiSelectMode = ref(false);
|
|
40
36
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
37
|
+
const cancelHandler = () => {
|
|
38
|
+
if (!services?.uiService) return;
|
|
39
|
+
services.uiService.set<boolean>('uiSelectMode', false);
|
|
40
|
+
uiSelectMode.value = false;
|
|
41
|
+
globalThis.document.removeEventListener('ui-select', clickHandler as EventListener);
|
|
42
|
+
};
|
|
46
43
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const clickHandler = ({ detail }: Event & { detail: any }) => {
|
|
55
|
-
if (detail.id) {
|
|
56
|
-
props.model[props.name] = detail.id;
|
|
57
|
-
emit('change', detail.id);
|
|
58
|
-
mForm?.$emit('field-change', props.prop, detail.id);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if (cancelHandler) {
|
|
62
|
-
cancelHandler();
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
return {
|
|
67
|
-
Delete: markRaw(Delete),
|
|
68
|
-
Pointer: markRaw(Pointer),
|
|
69
|
-
Close: markRaw(Close),
|
|
44
|
+
const clickHandler = ({ detail }: Event & { detail: any }) => {
|
|
45
|
+
if (detail.id) {
|
|
46
|
+
props.model[props.name] = detail.id;
|
|
47
|
+
emit('change', detail.id);
|
|
48
|
+
mForm?.$emit('field-change', props.prop, detail.id);
|
|
49
|
+
}
|
|
70
50
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
return config?.name || '';
|
|
76
|
-
}),
|
|
51
|
+
if (cancelHandler) {
|
|
52
|
+
cancelHandler();
|
|
53
|
+
}
|
|
54
|
+
};
|
|
77
55
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
globalThis.document.addEventListener('ui-select', clickHandler as EventListener);
|
|
83
|
-
},
|
|
56
|
+
const toName = computed(() => {
|
|
57
|
+
const config = services?.editorService.getNodeById(val.value);
|
|
58
|
+
return config?.name || '';
|
|
59
|
+
});
|
|
84
60
|
|
|
85
|
-
|
|
61
|
+
const startSelect = () => {
|
|
62
|
+
if (!services?.uiService) return;
|
|
63
|
+
services.uiService.set<boolean>('uiSelectMode', true);
|
|
64
|
+
uiSelectMode.value = true;
|
|
65
|
+
globalThis.document.addEventListener('ui-select', clickHandler as EventListener);
|
|
66
|
+
};
|
|
86
67
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
};
|
|
95
|
-
},
|
|
96
|
-
});
|
|
68
|
+
const deleteHandler = () => {
|
|
69
|
+
if (props.model) {
|
|
70
|
+
props.model[props.name] = '';
|
|
71
|
+
emit('change', '');
|
|
72
|
+
mForm?.$emit('field-change', props.prop, '');
|
|
73
|
+
}
|
|
74
|
+
};
|
|
97
75
|
</script>
|
|
76
|
+
|
|
98
77
|
<style lang="scss">
|
|
99
78
|
.m-fields-ui-select {
|
|
100
79
|
cursor: pointer;
|
package/src/index.ts
CHANGED
|
@@ -37,6 +37,7 @@ export { default as TMagicCodeEditor } from './layouts/CodeEditor.vue';
|
|
|
37
37
|
export { default as editorService } from './services/editor';
|
|
38
38
|
export { default as propsService } from './services/props';
|
|
39
39
|
export { default as historyService } from './services/history';
|
|
40
|
+
export { default as storageService } from './services/storage';
|
|
40
41
|
export { default as eventsService } from './services/events';
|
|
41
42
|
export { default as uiService } from './services/ui';
|
|
42
43
|
export { default as ComponentListPanel } from './layouts/sidebar/ComponentListPanel.vue';
|
|
@@ -57,7 +58,7 @@ export default {
|
|
|
57
58
|
setConfig(option);
|
|
58
59
|
|
|
59
60
|
app.component(Editor.name, Editor);
|
|
60
|
-
app.component(
|
|
61
|
+
app.component('m-fields-ui-select', uiSelect);
|
|
61
62
|
app.component(CodeLink.name, CodeLink);
|
|
62
63
|
app.component(Code.name, Code);
|
|
63
64
|
app.component(CodeEditor.name, CodeEditor);
|
|
@@ -17,8 +17,8 @@ import { Plus } from '@element-plus/icons-vue';
|
|
|
17
17
|
|
|
18
18
|
import { NodeType } from '@tmagic/schema';
|
|
19
19
|
|
|
20
|
-
import type { Services } from '
|
|
21
|
-
import { generatePageNameByApp } from '
|
|
20
|
+
import type { Services } from '../type';
|
|
21
|
+
import { generatePageNameByApp } from '../utils';
|
|
22
22
|
|
|
23
23
|
export default defineComponent({
|
|
24
24
|
components: { Plus },
|
|
@@ -43,7 +43,7 @@ import { computed, defineComponent, inject } from 'vue';
|
|
|
43
43
|
|
|
44
44
|
import type { MApp } from '@tmagic/schema';
|
|
45
45
|
|
|
46
|
-
import { GetColumnWidth, Services } from '
|
|
46
|
+
import { GetColumnWidth, Services } from '../type';
|
|
47
47
|
|
|
48
48
|
import AddPageBox from './AddPageBox.vue';
|
|
49
49
|
import Resizer from './Resizer.vue';
|
package/src/layouts/NavMenu.vue
CHANGED
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
<script lang="ts">
|
|
10
10
|
import { computed, defineComponent, inject, PropType } from 'vue';
|
|
11
11
|
|
|
12
|
-
import ToolButton from '
|
|
13
|
-
import { GetColumnWidth, MenuBarData, Services } from '
|
|
12
|
+
import ToolButton from '../components/ToolButton.vue';
|
|
13
|
+
import { GetColumnWidth, MenuBarData, Services } from '../type';
|
|
14
14
|
|
|
15
15
|
export default defineComponent({
|
|
16
16
|
name: 'nav-menu',
|
|
@@ -20,7 +20,7 @@ import { ElMessage } from 'element-plus';
|
|
|
20
20
|
import type { FormValue, MForm } from '@tmagic/form';
|
|
21
21
|
import type { MNode } from '@tmagic/schema';
|
|
22
22
|
|
|
23
|
-
import type { Services } from '
|
|
23
|
+
import type { Services } from '../type';
|
|
24
24
|
|
|
25
25
|
export default defineComponent({
|
|
26
26
|
name: 'm-editor-props-panel',
|
package/src/layouts/Resizer.vue
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import { defineComponent, inject, onMounted, onUnmounted, ref, toRaw } from 'vue';
|
|
9
9
|
import Gesto from 'gesto';
|
|
10
10
|
|
|
11
|
-
import { Services } from '
|
|
11
|
+
import { Services } from '../type';
|
|
12
12
|
|
|
13
13
|
export default defineComponent({
|
|
14
14
|
name: 'm-editor-resize',
|
|
@@ -41,11 +41,10 @@ import { computed, defineComponent, inject, ref } from 'vue';
|
|
|
41
41
|
import serialize from 'serialize-javascript';
|
|
42
42
|
|
|
43
43
|
import type StageCore from '@tmagic/stage';
|
|
44
|
-
import {
|
|
45
|
-
import { addClassName, removeClassNameByClassName } from '@tmagic/utils';
|
|
44
|
+
import { removeClassNameByClassName } from '@tmagic/utils';
|
|
46
45
|
|
|
47
|
-
import MIcon from '
|
|
48
|
-
import type { ComponentGroup, ComponentItem, Services, StageOptions } from '
|
|
46
|
+
import MIcon from '../../components/Icon.vue';
|
|
47
|
+
import type { ComponentGroup, ComponentItem, Services, StageOptions } from '../../type';
|
|
49
48
|
|
|
50
49
|
export default defineComponent({
|
|
51
50
|
name: 'ui-component-panel',
|
|
@@ -125,19 +124,9 @@ export default defineComponent({
|
|
|
125
124
|
return;
|
|
126
125
|
}
|
|
127
126
|
|
|
128
|
-
if (timeout) return;
|
|
129
|
-
|
|
130
|
-
timeout =
|
|
131
|
-
if (!stageOptions || !stage.value) return;
|
|
132
|
-
const doc = stage.value.renderer.contentWindow?.document;
|
|
133
|
-
const els = stage.value.getElementsFromPoint(e);
|
|
134
|
-
for (const el of els) {
|
|
135
|
-
if (doc && !el.id.startsWith(GHOST_EL_ID_PREFIX) && (await stageOptions.isContainer(el))) {
|
|
136
|
-
addClassName(el, doc, stageOptions?.containerHighlightClassName);
|
|
137
|
-
break;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}, stageOptions?.containerHighlightDuration);
|
|
127
|
+
if (timeout || !stage.value) return;
|
|
128
|
+
|
|
129
|
+
timeout = stage.value.getAddContainerHighlightClassNameTimeout(e);
|
|
141
130
|
},
|
|
142
131
|
};
|
|
143
132
|
},
|
|
@@ -8,8 +8,8 @@ import { Delete, DocumentCopy, Files, Plus } from '@element-plus/icons-vue';
|
|
|
8
8
|
|
|
9
9
|
import { NodeType } from '@tmagic/schema';
|
|
10
10
|
|
|
11
|
-
import ContentMenu from '
|
|
12
|
-
import type { ComponentGroup, MenuButton, MenuItem, Services } from '
|
|
11
|
+
import ContentMenu from '../../components/ContentMenu.vue';
|
|
12
|
+
import type { ComponentGroup, MenuButton, MenuItem, Services } from '../../type';
|
|
13
13
|
|
|
14
14
|
export default defineComponent({
|
|
15
15
|
components: { ContentMenu },
|
|
@@ -61,11 +61,12 @@ import type { ElTree } from 'element-plus';
|
|
|
61
61
|
import { throttle } from 'lodash-es';
|
|
62
62
|
|
|
63
63
|
import type { MNode, MPage } from '@tmagic/schema';
|
|
64
|
-
import { NodeType } from '@tmagic/schema';
|
|
64
|
+
import { MContainer, NodeType } from '@tmagic/schema';
|
|
65
65
|
import StageCore from '@tmagic/stage';
|
|
66
66
|
|
|
67
|
-
import type { EditorService } from '
|
|
68
|
-
import type { Services } from '
|
|
67
|
+
import type { EditorService } from '../../services/editor';
|
|
68
|
+
import type { Services } from '../../type';
|
|
69
|
+
import { Layout } from '../../type';
|
|
69
70
|
|
|
70
71
|
import LayerMenu from './LayerMenu.vue';
|
|
71
72
|
|
|
@@ -104,8 +105,16 @@ const useDrop = (tree: Ref<InstanceType<typeof ElTree> | undefined>, editorServi
|
|
|
104
105
|
return false;
|
|
105
106
|
},
|
|
106
107
|
|
|
107
|
-
handleDragEnd() {
|
|
108
|
+
async handleDragEnd(e: any) {
|
|
108
109
|
if (!tree.value) return;
|
|
110
|
+
const { data: node } = e;
|
|
111
|
+
const parent = editorService?.getParentById(node.id, false) as MContainer;
|
|
112
|
+
const layout = await editorService?.getLayout(parent);
|
|
113
|
+
node.style.position = layout;
|
|
114
|
+
if (layout === Layout.RELATIVE) {
|
|
115
|
+
node.style.top = 0;
|
|
116
|
+
node.style.left = 0;
|
|
117
|
+
}
|
|
109
118
|
const { data } = tree.value;
|
|
110
119
|
const [page] = data as [MPage];
|
|
111
120
|
editorService?.update(page);
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
import { computed, defineComponent, PropType } from 'vue';
|
|
30
30
|
import { Coin, Files } from '@element-plus/icons-vue';
|
|
31
31
|
|
|
32
|
-
import MIcon from '
|
|
33
|
-
import { SideComponent, SideItem } from '
|
|
32
|
+
import MIcon from '../../components/Icon.vue';
|
|
33
|
+
import { SideComponent, SideItem } from '../../type';
|
|
34
34
|
|
|
35
35
|
import ComponentListPanel from './ComponentListPanel.vue';
|
|
36
36
|
import LayerPanel from './LayerPanel.vue';
|