From 1414cdce969840c02d667e424006cbaab799dffc Mon Sep 17 00:00:00 2001 From: CaptainB Date: Mon, 10 Mar 2025 11:12:49 +0800 Subject: [PATCH 1/2] feat: Support functionlib icon and init_fields MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --story=1017947 --user=刘瑞斌 【函数库】- 函数支持配置参数及操作优化 https://www.tapd.cn/57709429/s/1664936 --- ...ionlib_icon_functionlib_init_field_list.py | 23 +++ apps/function_lib/models/function.py | 2 + .../serializers/function_lib_serializer.py | 41 ++++- apps/function_lib/urls.py | 1 + apps/function_lib/views/function_lib_views.py | 14 +- ui/src/api/function-lib.ts | 11 +- ui/src/api/type/function-lib.ts | 2 + ui/src/locales/lang/en-US/common.ts | 3 +- ui/src/locales/lang/zh-CN/common.ts | 3 +- ui/src/locales/lang/zh-Hant/common.ts | 3 +- .../component/EditAvatarDialog.vue | 134 ++++++++++++++++ .../component/FunctionDebugDrawer.vue | 25 ++- .../component/FunctionFormDrawer.vue | 148 ++++++++++++++++++ .../component/InitParamDrawer.vue | 108 +++++++++++++ .../component/PermissionDialog.vue | 104 ++++++++++++ ui/src/views/function-lib/index.vue | 86 ++++++---- 16 files changed, 668 insertions(+), 40 deletions(-) create mode 100644 apps/function_lib/migrations/0003_functionlib_icon_functionlib_init_field_list.py create mode 100644 ui/src/views/function-lib/component/EditAvatarDialog.vue create mode 100644 ui/src/views/function-lib/component/InitParamDrawer.vue create mode 100644 ui/src/views/function-lib/component/PermissionDialog.vue diff --git a/apps/function_lib/migrations/0003_functionlib_icon_functionlib_init_field_list.py b/apps/function_lib/migrations/0003_functionlib_icon_functionlib_init_field_list.py new file mode 100644 index 00000000000..3ea3a46379a --- /dev/null +++ b/apps/function_lib/migrations/0003_functionlib_icon_functionlib_init_field_list.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.15 on 2025-03-07 10:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('function_lib', '0002_functionlib_is_active_functionlib_permission_type'), + ] + + operations = [ + migrations.AddField( + model_name='functionlib', + name='icon', + field=models.CharField(default='/ui/favicon.ico', max_length=256, verbose_name='函数库icon'), + ), + migrations.AddField( + model_name='functionlib', + name='init_field_list', + field=models.JSONField(default=list, verbose_name='启动字段列表'), + ), + ] diff --git a/apps/function_lib/models/function.py b/apps/function_lib/models/function.py index 49a0e981bb5..a95339545d2 100644 --- a/apps/function_lib/models/function.py +++ b/apps/function_lib/models/function.py @@ -29,6 +29,8 @@ class FunctionLib(AppModelMixin): input_field_list = ArrayField(verbose_name="输入字段列表", base_field=models.JSONField(verbose_name="输入字段", default=dict) , default=list) + init_field_list = models.JSONField(verbose_name="启动字段列表", default=list) + icon = models.CharField(max_length=256, verbose_name="函数库icon", default="/ui/favicon.ico") is_active = models.BooleanField(default=True) permission_type = models.CharField(max_length=20, verbose_name='权限类型', choices=PermissionType.choices, default=PermissionType.PRIVATE) diff --git a/apps/function_lib/serializers/function_lib_serializer.py b/apps/function_lib/serializers/function_lib_serializer.py index cccdfcdc3da..a007cc2879e 100644 --- a/apps/function_lib/serializers/function_lib_serializer.py +++ b/apps/function_lib/serializers/function_lib_serializer.py @@ -10,23 +10,23 @@ import pickle import re import uuid -from typing import List from django.core import validators from django.db import transaction from django.db.models import QuerySet, Q from django.http import HttpResponse +from django.utils.translation import gettext_lazy as _ from rest_framework import serializers, status from common.db.search import page_search from common.exception.app_exception import AppApiException -from common.field.common import UploadedFileField +from common.field.common import UploadedFileField, UploadedImageField from common.response import result from common.util.field_message import ErrMessage from common.util.function_code import FunctionExecutor +from dataset.models import Image from function_lib.models.function import FunctionLib from smartdoc.const import CONFIG -from django.utils.translation import gettext_lazy as _ function_executor = FunctionExecutor(CONFIG.get('SANDBOX')) @@ -39,7 +39,7 @@ def __init__(self, function_lib: dict, version: str): class FunctionLibModelSerializer(serializers.ModelSerializer): class Meta: model = FunctionLib - fields = ['id', 'name', 'desc', 'code', 'input_field_list', 'permission_type', 'is_active', 'user_id', + fields = ['id', 'name', 'icon', 'desc', 'code', 'input_field_list','init_field_list', 'permission_type', 'is_active', 'user_id', 'create_time', 'update_time'] @@ -65,6 +65,7 @@ class DebugField(serializers.Serializer): class DebugInstance(serializers.Serializer): debug_field_list = DebugField(required=True, many=True) input_field_list = FunctionLibInputField(required=True, many=True) + init_field_list = serializers.ListField(required=False, default=list) code = serializers.CharField(required=True, error_messages=ErrMessage.char(_('function content'))) @@ -80,6 +81,8 @@ class EditFunctionLib(serializers.Serializer): input_field_list = FunctionLibInputField(required=False, many=True) + init_field_list = serializers.ListField(required=False, default=list) + is_active = serializers.BooleanField(required=False, error_messages=ErrMessage.char(_('Is active'))) @@ -93,6 +96,8 @@ class CreateFunctionLib(serializers.Serializer): input_field_list = FunctionLibInputField(required=True, many=True) + init_field_list = serializers.ListField(required=False, default=list) + permission_type = serializers.CharField(required=True, error_messages=ErrMessage.char(_('permission')), validators=[ validators.RegexValidator(regex=re.compile("^PUBLIC|PRIVATE$"), message="权限只支持PUBLIC|PRIVATE", code=500) @@ -148,6 +153,7 @@ def insert(self, instance, with_valid=True): code=instance.get('code'), user_id=self.data.get('user_id'), input_field_list=instance.get('input_field_list'), + init_field_list=instance.get('init_field_list'), permission_type=instance.get('permission_type'), is_active=instance.get('is_active', True)) function_lib.save() @@ -163,12 +169,16 @@ def debug(self, debug_instance, with_valid=True): input_field_list = debug_instance.get('input_field_list') code = debug_instance.get('code') debug_field_list = debug_instance.get('debug_field_list') + init_field_list = debug_instance.get('init_field_list') + init_params = {field.get('field'): field.get('value') if field.get('value', None) is not None else field.get('default_value') for field in init_field_list} params = {field.get('name'): self.convert_value(field.get('name'), field.get('value'), field.get('type'), field.get('is_required')) for field in [{'value': self.get_field_value(debug_field_list, field.get('name'), field.get('is_required')), **field} for field in input_field_list]} + # 合并初始化参数 + params = init_params | params return function_executor.exec_code(code, params) @staticmethod @@ -224,7 +234,7 @@ def edit(self, instance, with_valid=True): if with_valid: self.is_valid(raise_exception=True) EditFunctionLib(data=instance).is_valid(raise_exception=True) - edit_field_list = ['name', 'desc', 'code', 'input_field_list', 'permission_type', 'is_active'] + edit_field_list = ['name', 'desc', 'code', 'input_field_list', 'init_field_list', 'permission_type', 'is_active'] edit_dict = {field: instance.get(field) for field in edit_field_list if ( field in instance and instance.get(field) is not None)} QuerySet(FunctionLib).filter(id=self.data.get('id')).update(**edit_dict) @@ -277,4 +287,23 @@ def import_(self, with_valid=True): permission_type='PRIVATE', is_active=function_lib.get('is_active')) function_lib_model.save() - return True \ No newline at end of file + return True + + class IconOperate(serializers.Serializer): + id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("function ID"))) + user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("User ID"))) + image = UploadedImageField(required=True, error_messages=ErrMessage.image(_("picture"))) + + def edit(self, with_valid=True): + if with_valid: + self.is_valid(raise_exception=True) + functionLib = QuerySet(FunctionLib).filter(id=self.data.get('id')).first() + if functionLib is None: + raise AppApiException(500, _('Function does not exist')) + image_id = uuid.uuid1() + image = Image(id=image_id, image=self.data.get('image').read(), image_name=self.data.get('image').name) + image.save() + functionLib.icon = f'/api/image/{image_id}' + functionLib.save() + + return functionLib.icon diff --git a/apps/function_lib/urls.py b/apps/function_lib/urls.py index 5bcf70bd975..d0c89f17ad1 100644 --- a/apps/function_lib/urls.py +++ b/apps/function_lib/urls.py @@ -8,6 +8,7 @@ path('function_lib/debug', views.FunctionLibView.Debug.as_view()), path('function_lib//export', views.FunctionLibView.Export.as_view()), path('function_lib/import', views.FunctionLibView.Import.as_view()), + path('function_lib//edit_icon', views.FunctionLibView.EditIcon.as_view()), path('function_lib/pylint', views.PyLintView.as_view()), path('function_lib/', views.FunctionLibView.Operate.as_view()), path("function_lib//", views.FunctionLibView.Page.as_view(), diff --git a/apps/function_lib/views/function_lib_views.py b/apps/function_lib/views/function_lib_views.py index 40d1b1084b3..51c15ea0253 100644 --- a/apps/function_lib/views/function_lib_views.py +++ b/apps/function_lib/views/function_lib_views.py @@ -136,4 +136,16 @@ class Export(APIView): @has_permissions(RoleConstants.ADMIN, RoleConstants.USER) def get(self, request: Request, id: str): return FunctionLibSerializer.Operate( - data={'id': id, 'user_id': request.user.id}).export() \ No newline at end of file + data={'id': id, 'user_id': request.user.id}).export() + + class EditIcon(APIView): + authentication_classes = [TokenAuth] + parser_classes = [MultiPartParser] + + @action(methods=['PUT'], detail=False) + @has_permissions(RoleConstants.ADMIN, RoleConstants.USER) + def put(self, request: Request, id: str): + return result.success( + FunctionLibSerializer.IconOperate( + data={'id': id, 'user_id': request.user.id, + 'image': request.FILES.get('file')}).edit(request.data)) \ No newline at end of file diff --git a/ui/src/api/function-lib.ts b/ui/src/api/function-lib.ts index 41a90a96ca0..7fdbad8b0f3 100644 --- a/ui/src/api/function-lib.ts +++ b/ui/src/api/function-lib.ts @@ -112,6 +112,14 @@ const exportFunctionLib = ( ) } +const putFunctionLibIcon: ( + id: string, + data: any, + loading?: Ref +) => Promise> = (id, data, loading) => { + return put(`${prefix}/${id}/edit_icon`, data, undefined, loading) +} + const importFunctionLib: (data: any, loading?: Ref) => Promise> = ( data, loading @@ -128,5 +136,6 @@ export default { getFunctionLibById, exportFunctionLib, importFunctionLib, - pylint + pylint, + putFunctionLibIcon } diff --git a/ui/src/api/type/function-lib.ts b/ui/src/api/type/function-lib.ts index 2c5efe25481..0f51764e09d 100644 --- a/ui/src/api/type/function-lib.ts +++ b/ui/src/api/type/function-lib.ts @@ -1,10 +1,12 @@ interface functionLibData { id?: String name?: String + icon?: String desc?: String code?: String permission_type?: 'PRIVATE' | 'PUBLIC' input_field_list?: Array + init_field_list?: Array is_active?: Boolean } diff --git a/ui/src/locales/lang/en-US/common.ts b/ui/src/locales/lang/en-US/common.ts index e8fbb87e9b4..12f83c7fe2c 100644 --- a/ui/src/locales/lang/en-US/common.ts +++ b/ui/src/locales/lang/en-US/common.ts @@ -52,7 +52,8 @@ export default { }, param: { outputParam: 'Output Parameters', - inputParam: 'Input Parameters' + inputParam: 'Input Parameters', + initParam: 'Startup Parameters', }, inputPlaceholder: 'Please input', diff --git a/ui/src/locales/lang/zh-CN/common.ts b/ui/src/locales/lang/zh-CN/common.ts index cdcde3d6072..da89789ee54 100644 --- a/ui/src/locales/lang/zh-CN/common.ts +++ b/ui/src/locales/lang/zh-CN/common.ts @@ -55,7 +55,8 @@ export default { content: '内容', param: { outputParam: '输出参数', - inputParam:'输入参数' + inputParam: '输入参数', + initParam: '启动参数', }, rename:'重命名' } diff --git a/ui/src/locales/lang/zh-Hant/common.ts b/ui/src/locales/lang/zh-Hant/common.ts index 3281456de96..ea4bbe118d5 100644 --- a/ui/src/locales/lang/zh-Hant/common.ts +++ b/ui/src/locales/lang/zh-Hant/common.ts @@ -55,7 +55,8 @@ export default { content: '内容', param: { outputParam: '輸出參數', - inputParam: '輸入參數' + inputParam: '輸入參數', + initParam: '啟動參數', }, rename: '重命名' } diff --git a/ui/src/views/function-lib/component/EditAvatarDialog.vue b/ui/src/views/function-lib/component/EditAvatarDialog.vue new file mode 100644 index 00000000000..0dd3189eb6e --- /dev/null +++ b/ui/src/views/function-lib/component/EditAvatarDialog.vue @@ -0,0 +1,134 @@ + + + diff --git a/ui/src/views/function-lib/component/FunctionDebugDrawer.vue b/ui/src/views/function-lib/component/FunctionDebugDrawer.vue index 44856ac820a..84f81aff37a 100644 --- a/ui/src/views/function-lib/component/FunctionDebugDrawer.vue +++ b/ui/src/views/function-lib/component/FunctionDebugDrawer.vue @@ -11,6 +11,22 @@
+
+

