diff --git a/packages/core/src/App.ts b/packages/core/src/App.ts index 14d17ec6..3e9ca3b2 100644 --- a/packages/core/src/App.ts +++ b/packages/core/src/App.ts @@ -297,7 +297,7 @@ class App extends EventEmitter { } if (typeof dataSource[methodName] === 'function') { - return await dataSource[methodName](); + return await dataSource[methodName]({ params }); } } catch (e: any) { if (this.errorHandler) { diff --git a/packages/data-source/src/data-sources/Base.ts b/packages/data-source/src/data-sources/Base.ts index 227eaba6..90965a4e 100644 --- a/packages/data-source/src/data-sources/Base.ts +++ b/packages/data-source/src/data-sources/Base.ts @@ -20,7 +20,7 @@ import EventEmitter from 'events'; import { cloneDeep } from 'lodash-es'; import type { CodeBlockContent, DataSchema, DataSourceSchema, default as TMagicApp } from '@tmagic/core'; -import { getDefaultValueFromFields } from '@tmagic/core'; +import { DATA_SOURCE_SET_DATA_METHOD_NAME, getDefaultValueFromFields } from '@tmagic/core'; import { ObservedData } from '@data-source/observed-data/ObservedData'; import { SimpleObservedData } from '@data-source/observed-data/SimpleObservedData'; @@ -51,6 +51,7 @@ export default class DataSource e super(); this.#id = options.schema.id; + this.#type = options.schema.type; this.#schema = options.schema; this.app = options.app; @@ -58,6 +59,11 @@ export default class DataSource e this.setFields(options.schema.fields); this.setMethods(options.schema.methods || []); + // @ts-ignore + this[DATA_SOURCE_SET_DATA_METHOD_NAME] = ({ params }: { params: { field?: string[]; data: any } }) => { + this.setData(params.data, params.field?.join('.')); + }; + let data = options.initialData; // eslint-disable-next-line @typescript-eslint/naming-convention const ObservedDataClass = options.ObservedDataClass || SimpleObservedData; diff --git a/packages/editor/src/components/CodeParams.vue b/packages/editor/src/components/CodeParams.vue index aac07fd9..d098697e 100644 --- a/packages/editor/src/components/CodeParams.vue +++ b/packages/editor/src/components/CodeParams.vue @@ -46,13 +46,29 @@ const getFormConfig = (items: FormItemConfig[] = []) => [ const codeParamsConfig = computed(() => getFormConfig( - props.paramsConfig.map(({ name, text, extra, ...config }) => ({ - type: 'data-source-field-select', - name, - text, - extra, - fieldConfig: config as FormItemConfig, - })), + props.paramsConfig.map(({ name, text, extra, ...config }) => { + let { type } = config; + if (typeof type === 'function') { + type = type(undefined, { + model: props.model[props.name], + }); + } + if (type && ['data-source-field-select', 'vs-code'].includes(type)) { + return { + ...config, + name, + text, + extra, + }; + } + return { + type: 'data-source-field-select' as const, + name, + text, + extra, + fieldConfig: config, + }; + }) as FormItemConfig[], ), ); diff --git a/packages/editor/src/fields/DataSourceFieldSelect/FieldSelect.vue b/packages/editor/src/fields/DataSourceFieldSelect/FieldSelect.vue index 940d1d76..f290ff01 100644 --- a/packages/editor/src/fields/DataSourceFieldSelect/FieldSelect.vue +++ b/packages/editor/src/fields/DataSourceFieldSelect/FieldSelect.vue @@ -1,6 +1,21 @@