From 2a0680c7077914dcf24a818cf947172e0f586b2c Mon Sep 17 00:00:00 2001 From: roymondchen Date: Tue, 18 Jul 2023 19:35:54 +0800 Subject: [PATCH] =?UTF-8?q?feat(core,editor,data-source,form,schema):=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=95=B0=E6=8D=AE=E6=BA=90=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E9=85=8D=E7=BD=AE,=E6=94=AF=E6=8C=81=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E8=81=94=E5=8A=A8=E6=95=B0=E6=8D=AE=E6=BA=90=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/src/App.ts | 25 +++ packages/core/src/Node.ts | 7 +- packages/data-source/src/data-sources/Base.ts | 12 +- packages/editor/src/Editor.vue | 4 - .../editor/src/components/CodeBlockEditor.vue | 141 ++++++++++++ .../editor/src/components/CodeDraftEditor.vue | 148 ------------- packages/editor/src/components/CodeParams.vue | 1 - .../editor/src/components/FunctionEditor.vue | 198 ----------------- packages/editor/src/fields/Code.vue | 41 ++-- packages/editor/src/fields/CodeSelectCol.vue | 23 +- .../editor/src/fields/DataSourceFields.vue | 16 +- .../src/fields/DataSourceMethodSelect.vue | 147 ++++++++++++ .../editor/src/fields/DataSourceMethods.vue | 103 +++++++++ packages/editor/src/fields/EventSelect.vue | 40 +++- packages/editor/src/icons/CodeIcon.vue | 2 - packages/editor/src/index.ts | 7 + packages/editor/src/layouts/CodeEditor.vue | 33 ++- .../editor/src/layouts/sidebar/Sidebar.vue | 12 +- .../sidebar/code-block/CodeBlockEditor.vue | 100 --------- .../sidebar/code-block/CodeBlockList.vue | 209 +++++++----------- .../sidebar/code-block/CodeBlockListPanel.vue | 64 ++++++ .../data-source/DataSourceConfigPanel.vue | 56 ++--- .../sidebar/data-source/DataSourceList.vue | 111 ++++++++++ .../data-source/DataSourceListPanel.vue | 94 ++------ packages/editor/src/services/codeBlock.ts | 87 ++------ packages/editor/src/services/dataSource.ts | 2 + packages/editor/src/theme/code-block.scss | 122 ---------- packages/editor/src/theme/code-editor.scss | 29 ++- .../editor/src/theme/data-source-methods.scss | 13 ++ packages/editor/src/theme/event.scss | 27 ++- packages/editor/src/theme/theme.scss | 1 + packages/editor/src/type.ts | 19 +- .../editor/src/utils/data-source/index.ts | 11 + .../editor/src/utils/use-code-block-edit.ts | 84 +++++++ .../src/utils/use-data-source-method.ts | 101 +++++++++ packages/form/src/FormDialog.vue | 18 +- packages/form/src/FormDrawer.vue | 116 ++++++++++ packages/form/src/containers/Container.vue | 3 +- packages/form/src/index.ts | 1 + packages/form/src/theme/form-drawer.scss | 5 + packages/form/src/theme/index.scss | 1 + packages/form/src/theme/panel.scss | 6 + packages/schema/src/index.ts | 20 +- 43 files changed, 1292 insertions(+), 968 deletions(-) create mode 100644 packages/editor/src/components/CodeBlockEditor.vue delete mode 100644 packages/editor/src/components/CodeDraftEditor.vue delete mode 100644 packages/editor/src/components/FunctionEditor.vue create mode 100644 packages/editor/src/fields/DataSourceMethodSelect.vue create mode 100644 packages/editor/src/fields/DataSourceMethods.vue delete mode 100644 packages/editor/src/layouts/sidebar/code-block/CodeBlockEditor.vue create mode 100644 packages/editor/src/layouts/sidebar/code-block/CodeBlockListPanel.vue create mode 100644 packages/editor/src/layouts/sidebar/data-source/DataSourceList.vue create mode 100644 packages/editor/src/theme/data-source-methods.scss create mode 100644 packages/editor/src/utils/use-code-block-edit.ts create mode 100644 packages/editor/src/utils/use-data-source-method.ts create mode 100644 packages/form/src/FormDrawer.vue create mode 100644 packages/form/src/theme/form-drawer.scss diff --git a/packages/core/src/App.ts b/packages/core/src/App.ts index fce90a5c..6829049e 100644 --- a/packages/core/src/App.ts +++ b/packages/core/src/App.ts @@ -31,6 +31,7 @@ import { CodeBlockDSL, CodeItemConfig, CompItemConfig, + DataSourceItemConfig, DeprecatedEventConfig, EventConfig, Id, @@ -321,6 +322,28 @@ class App extends EventEmitter { } } + public async dataSourceActionHandler(eventConfig: DataSourceItemConfig) { + const { dataSourceMethod = [], params = {} } = eventConfig; + + const [id, methodName] = dataSourceMethod; + + if (!id || !methodName) return; + + const dataSource = this.dataSourceManager?.get(id); + + if (!dataSource) return; + + const methods = dataSource.getMethods() || []; + + const method = methods.find((item) => item.name === methodName); + + if (!method) return; + + if (typeof method.content === 'function') { + await method.content({ app: this, params, dataSource }); + } + } + public compiledNode(node: MNode, content: DataSourceManagerData, sourceId?: Id) { return compiledNode( (value: any) => { @@ -364,6 +387,8 @@ class App extends EventEmitter { } else if (actionItem.actionType === ActionType.CODE) { // 执行代码块 await this.codeActionHandler(actionItem as CodeItemConfig); + } else if (actionItem.actionType === ActionType.DATA_SOURCE) { + await this.dataSourceActionHandler(actionItem as DataSourceItemConfig); } } } else { diff --git a/packages/core/src/Node.ts b/packages/core/src/Node.ts index 762e6399..54396742 100644 --- a/packages/core/src/Node.ts +++ b/packages/core/src/Node.ts @@ -102,8 +102,11 @@ class Node extends EventEmitter { if (this.data[hook]?.hookType !== HookType.CODE || isEmpty(this.app.codeDsl)) return; for (const item of this.data[hook].hookData) { const { codeId, params = {} } = item; - if (this.app.codeDsl![codeId] && typeof this.app.codeDsl![codeId]?.content === 'function') { - await this.app.codeDsl![codeId].content({ app: this.app, params }); + + const functionContent = this.app.codeDsl?.[codeId]?.content; + + if (typeof functionContent === 'function') { + await functionContent({ app: this.app, params }); } } } diff --git a/packages/data-source/src/data-sources/Base.ts b/packages/data-source/src/data-sources/Base.ts index a8cba938..29fa06e8 100644 --- a/packages/data-source/src/data-sources/Base.ts +++ b/packages/data-source/src/data-sources/Base.ts @@ -17,7 +17,7 @@ */ import EventEmitter from 'events'; -import type { DataSchema } from '@tmagic/schema'; +import type { CodeBlockContent, DataSchema } from '@tmagic/schema'; import type { DataSourceOptions } from '@data-source/types'; import { getDefaultValueFromFields } from '@data-source/util'; @@ -35,12 +35,14 @@ export default class DataSource extends EventEmitter { public data: Record = {}; private fields: DataSchema[] = []; + private methods: CodeBlockContent[] = []; constructor(options: DataSourceOptions) { super(); this.id = options.schema.id; this.setFields(options.schema.fields); + this.setMethods(options.schema.methods || []); this.updateDefaultData(); } @@ -49,6 +51,14 @@ export default class DataSource extends EventEmitter { this.fields = fields; } + public setMethods(methods: CodeBlockContent[]) { + this.methods = methods; + } + + public getMethods() { + return this.methods; + } + public setData(data: Record) { // todo: 校验数据,看是否符合 schema this.data = data; diff --git a/packages/editor/src/Editor.vue b/packages/editor/src/Editor.vue index decd75f4..ee5f6438 100644 --- a/packages/editor/src/Editor.vue +++ b/packages/editor/src/Editor.vue @@ -40,10 +40,6 @@ - - diff --git a/packages/editor/src/components/CodeBlockEditor.vue b/packages/editor/src/components/CodeBlockEditor.vue new file mode 100644 index 00000000..25a4a1df --- /dev/null +++ b/packages/editor/src/components/CodeBlockEditor.vue @@ -0,0 +1,141 @@ + + + diff --git a/packages/editor/src/components/CodeDraftEditor.vue b/packages/editor/src/components/CodeDraftEditor.vue deleted file mode 100644 index 33a06026..00000000 --- a/packages/editor/src/components/CodeDraftEditor.vue +++ /dev/null @@ -1,148 +0,0 @@ - - diff --git a/packages/editor/src/components/CodeParams.vue b/packages/editor/src/components/CodeParams.vue index 613dc5bc..ce9b43a8 100644 --- a/packages/editor/src/components/CodeParams.vue +++ b/packages/editor/src/components/CodeParams.vue @@ -51,7 +51,6 @@ const codeParamsConfig = computed(() => getFormConfig(props.paramsConfig)); const onParamsChangeHandler = async () => { try { const value = await form.value?.submitForm(true); - console.log(value); emit('change', value); } catch (e) { console.log(e); diff --git a/packages/editor/src/components/FunctionEditor.vue b/packages/editor/src/components/FunctionEditor.vue deleted file mode 100644 index 51215a2b..00000000 --- a/packages/editor/src/components/FunctionEditor.vue +++ /dev/null @@ -1,198 +0,0 @@ - - diff --git a/packages/editor/src/fields/Code.vue b/packages/editor/src/fields/Code.vue index 3639b825..aa5369fb 100644 --- a/packages/editor/src/fields/Code.vue +++ b/packages/editor/src/fields/Code.vue @@ -1,32 +1,45 @@ diff --git a/packages/editor/src/fields/DataSourceFields.vue b/packages/editor/src/fields/DataSourceFields.vue index efe192a0..9425d57f 100644 --- a/packages/editor/src/fields/DataSourceFields.vue +++ b/packages/editor/src/fields/DataSourceFields.vue @@ -1,6 +1,6 @@