+ {{ $t('common.param.initParam') }} +

+ + + + +

{{ $t('common.param.inputParam') }} @@ -95,6 +111,7 @@ import { ref, reactive, watch } from 'vue' import functionLibApi from '@/api/function-lib' import type { FormInstance } from 'element-plus' +import DynamicsForm from '@/components/dynamics-form/index.vue' const FormRef = ref() const loading = ref(false) @@ -102,11 +119,13 @@ const debugVisible = ref(false) const showResult = ref(false) const isSuccess = ref(false) const result = ref('') +const init_form_data = ref({}) const form = ref({ debug_field_list: [], code: '', - input_field_list: [] + input_field_list: [], + init_field_list: [] }) watch(debugVisible, (bool) => { @@ -117,7 +136,8 @@ watch(debugVisible, (bool) => { form.value = { debug_field_list: [], code: '', - input_field_list: [] + input_field_list: [], + init_field_list: [] } } }) @@ -150,6 +170,7 @@ const open = (data: any) => { } form.value.code = data.code form.value.input_field_list = data.input_field_list + form.value.init_field_list = data.init_field_list debugVisible.value = true } diff --git a/ui/src/views/function-lib/component/FunctionFormDrawer.vue b/ui/src/views/function-lib/component/FunctionFormDrawer.vue index 1435aca935a..95d748b00af 100644 --- a/ui/src/views/function-lib/component/FunctionFormDrawer.vue +++ b/ui/src/views/function-lib/component/FunctionFormDrawer.vue @@ -20,6 +20,39 @@ :label="$t('views.functionLib.functionForm.form.functionName.label')" prop="name" > +
+ + + + + + + +
+
+

