@cicctencent/low-code-editor 0.0.0-stage → 1.1.9-beta.5
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/README.md +2 -2
- package/api-extractor.json +36 -0
- package/dist/ActivityBar/index.vue.d.ts +29 -0
- package/dist/ComponentTree/components/List.vue.d.ts +29 -0
- package/dist/ComponentTree/index.vue.d.ts +32 -0
- package/dist/DataSource/index.vue.d.ts +34 -0
- package/dist/HeaderBar/components/BarTooltip.vue.d.ts +37 -0
- package/dist/HeaderBar/index.vue.d.ts +49 -0
- package/dist/NavTree/index.vue.d.ts +48 -0
- package/dist/SchemaConfig/index.vue.d.ts +36 -0
- package/dist/SidebarPane/index.vue.d.ts +38 -0
- package/dist/components/ComponentTreeFavorites/components/List.vue.d.ts +41 -0
- package/dist/components/ComponentTreeFavorites/components/Tips.vue.d.ts +16 -0
- package/dist/components/ComponentTreeFavorites/index.vue.d.ts +44 -0
- package/dist/components/ImageGuide/index.vue.d.ts +45 -0
- package/dist/components.d.ts +7 -0
- package/dist/composables/useComponentTree.d.ts +13 -0
- package/dist/config/ace.config.d.ts +3 -0
- package/dist/domain/EditorDomain.d.ts +89 -0
- package/dist/editor.d.ts +286 -0
- package/dist/editor.vue.d.ts +104 -0
- package/dist/formily/ActivityBar/index.d.ts +4 -0
- package/dist/formily/ComponentTree/index.d.ts +4 -0
- package/dist/formily/DataBinding/index.d.ts +4 -0
- package/dist/formily/DataBinding/index.vue.d.ts +26 -0
- package/dist/formily/DataSource/index.d.ts +4 -0
- package/dist/formily/MenuTable/PageList.vue.d.ts +28 -0
- package/dist/formily/MenuTable/index.d.ts +4 -0
- package/dist/formily/MenuTable/index.vue.d.ts +30 -0
- package/dist/formily/MenuTable/useMenuTable.d.ts +227 -0
- package/dist/formily/NavTree/index.d.ts +4 -0
- package/dist/formily/SidebarPane/index.d.ts +4 -0
- package/dist/formily/index.d.ts +2 -0
- package/dist/index.css +1167 -0
- package/dist/index.d.ts +250 -0
- package/dist/index.js +34171 -0
- package/dist/utils/base64.d.ts +4 -0
- package/dist/utils/index.d.ts +27 -0
- package/package.json +58 -4
- package/rollup.config.js +3 -0
- package/src/ActivityBar/index.vue +71 -0
- package/src/ComponentTree/components/List.vue +310 -0
- package/src/ComponentTree/index.vue +77 -0
- package/src/DataSource/index.vue +640 -0
- package/src/HeaderBar/components/BarDialog.vue +43 -0
- package/src/HeaderBar/components/BarTooltip.vue +33 -0
- package/src/HeaderBar/index.vue +513 -0
- package/src/NavTree/index.vue +345 -0
- package/src/SchemaConfig/index.vue +150 -0
- package/src/SidebarPane/index.vue +199 -0
- package/src/SynBarComponent/index.vue +31 -0
- package/src/assets/font/NotoSansSC.ttf +0 -0
- package/src/assets/img/header/edit.png +0 -0
- package/src/assets/img/header/link.png +0 -0
- package/src/assets/img/header/link.svg +9 -0
- package/src/assets/img/header/preview.png +0 -0
- package/src/assets/img/header/preview.svg +9 -0
- package/src/assets/img/header/redo.svg +1 -0
- package/src/assets/img/header/undo.svg +1 -0
- package/src/assets/img/tool/all-select.svg +9 -0
- package/src/assets/img/tool/all.svg +9 -0
- package/src/assets/img/tool/collect.svg +6 -0
- package/src/assets/img/tool/collection-select.svg +3 -0
- package/src/assets/img/tool/collection-tag.svg +5 -0
- package/src/assets/img/tool/info.svg +4 -0
- package/src/assets/img/tool/union.svg +4 -0
- package/src/components/ComponentTreeFavorites/components/List.vue +452 -0
- package/src/components/ComponentTreeFavorites/components/Tips.vue +108 -0
- package/src/components/ComponentTreeFavorites/index.vue +180 -0
- package/src/components/ImageGuide/index.vue +100 -0
- package/src/components.ts +23 -0
- package/src/composables/useComponentTree.ts +38 -0
- package/src/config/ace.config.ts +22 -0
- package/src/domain/EditorDomain.ts +265 -0
- package/src/editor.ts +645 -0
- package/src/editor.vue +380 -0
- package/src/formily/ActivityBar/index.ts +23 -0
- package/src/formily/ActivityBar/index.vue +121 -0
- package/src/formily/ComponentTree/index.ts +22 -0
- package/src/formily/DataBinding/index.ts +22 -0
- package/src/formily/DataBinding/index.vue +285 -0
- package/src/formily/DataSource/index.ts +22 -0
- package/src/formily/MenuTable/PageList.vue +132 -0
- package/src/formily/MenuTable/index.ts +19 -0
- package/src/formily/MenuTable/index.vue +218 -0
- package/src/formily/MenuTable/useMenuTable.ts +147 -0
- package/src/formily/NavTree/index.ts +20 -0
- package/src/formily/SidebarPane/index.ts +23 -0
- package/src/formily/SidebarPane/index.vue +174 -0
- package/src/formily/index.ts +12 -0
- package/src/index.ts +29 -0
- package/src/typings/vue-shim.d.ts +13 -0
- package/src/utils/base64.ts +5 -0
- package/src/utils/index.ts +57 -0
- package/test/case.ts +67 -0
- package/test/utils/index.test.ts +27 -0
- package/tsconfig.json +8 -0
package/src/editor.ts
ADDED
|
@@ -0,0 +1,645 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ref,
|
|
3
|
+
reactive,
|
|
4
|
+
onMounted,
|
|
5
|
+
onUnmounted,
|
|
6
|
+
computed,
|
|
7
|
+
watch,
|
|
8
|
+
toRefs,
|
|
9
|
+
h,
|
|
10
|
+
provide,
|
|
11
|
+
readonly,
|
|
12
|
+
} from 'vue';
|
|
13
|
+
import PostMessage from '@jt/postmessage-channel';
|
|
14
|
+
import { ElMessage, ElMessageBox } from '@jt/jtui';
|
|
15
|
+
import EditorDomain, { EditorDomainState } from './domain/EditorDomain';
|
|
16
|
+
import {
|
|
17
|
+
CheckResponseItem,
|
|
18
|
+
LowCodeKey,
|
|
19
|
+
ConfirmMessageBoxData,
|
|
20
|
+
EditDialogRenderData,
|
|
21
|
+
SendReq,
|
|
22
|
+
} from '@jt/low-code-core';
|
|
23
|
+
import { VueForm } from '@jt/formily';
|
|
24
|
+
import { isEqual, toPlainObject } from '@jt/ark-util';
|
|
25
|
+
|
|
26
|
+
export default function (props, emits) {
|
|
27
|
+
const state = reactive<EditorDomainState>({
|
|
28
|
+
project: {}, // 当前project数据
|
|
29
|
+
config: null,
|
|
30
|
+
communicator: null,
|
|
31
|
+
request: props.request,
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const navTreeRef = ref(null);
|
|
35
|
+
const iframe = ref<HTMLIFrameElement>();
|
|
36
|
+
provide('iframe', readonly(iframe));
|
|
37
|
+
const iframeMaskFlag = ref<boolean>(false);
|
|
38
|
+
// 菜单数据
|
|
39
|
+
const menuData = ref([]);
|
|
40
|
+
|
|
41
|
+
// 图片导出指导
|
|
42
|
+
const guideVisible = ref<boolean>(false);
|
|
43
|
+
// 教程信息
|
|
44
|
+
const guideData = ref();
|
|
45
|
+
let editorDomain: EditorDomain = null;
|
|
46
|
+
const loading = ref(true);
|
|
47
|
+
|
|
48
|
+
const dialog = reactive<{
|
|
49
|
+
visible: boolean;
|
|
50
|
+
renderData: EditDialogRenderData;
|
|
51
|
+
}>({
|
|
52
|
+
visible: false,
|
|
53
|
+
renderData: {} as EditDialogRenderData,
|
|
54
|
+
});
|
|
55
|
+
// 活动的bar
|
|
56
|
+
const activeBarName = ref('');
|
|
57
|
+
// 时间戳
|
|
58
|
+
const timestamp = ref(Date.now());
|
|
59
|
+
|
|
60
|
+
onMounted(() => {
|
|
61
|
+
console.log('Editor Mounted');
|
|
62
|
+
state.communicator = new PostMessage(iframe.value, props.postMessageOption);
|
|
63
|
+
state.communicator.subscribe('message', async function ({ data }) {
|
|
64
|
+
if (typeof props.onMessage === 'function') {
|
|
65
|
+
return props.onMessage({ ...data, domain: editorDomain });
|
|
66
|
+
} else {
|
|
67
|
+
console.warn('Editor has no props onMessage');
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
// 3秒中,不管有没有load都关闭加载弹窗
|
|
71
|
+
setTimeout(() => {
|
|
72
|
+
loading.value = false;
|
|
73
|
+
}, 3000);
|
|
74
|
+
editorDomain = new EditorDomain(state);
|
|
75
|
+
editorDomain.on('load', () => {
|
|
76
|
+
// previewDomain初始化完成, 发送初始化数据
|
|
77
|
+
editorDomain.publish.init();
|
|
78
|
+
editorDomain.commit('setReadOnly', props.readOnly);
|
|
79
|
+
loading.value = false;
|
|
80
|
+
});
|
|
81
|
+
// 更新项目数据
|
|
82
|
+
editorDomain.on('update', project => {
|
|
83
|
+
if (project) {
|
|
84
|
+
emits('updateProject', project);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
// 更新截图url
|
|
88
|
+
editorDomain.on('updateScreenShot', imgUrl => {
|
|
89
|
+
emits('updateScreenShot', imgUrl);
|
|
90
|
+
});
|
|
91
|
+
// 更新菜单数据
|
|
92
|
+
editorDomain.on('contextmenu', data => {
|
|
93
|
+
menuData.value = data;
|
|
94
|
+
});
|
|
95
|
+
// 提示图片清晰度过低 使用二倍图上传
|
|
96
|
+
// todo 与confirm 合并处理
|
|
97
|
+
editorDomain.on('doubleImage', ({ text, icon, guide }) => {
|
|
98
|
+
guideData.value = guide;
|
|
99
|
+
const slots = [];
|
|
100
|
+
text && slots.push(h('span', {}, text));
|
|
101
|
+
icon &&
|
|
102
|
+
slots.push(
|
|
103
|
+
h(
|
|
104
|
+
'img',
|
|
105
|
+
{
|
|
106
|
+
src: icon,
|
|
107
|
+
style: 'width:20px;height:20px;margin-left:8px;',
|
|
108
|
+
onClick: () => {
|
|
109
|
+
guideVisible.value = true;
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
null
|
|
113
|
+
)
|
|
114
|
+
);
|
|
115
|
+
ElMessageBox({
|
|
116
|
+
title: '提示',
|
|
117
|
+
message: h('p', { style: 'display:flex;align-items:center;' }, slots),
|
|
118
|
+
type: 'warning',
|
|
119
|
+
showCancelButton: false,
|
|
120
|
+
confirmButtonText: '确定',
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
// 打开确认messagebox 例如二次确认删除
|
|
124
|
+
editorDomain.on('confirm', (data: ConfirmMessageBoxData) => {
|
|
125
|
+
const { type, title, schema, formData, confirmButton, cancelButton } =
|
|
126
|
+
data;
|
|
127
|
+
let publishData = {};
|
|
128
|
+
// TODO 通用化
|
|
129
|
+
ElMessageBox({
|
|
130
|
+
type,
|
|
131
|
+
title,
|
|
132
|
+
message: h(VueForm, {
|
|
133
|
+
schema,
|
|
134
|
+
modelValue: formData ?? {},
|
|
135
|
+
'onUpdate:modelValue': value => {
|
|
136
|
+
publishData = value;
|
|
137
|
+
},
|
|
138
|
+
}),
|
|
139
|
+
showCancelButton: !!cancelButton?.text,
|
|
140
|
+
confirmButtonText: confirmButton.text,
|
|
141
|
+
cancelButtonText: cancelButton.text,
|
|
142
|
+
callback: (action, instance) => {
|
|
143
|
+
if (action === 'confirm') {
|
|
144
|
+
editorDomain.publish.click(confirmButton.key, publishData);
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
// 监听错误提示
|
|
150
|
+
editorDomain.on('error', msg => {
|
|
151
|
+
ElMessage.error(msg);
|
|
152
|
+
});
|
|
153
|
+
// 获取编辑对话框的渲染数据
|
|
154
|
+
editorDomain.on('renderEditDialog', (data: EditDialogRenderData) => {
|
|
155
|
+
dialog.visible = true;
|
|
156
|
+
dialog.renderData = data;
|
|
157
|
+
});
|
|
158
|
+
// 打开云组件
|
|
159
|
+
editorDomain.on('openCloud', async ({ data }) => {
|
|
160
|
+
emits('openCloud', data, async res => {
|
|
161
|
+
try {
|
|
162
|
+
// const r = await editorDomain.commit('fillToufang', res);
|
|
163
|
+
// console.log('fillToufang', r);
|
|
164
|
+
} catch (error) {
|
|
165
|
+
console.error('fillToufang', error);
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
// 监听h5页面点击头部编辑图标
|
|
170
|
+
editorDomain.on('editTitle', () => emits('editTitle'));
|
|
171
|
+
// 强制更新页面
|
|
172
|
+
editorDomain.on('forceUpdate', () => {
|
|
173
|
+
timestamp.value = Date.now();
|
|
174
|
+
});
|
|
175
|
+
editorDomain.on('rename', (key) => {
|
|
176
|
+
onRename(key)
|
|
177
|
+
})
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
onUnmounted(() => {
|
|
181
|
+
if (state.communicator) {
|
|
182
|
+
state.communicator.destroy();
|
|
183
|
+
}
|
|
184
|
+
state.communicator = null;
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
// 分开监听 editorData只能通过getter函数的形式来监听它的值的变化
|
|
188
|
+
// 注意:直接修改父应用传入值的地址监听不到
|
|
189
|
+
watch(
|
|
190
|
+
() => props.editorData,
|
|
191
|
+
editorData => {
|
|
192
|
+
if (isEqual(state.project, editorData)) {
|
|
193
|
+
// 如果相等说明是从模拟器返回的数据带来的改变
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
state.project = Object.assign({}, state.project, editorData);
|
|
197
|
+
// editorData一旦变化则检查模拟器是否加载完毕 防止多次初始化
|
|
198
|
+
if (editorDomain) {
|
|
199
|
+
console.log('Editor init');
|
|
200
|
+
editorDomain.publish.init();
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
{ immediate: true, deep: true }
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
watch(
|
|
207
|
+
() => props.readOnly,
|
|
208
|
+
readOnly => {
|
|
209
|
+
editorDomain.commit('setReadOnly', readOnly);
|
|
210
|
+
}
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
// 监听activeBar值的变化
|
|
214
|
+
watch(activeBarName, val => {
|
|
215
|
+
editorDomain.commit('setPrimarySidebarData', val);
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
const iframeSizeMode = computed(()=>{
|
|
219
|
+
// 如果指定了大小为自动计算,则采用计算父控件方式
|
|
220
|
+
// @ts-ignore
|
|
221
|
+
return state.config?.functionData?.simulatorSizeList?.value?.data?.sizeMode;
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
const viewIframeBoxStyle = computed(()=>{
|
|
225
|
+
if(iframeSizeMode.value === 'auto') {
|
|
226
|
+
return {
|
|
227
|
+
width: '100%',
|
|
228
|
+
height: '100%'
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
else return {};
|
|
232
|
+
});
|
|
233
|
+
// 模拟器实际宽高
|
|
234
|
+
const viewScaleStyle = computed(() => {
|
|
235
|
+
// 如果指定了大小为自动计算,则采用计算父控件方式
|
|
236
|
+
if(iframeSizeMode.value === 'auto') {
|
|
237
|
+
return {
|
|
238
|
+
width: '100%',
|
|
239
|
+
height: '100%'
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
else if (state.config?.functionData?.simulatorSizeList) {
|
|
243
|
+
const { width, height } =
|
|
244
|
+
state.config.functionData.simulatorSizeList.value.data;
|
|
245
|
+
return {
|
|
246
|
+
width: `${width}px`,
|
|
247
|
+
height: `${height}px`,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
if (props.appConfig?.simulatorSize) {
|
|
251
|
+
return props.appConfig?.simulatorSize;
|
|
252
|
+
}
|
|
253
|
+
return {
|
|
254
|
+
width: '375px',
|
|
255
|
+
height: '750px',
|
|
256
|
+
};
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
// 模拟器缩放比例
|
|
260
|
+
const viewScalePercent = computed(() => {
|
|
261
|
+
if (state.config?.functionData?.simulatorSizeList) {
|
|
262
|
+
const { percent } =
|
|
263
|
+
state.config.functionData.simulatorSizeList.value.data;
|
|
264
|
+
return percent;
|
|
265
|
+
}
|
|
266
|
+
return null;
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
// headBar
|
|
270
|
+
/* 更新模拟器尺寸 */
|
|
271
|
+
const onUpdateScale = ({ key, scale }) => {
|
|
272
|
+
editorDomain.publish.click(key, scale);
|
|
273
|
+
};
|
|
274
|
+
/* 点击编辑器头部编辑图标 */
|
|
275
|
+
const onEditTitle = async key => {
|
|
276
|
+
editorDomain.publish.click(key, props);
|
|
277
|
+
};
|
|
278
|
+
/* 对话框表单变化 */
|
|
279
|
+
const onDialogSchemaChange = values => {
|
|
280
|
+
console.log('onDialogSchemaChange', values);
|
|
281
|
+
dialog.renderData.formData = values;
|
|
282
|
+
};
|
|
283
|
+
/* 点击编辑对话框确认按钮 */
|
|
284
|
+
const onEditDialogConfirm = () => {
|
|
285
|
+
dialog.visible = false;
|
|
286
|
+
editorDomain.publish.click(
|
|
287
|
+
dialog.renderData.confirmButton.key,
|
|
288
|
+
dialog.renderData.formData
|
|
289
|
+
);
|
|
290
|
+
emits('editDialogConfirm', dialog.renderData.confirmButton.key);
|
|
291
|
+
};
|
|
292
|
+
/* 点击编辑对话框取消按钮 */
|
|
293
|
+
const onEditDialogCancel = () => {
|
|
294
|
+
dialog.visible = false;
|
|
295
|
+
editorDomain.publish.click(
|
|
296
|
+
dialog.renderData.cancelButton.key,
|
|
297
|
+
dialog.renderData.formData
|
|
298
|
+
);
|
|
299
|
+
emits('editDialogCancel', dialog.renderData.cancelButton.key);
|
|
300
|
+
};
|
|
301
|
+
/* 撤销 */
|
|
302
|
+
const onUndo = async ({ key }) => {
|
|
303
|
+
editorDomain.publish.click(key, {});
|
|
304
|
+
};
|
|
305
|
+
/* 重做 */
|
|
306
|
+
const onRedo = async ({ key }) => {
|
|
307
|
+
editorDomain.publish.click(key, {});
|
|
308
|
+
};
|
|
309
|
+
// navTree
|
|
310
|
+
/* 选中导航树 */
|
|
311
|
+
const onSelect = (key: LowCodeKey) => {
|
|
312
|
+
editorDomain.publish.click(key, {});
|
|
313
|
+
};
|
|
314
|
+
/* 选中页面内容 */
|
|
315
|
+
const onSelectPage = () => {
|
|
316
|
+
const key = state?.config?.navTreeData?.value?.[0]?.key;
|
|
317
|
+
if (key) {
|
|
318
|
+
editorDomain.publish.click(key, {});
|
|
319
|
+
}
|
|
320
|
+
};
|
|
321
|
+
/* 处理模拟器里组件重命名 */
|
|
322
|
+
const onRename = (key: LowCodeKey) => {
|
|
323
|
+
if(navTreeRef.value){
|
|
324
|
+
navTreeRef.value.handleMenuClick(key);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
/* 右键导航树 */
|
|
328
|
+
const onMenuOpen = (key: LowCodeKey) => {
|
|
329
|
+
// 初始化,避免残影
|
|
330
|
+
menuData.value = [];
|
|
331
|
+
editorDomain.publish.contextmenu(key, {});
|
|
332
|
+
};
|
|
333
|
+
|
|
334
|
+
/* 拖动导航树 */
|
|
335
|
+
const onSplice = (data: any) => {
|
|
336
|
+
editorDomain.publish.splice(data);
|
|
337
|
+
};
|
|
338
|
+
|
|
339
|
+
/* 点击右键导航树打开的菜单 */
|
|
340
|
+
const onMenuClick = (key: LowCodeKey) => {
|
|
341
|
+
editorDomain.publish.click(key, {});
|
|
342
|
+
};
|
|
343
|
+
|
|
344
|
+
/* 修改导航树的标题后保存 */
|
|
345
|
+
const onSubmitEdit = (key, data: any) => {
|
|
346
|
+
editorDomain.publish.set(key, data);
|
|
347
|
+
};
|
|
348
|
+
|
|
349
|
+
/* 点击hover导航树出现的图标 */
|
|
350
|
+
const onIconClick = (key: LowCodeKey) => {
|
|
351
|
+
editorDomain.publish.click(key, {});
|
|
352
|
+
};
|
|
353
|
+
|
|
354
|
+
// componentTree
|
|
355
|
+
/* 点击组件库的组件 */
|
|
356
|
+
const onAddItem = ({ key, value }) => {
|
|
357
|
+
editorDomain.publish.click(key, value);
|
|
358
|
+
};
|
|
359
|
+
|
|
360
|
+
/* 拖动组件库的组件到模拟器 */
|
|
361
|
+
const onDragEnd = ({ key, value }, isCors) => {
|
|
362
|
+
if (!value) return;
|
|
363
|
+
// 是否拖到模拟器
|
|
364
|
+
if (isCors) {
|
|
365
|
+
const rect = iframe.value.getBoundingClientRect();
|
|
366
|
+
if (
|
|
367
|
+
value.x > rect.left &&
|
|
368
|
+
value.x < rect.left + rect.width &&
|
|
369
|
+
value.y > rect.top &&
|
|
370
|
+
value.y < rect.top + rect.height
|
|
371
|
+
) {
|
|
372
|
+
editorDomain.publish.drag(key, {
|
|
373
|
+
...value,
|
|
374
|
+
x: value.x - rect.left,
|
|
375
|
+
y: value.y - rect.top,
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
} else {
|
|
379
|
+
editorDomain.publish.drag(key, value);
|
|
380
|
+
}
|
|
381
|
+
};
|
|
382
|
+
// DataSource组件抛出的事件 对数据源配置的增删改查
|
|
383
|
+
const onDataSourceChange = ({ type, data }) => {
|
|
384
|
+
editorDomain.commit('handleDataSource', { type, data });
|
|
385
|
+
};
|
|
386
|
+
|
|
387
|
+
let changeKey;
|
|
388
|
+
let timer;
|
|
389
|
+
let interval = 50;
|
|
390
|
+
// schemaConfig
|
|
391
|
+
/* 表单更新 */
|
|
392
|
+
const onSchemaFormChange = ({ key, value }) => {
|
|
393
|
+
// 编辑器更新完成之前不执行下面
|
|
394
|
+
if (!editorDomain || !editorDomain.initFlag) {
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
if (isEqual(changeKey, key)) {
|
|
398
|
+
// 相同的目标,防抖
|
|
399
|
+
clearTimeout(timer);
|
|
400
|
+
}
|
|
401
|
+
changeKey = key;
|
|
402
|
+
timer = setTimeout(() => {
|
|
403
|
+
editorDomain && editorDomain.publish.set(key, value);
|
|
404
|
+
}, interval);
|
|
405
|
+
};
|
|
406
|
+
|
|
407
|
+
// 全局监听鼠标松开事件
|
|
408
|
+
document.querySelector('body').ondragleave = function () {
|
|
409
|
+
iframeMaskFlag.value = false;
|
|
410
|
+
};
|
|
411
|
+
|
|
412
|
+
/** 批量拖拽图片生成 */
|
|
413
|
+
const onDrop = (v, e) => {
|
|
414
|
+
e.stopPropagation();
|
|
415
|
+
e.preventDefault();
|
|
416
|
+
if (v) {
|
|
417
|
+
const files = e.dataTransfer.files;
|
|
418
|
+
if (!files || !files.length) {
|
|
419
|
+
return;
|
|
420
|
+
}
|
|
421
|
+
emits('upload', files, dropDone);
|
|
422
|
+
}
|
|
423
|
+
iframeMaskFlag.value = false;
|
|
424
|
+
};
|
|
425
|
+
|
|
426
|
+
const dropDone = (urls: string[]) => {
|
|
427
|
+
const data: { type: string; url: string }[] = [];
|
|
428
|
+
urls.forEach(url => {
|
|
429
|
+
data.push({ type: '1', url });
|
|
430
|
+
});
|
|
431
|
+
// editorDomain.publish.insert(data);
|
|
432
|
+
};
|
|
433
|
+
|
|
434
|
+
const onDragover = e => {
|
|
435
|
+
e.stopPropagation();
|
|
436
|
+
e.preventDefault();
|
|
437
|
+
// e.target.classList.add('mask');
|
|
438
|
+
// iframeMaskFlag.value = true;
|
|
439
|
+
const types: string[] = e?.dataTransfer?.types ?? [];
|
|
440
|
+
if (!types.includes('Files')) {
|
|
441
|
+
iframeMaskFlag.value = false;
|
|
442
|
+
} else iframeMaskFlag.value = true;
|
|
443
|
+
};
|
|
444
|
+
|
|
445
|
+
const onDragenter = e => {
|
|
446
|
+
e.stopPropagation();
|
|
447
|
+
e.preventDefault();
|
|
448
|
+
const types: string[] = e?.dataTransfer?.types ?? [];
|
|
449
|
+
if (!types.includes('Files')) {
|
|
450
|
+
iframeMaskFlag.value = false;
|
|
451
|
+
} else iframeMaskFlag.value = true;
|
|
452
|
+
};
|
|
453
|
+
const onDragleave = e => {
|
|
454
|
+
e.stopPropagation();
|
|
455
|
+
e.preventDefault();
|
|
456
|
+
if (e.offsetX < 0) {
|
|
457
|
+
iframeMaskFlag.value = false;
|
|
458
|
+
}
|
|
459
|
+
};
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* Schema文件上传
|
|
463
|
+
* @param param0
|
|
464
|
+
* @param done
|
|
465
|
+
*/
|
|
466
|
+
const onSchemaUpload = async (file, done, config) => {
|
|
467
|
+
// TODO: pc端上传图片没有校验 需另外处理
|
|
468
|
+
emits('upload', [file], async data => {
|
|
469
|
+
// 结果发送到模拟器校验
|
|
470
|
+
if (state.project.meta.type === 'h5') {
|
|
471
|
+
try {
|
|
472
|
+
const res = await editorDomain.commit('validateUpload', {
|
|
473
|
+
fileList: data,
|
|
474
|
+
config,
|
|
475
|
+
});
|
|
476
|
+
if (!res[0]?.err) {
|
|
477
|
+
done(res[0].url);
|
|
478
|
+
}
|
|
479
|
+
} catch (error) {
|
|
480
|
+
console.error('onSchemaUpload', error);
|
|
481
|
+
}
|
|
482
|
+
} else {
|
|
483
|
+
done(data[0].url);
|
|
484
|
+
}
|
|
485
|
+
});
|
|
486
|
+
};
|
|
487
|
+
|
|
488
|
+
/**
|
|
489
|
+
* 触发表单组件的getData事件 例如点击选择器远程加载选项
|
|
490
|
+
* @param cmdname 调用接口的方法名
|
|
491
|
+
* @param done 回调函数 将接口返回值回填到表单组件
|
|
492
|
+
* @param cmdParams 接口需要传递的参数
|
|
493
|
+
*/
|
|
494
|
+
const onSchemaGetData = (cmdname: string, done, cmdParams) => {
|
|
495
|
+
emits('getData', cmdname, done, cmdParams);
|
|
496
|
+
};
|
|
497
|
+
/**
|
|
498
|
+
* 打开云组件
|
|
499
|
+
* @param data 打开云组件需要的配置和参数以及需要转化的额外参数
|
|
500
|
+
* @param done 回调函数
|
|
501
|
+
*/
|
|
502
|
+
const onOpenCloud = async (data, done) => {
|
|
503
|
+
// 转化需要转化的额外参数
|
|
504
|
+
const result = await editorDomain.commit('transformComponentMeta', data);
|
|
505
|
+
emits('openCloud', result, done);
|
|
506
|
+
};
|
|
507
|
+
/**
|
|
508
|
+
* 云组件预加载
|
|
509
|
+
*/
|
|
510
|
+
const onPreloadCloud = url => {
|
|
511
|
+
emits('preloadCloud', url);
|
|
512
|
+
};
|
|
513
|
+
|
|
514
|
+
/**
|
|
515
|
+
* 获取实体列表 管理端调用接口 将请求结果传给回调函数
|
|
516
|
+
* @param done
|
|
517
|
+
*/
|
|
518
|
+
const onGetEntityList = done => {
|
|
519
|
+
props
|
|
520
|
+
.request('/api/entity/queryList', { limit: 10, offset: 1 })
|
|
521
|
+
.then(data => done(data.rows));
|
|
522
|
+
};
|
|
523
|
+
|
|
524
|
+
/**
|
|
525
|
+
* 根据实体ID获取方法列表
|
|
526
|
+
* @param done
|
|
527
|
+
* @param entityId
|
|
528
|
+
*/
|
|
529
|
+
const onGetMethodList = (done, entityId) => {
|
|
530
|
+
props
|
|
531
|
+
.request('/api/method/queryList', {
|
|
532
|
+
entityId,
|
|
533
|
+
limit: 10,
|
|
534
|
+
offset: 1,
|
|
535
|
+
})
|
|
536
|
+
.then(data => done(data.rows));
|
|
537
|
+
};
|
|
538
|
+
|
|
539
|
+
/* 编辑器点击事件 */
|
|
540
|
+
const onClick = () => {
|
|
541
|
+
// 关闭右键菜单
|
|
542
|
+
editorDomain.commit('closeContextMenu', {});
|
|
543
|
+
};
|
|
544
|
+
|
|
545
|
+
/** 提供给外部 回填project数据 */
|
|
546
|
+
const fillData = async (data: CheckResponseItem[]) => {
|
|
547
|
+
return editorDomain.publish.validate(data);
|
|
548
|
+
};
|
|
549
|
+
|
|
550
|
+
/** 提供给外部 校验数据 */
|
|
551
|
+
const validate = async () => {
|
|
552
|
+
const result = await editorDomain.publish.validate();
|
|
553
|
+
return result ?? [];
|
|
554
|
+
};
|
|
555
|
+
|
|
556
|
+
/**
|
|
557
|
+
* @deprecated
|
|
558
|
+
* 提供给外部 修改标题和登录态
|
|
559
|
+
* @param key
|
|
560
|
+
* @param data
|
|
561
|
+
*/
|
|
562
|
+
const editTitle = (data: any) => {
|
|
563
|
+
editorDomain.commit('setTitle', data);
|
|
564
|
+
};
|
|
565
|
+
|
|
566
|
+
/**
|
|
567
|
+
* @deprecated
|
|
568
|
+
* 提供给外部 更新导航配置
|
|
569
|
+
*/
|
|
570
|
+
const updateNavMenuConf = navMenuConf => {
|
|
571
|
+
editorDomain.publish.set({ module: 'function' }, navMenuConf);
|
|
572
|
+
};
|
|
573
|
+
|
|
574
|
+
const onInitValidateRule = callback => {
|
|
575
|
+
// formily校验规则
|
|
576
|
+
const rules = {
|
|
577
|
+
asyncValidator: (value: any, rule: any) => {
|
|
578
|
+
// eslint-disable-next-line no-async-promise-executor
|
|
579
|
+
return new Promise(async resolve => {
|
|
580
|
+
const result = await editorDomain.commit('validateField', {
|
|
581
|
+
value,
|
|
582
|
+
type: rule?.type,
|
|
583
|
+
});
|
|
584
|
+
resolve(result);
|
|
585
|
+
});
|
|
586
|
+
},
|
|
587
|
+
};
|
|
588
|
+
callback(rules);
|
|
589
|
+
};
|
|
590
|
+
|
|
591
|
+
function send(payload: SendReq) {
|
|
592
|
+
return editorDomain.commit('message', payload);
|
|
593
|
+
}
|
|
594
|
+
return {
|
|
595
|
+
iframe,
|
|
596
|
+
iframeMaskFlag,
|
|
597
|
+
viewScaleStyle,
|
|
598
|
+
viewIframeBoxStyle,
|
|
599
|
+
...toRefs(state),
|
|
600
|
+
menuData,
|
|
601
|
+
guideVisible,
|
|
602
|
+
guideData,
|
|
603
|
+
onUpdateScale,
|
|
604
|
+
onSelect,
|
|
605
|
+
onSelectPage,
|
|
606
|
+
onMenuOpen,
|
|
607
|
+
onSplice,
|
|
608
|
+
onMenuClick,
|
|
609
|
+
onSubmitEdit,
|
|
610
|
+
onAddItem,
|
|
611
|
+
onDragEnd,
|
|
612
|
+
onDragover,
|
|
613
|
+
onDrop,
|
|
614
|
+
onDragenter,
|
|
615
|
+
onSchemaFormChange,
|
|
616
|
+
onDragleave,
|
|
617
|
+
onSchemaUpload,
|
|
618
|
+
fillData,
|
|
619
|
+
onIconClick,
|
|
620
|
+
validate,
|
|
621
|
+
editTitle,
|
|
622
|
+
onOpenCloud,
|
|
623
|
+
onSchemaGetData,
|
|
624
|
+
onPreloadCloud,
|
|
625
|
+
onEditTitle,
|
|
626
|
+
updateNavMenuConf,
|
|
627
|
+
loading,
|
|
628
|
+
onUndo,
|
|
629
|
+
onRedo,
|
|
630
|
+
viewScalePercent,
|
|
631
|
+
dialog,
|
|
632
|
+
onEditDialogConfirm,
|
|
633
|
+
onEditDialogCancel,
|
|
634
|
+
onDialogSchemaChange,
|
|
635
|
+
activeBarName,
|
|
636
|
+
onDataSourceChange,
|
|
637
|
+
onGetEntityList,
|
|
638
|
+
onGetMethodList,
|
|
639
|
+
onClick,
|
|
640
|
+
onInitValidateRule,
|
|
641
|
+
timestamp,
|
|
642
|
+
send,
|
|
643
|
+
navTreeRef,
|
|
644
|
+
};
|
|
645
|
+
}
|