+ {{ $t('common.param.initParam') }} +

+ + {{ $t('common.add') }} + +
+ + + + + + + + + + + + + +

{{ $t('common.param.inputParam') }} @@ -163,6 +264,8 @@ + + @@ -177,6 +280,10 @@ import { MsgSuccess, MsgConfirm } from '@/utils/message' import { cloneDeep } from 'lodash' import { PermissionType, PermissionDesc } from '@/enums/model' import { t } from '@/locales' +import UserFieldFormDialog from '@/workflow/nodes/base-node/component/UserFieldFormDialog.vue' +import {isAppIcon} from "@/utils/application"; +import EditAvatarDialog from "./EditAvatarDialog.vue"; + const props = defineProps({ title: String }) @@ -184,6 +291,8 @@ const props = defineProps({ const emit = defineEmits(['refresh']) const FieldFormDialogRef = ref() const FunctionDebugDrawerRef = ref() +const UserFieldFormDialogRef = ref() +const EditAvatarDialogRef = ref() const FormRef = ref() @@ -192,12 +301,15 @@ const loading = ref(false) const visible = ref(false) const showEditor = ref(false) const currentIndex = ref(null) +const showEditIcon = ref(false) const form = ref({ name: '', desc: '', code: '', + icon: '', input_field_list: [], + init_field_list: [], permission_type: 'PRIVATE' }) @@ -210,7 +322,9 @@ watch(visible, (bool) => { name: '', desc: '', code: '', + icon: '', input_field_list: [], + init_field_list: [], permission_type: 'PRIVATE' } FormRef.value?.clearValidate() @@ -286,10 +400,44 @@ function refreshFieldList(data: any) { currentIndex.value = null } + +function openAddInitDialog(data?: any, index?: any) { + if (typeof index !== 'undefined') { + currentIndex.value = index + } + + UserFieldFormDialogRef.value.open(data) +} + +function refreshInitFieldList(data: any) { + if (currentIndex.value !== null) { + form.value.init_field_list?.splice(currentIndex.value, 1, data) + } else { + form.value.init_field_list?.push(data) + } + currentIndex.value = null + UserFieldFormDialogRef.value.close() +} + +function refreshFunctionLib(data: any) { + form.value.icon = data + // console.log(data) +} + +function deleteInitField(index: any) { + form.value.init_field_list?.splice(index, 1) +} + +function openEditAvatar() { + EditAvatarDialogRef.value.open(form.value) +} + + const submit = async (formEl: FormInstance | undefined) => { if (!formEl) return await formEl.validate((valid: any) => { if (valid) { + // console.log(form.value) if (isEdit.value) { functionLibApi.putFunctionLib(form.value?.id as string, form.value, loading).then((res) => { MsgSuccess(t('common.editSuccess')) diff --git a/ui/src/views/function-lib/component/InitParamDrawer.vue b/ui/src/views/function-lib/component/InitParamDrawer.vue new file mode 100644 index 00000000000..f5923ca009f --- /dev/null +++ b/ui/src/views/function-lib/component/InitParamDrawer.vue @@ -0,0 +1,108 @@ + + + + diff --git a/ui/src/views/function-lib/component/PermissionDialog.vue b/ui/src/views/function-lib/component/PermissionDialog.vue new file mode 100644 index 00000000000..ca9104e9a2f --- /dev/null +++ b/ui/src/views/function-lib/component/PermissionDialog.vue @@ -0,0 +1,104 @@ + + + diff --git a/ui/src/views/function-lib/index.vue b/ui/src/views/function-lib/index.vue index 732b2c9de67..25ba3a03ac6 100644 --- a/ui/src/views/function-lib/index.vue +++ b/ui/src/views/function-lib/index.vue @@ -113,33 +113,7 @@

@@ -156,6 +174,8 @@

+ +
\ No newline at end of file diff --git a/ui/src/assets/fx/google_search/icon.png b/ui/src/assets/fx/google_search/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7b903159b0c47a6c56d9d23773fd2c7510282ebd GIT binary patch literal 6568 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 + + + + + + \ No newline at end of file diff --git a/ui/src/assets/fx/langsearch/icon.png b/ui/src/assets/fx/langsearch/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..72ca125f36681abc8a2bdd4085aeea02b3d339a8 GIT binary patch literal 68812 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 wy!SRsaA1 literal 0 HcmV?d00001 diff --git a/ui/src/assets/fx/langsearch/index.vue b/ui/src/assets/fx/langsearch/index.vue new file mode 100644 index 00000000000..c03b178d72b --- /dev/null +++ b/ui/src/assets/fx/langsearch/index.vue @@ -0,0 +1,29 @@ + + + \ No newline at end of file diff --git a/ui/src/locales/lang/en-US/common.ts b/ui/src/locales/lang/en-US/common.ts index 12f83c7fe2c..b00021ee03b 100644 --- a/ui/src/locales/lang/en-US/common.ts +++ b/ui/src/locales/lang/en-US/common.ts @@ -35,6 +35,7 @@ export default { private: 'Private', paramSetting: 'Parameter Settings', creator: 'Creator', + author: 'Author', debug: 'Debug', required: 'Required', noData: 'No data', diff --git a/ui/src/locales/lang/en-US/views/function-lib.ts b/ui/src/locales/lang/en-US/views/function-lib.ts index 2f56c94567d..1ca7103b3ed 100644 --- a/ui/src/locales/lang/en-US/views/function-lib.ts +++ b/ui/src/locales/lang/en-US/views/function-lib.ts @@ -1,5 +1,7 @@ export default { title: 'Function', + internalTitle: 'Internal Function', + added: 'Added', createFunction: 'Create Function', editFunction: 'Edit Function', copyFunction: 'Copy Function', diff --git a/ui/src/locales/lang/zh-CN/common.ts b/ui/src/locales/lang/zh-CN/common.ts index da89789ee54..ba790f2822a 100644 --- a/ui/src/locales/lang/zh-CN/common.ts +++ b/ui/src/locales/lang/zh-CN/common.ts @@ -35,6 +35,7 @@ export default { private: '私有', paramSetting: '参数设置', creator: '创建者', + author: '作者', debug: '调试', required: '必填', noData: '暂无数据', diff --git a/ui/src/locales/lang/zh-CN/views/function-lib.ts b/ui/src/locales/lang/zh-CN/views/function-lib.ts index 2ad28bad36d..ac6c00dce66 100644 --- a/ui/src/locales/lang/zh-CN/views/function-lib.ts +++ b/ui/src/locales/lang/zh-CN/views/function-lib.ts @@ -1,5 +1,7 @@ export default { title: '函数库', + internalTitle: '内置函数', + added: '已添加', createFunction: '创建函数', editFunction: '编辑函数', copyFunction: '复制函数', diff --git a/ui/src/locales/lang/zh-Hant/common.ts b/ui/src/locales/lang/zh-Hant/common.ts index ea4bbe118d5..5775f5813b0 100644 --- a/ui/src/locales/lang/zh-Hant/common.ts +++ b/ui/src/locales/lang/zh-Hant/common.ts @@ -35,6 +35,7 @@ export default { private: '私有', paramSetting: '參數設定', creator: '建立者', + author: '作者', debug: '調試', required: '必填', noData: '暂无数据', diff --git a/ui/src/locales/lang/zh-Hant/views/function-lib.ts b/ui/src/locales/lang/zh-Hant/views/function-lib.ts index f7c8eab4980..6b4a9b3392d 100644 --- a/ui/src/locales/lang/zh-Hant/views/function-lib.ts +++ b/ui/src/locales/lang/zh-Hant/views/function-lib.ts @@ -1,5 +1,7 @@ export default { title: '函數庫', + internalTitle: '內置函數', + added: '已新增', createFunction: '建立函數', editFunction: '編輯函數', copyFunction: '複製函數', diff --git a/ui/src/views/function-lib/component/EditAvatarDialog.vue b/ui/src/views/function-lib/component/EditAvatarDialog.vue index 0dd3189eb6e..21c96c4cd77 100644 --- a/ui/src/views/function-lib/component/EditAvatarDialog.vue +++ b/ui/src/views/function-lib/component/EditAvatarDialog.vue @@ -111,11 +111,8 @@ const onChange = (file: any) => { function submit() { if (radioType.value === 'default') { - // application.asyncPutApplication(props.id as string, { icon: defaultIcon }, loading).then((res: any) => { - // emit('refresh') - // MsgSuccess(t('views.applicationOverview.appInfo.EditAvatarDialog.setSuccess')) - // dialogVisible.value = false - // }) + emit('refresh', '/ui/favicon.ico') + dialogVisible.value = false } else if (radioType.value === 'custom' && iconFile.value) { let fd = new FormData() fd.append('file', iconFile.value.raw) diff --git a/ui/src/views/function-lib/component/FunctionDebugDrawer.vue b/ui/src/views/function-lib/component/FunctionDebugDrawer.vue index 84f81aff37a..45e2347904f 100644 --- a/ui/src/views/function-lib/component/FunctionDebugDrawer.vue +++ b/ui/src/views/function-lib/component/FunctionDebugDrawer.vue @@ -16,9 +16,9 @@ {{ $t('common.param.initParam') }} -
{{ item.name }} *{{ item.name }} * {{ item.type }}
@@ -114,18 +114,19 @@ import type { FormInstance } from 'element-plus' import DynamicsForm from '@/components/dynamics-form/index.vue' const FormRef = ref() +const dynamicsFormRef = ref() const loading = ref(false) const debugVisible = ref(false) const showResult = ref(false) const isSuccess = ref(false) const result = ref('') -const init_form_data = ref({}) const form = ref({ debug_field_list: [], code: '', input_field_list: [], - init_field_list: [] + init_field_list: [], + init_params: {} }) watch(debugVisible, (bool) => { @@ -137,14 +138,15 @@ watch(debugVisible, (bool) => { debug_field_list: [], code: '', input_field_list: [], - init_field_list: [] + init_field_list: [], + init_params: {} } } }) const submit = async (formEl: FormInstance | undefined) => { const validate = formEl ? formEl.validate() : Promise.resolve() - validate.then(() => { + Promise.all([dynamicsFormRef.value?.validate(), validate]).then(() => { functionLibApi.postFunctionLibDebug(form.value, loading).then((res) => { if (res.code === 500) { showResult.value = true diff --git a/ui/src/views/function-lib/component/FunctionFormDrawer.vue b/ui/src/views/function-lib/component/FunctionFormDrawer.vue index 95d748b00af..0e075608a8d 100644 --- a/ui/src/views/function-lib/component/FunctionFormDrawer.vue +++ b/ui/src/views/function-lib/component/FunctionFormDrawer.vue @@ -26,13 +26,13 @@ @mouseleave="showEditIcon = false" > - + +

diff --git a/ui/src/views/function-lib/component/InitParamDrawer.vue b/ui/src/views/function-lib/component/InitParamDrawer.vue index f5923ca009f..cbc895a0946 100644 --- a/ui/src/views/function-lib/component/InitParamDrawer.vue +++ b/ui/src/views/function-lib/component/InitParamDrawer.vue @@ -11,10 +11,10 @@

-
+
({}) const form = ref({ - init_field_list: [] + init_params: {} }) watch(debugVisible, (bool) => { @@ -63,17 +62,13 @@ watch(debugVisible, (bool) => { isSuccess.value = false result.value = '' form.value = { - init_field_list: [] + init_params: {} } } }) const submit = async () => { dynamicsFormRef.value.validate().then(() => { - form.value.init_field_list.forEach((item: any) => { - item.value = init_form_data.value[item.field] - }) - // console.log(init_form_data.value) functionLibApi.putFunctionLib(form.value?.id as string, form.value, loading) .then((res) => { MsgSuccess(t('common.editSuccess')) @@ -87,17 +82,15 @@ const open = (data: any) => { if (data) { form.value = cloneDeep(data) } - init_form_data.value = form.value.init_field_list + const init_params = form.value.init_field_list .map((item: any) => { - if (item.value) { - return { [item.field]: item.value } - } if (item.show_default_value === false) { return { [item.field]: undefined } } return { [item.field]: item.default_value } }) .reduce((x: any, y: any) => ({ ...x, ...y }), {}) + form.value.init_params = { ...init_params, ...form.value.init_params } debugVisible.value = true } diff --git a/ui/src/views/function-lib/index.vue b/ui/src/views/function-lib/index.vue index 25ba3a03ac6..d58165ebd22 100644 --- a/ui/src/views/function-lib/index.vue +++ b/ui/src/views/function-lib/index.vue @@ -1,7 +1,11 @@