Skip to content

Commit ddc51dc

Browse files
committed
fix: Cleanup exposed_fields on field type change/delete
1 parent 3a94d0f commit ddc51dc

3 files changed

Lines changed: 37 additions & 12 deletions

File tree

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* 用户输入参数平铺白名单
3+
*
4+
* 只有这些 input_type 的字段可以被设置为外置参数(在聊天框上平铺显示)。
5+
* 改动这里会影响 3 个消费方,注意同步语义:
6+
* - UserInputTitleDialog.vue —— 齿轮弹窗中 select option 的 disabled 判断
7+
* - inline-params/index.vue —— 渲染时兜底过滤,防止白名单被绕过
8+
* - base-node/UserInputFieldTable.vue —— 字段类型变更/删除时清理脏数据
9+
*/
10+
export const ALLOWED_EXPOSED_TYPES = [
11+
'Model',
12+
'Knowledge',
13+
'SwitchInput',
14+
'DatePicker',
15+
'TreeSelect',
16+
'SingleSelect',
17+
'MultiSelect',
18+
'RadioCard',
19+
'RadioRow',
20+
] as const

ui/src/workflow/nodes/base-node/component/UserInputFieldTable.vue

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ import Sortable from 'sortablejs'
9696
import UserFieldFormDialog from './UserFieldFormDialog.vue'
9797
import { MsgError } from '@/utils/message'
9898
import { t } from '@/locales'
99+
import { ALLOWED_EXPOSED_TYPES } from '@/components/ai-chat/component/inline-params/constants'
99100
import UserInputTitleDialog from '@/workflow/nodes/base-node/component/UserInputTitleDialog.vue'
100101
import { input_type_list } from '@/components/dynamics-form/constructor/data'
101102
const props = defineProps<{ nodeModel: any }>()
@@ -110,6 +111,13 @@ function openAddDialog(data?: any, index?: any) {
110111
UserFieldFormDialogRef.value.open(data, index)
111112
}
112113
114+
function removeFromExposed(fieldName: string) {
115+
const setting = props.nodeModel.properties.user_input_field_list_setting
116+
if (setting?.exposed_fields?.includes(fieldName)) {
117+
setting.exposed_fields = setting.exposed_fields.filter((f: string) => f !== fieldName)
118+
}
119+
}
120+
113121
function openChangeTitleDialog() {
114122
UserInputTitleDialogRef.value.open(
115123
inputFieldConfig.value,
@@ -120,7 +128,11 @@ function openChangeTitleDialog() {
120128
}
121129
122130
function deleteField(index: any) {
131+
const removed = inputFieldList.value[index]
123132
inputFieldList.value.splice(index, 1)
133+
if (removed?.field) {
134+
removeFromExposed(removed.field)
135+
}
124136
props.nodeModel.graphModel.eventCenter.emit('refreshFieldList')
125137
onDragHandle()
126138
}
@@ -145,6 +157,9 @@ function refreshFieldList(data: any, index: any) {
145157
} else {
146158
inputFieldList.value.push(data)
147159
}
160+
if (!ALLOWED_EXPOSED_TYPES.includes(data.input_type)) {
161+
removeFromExposed(data.field)
162+
}
148163
UserFieldFormDialogRef.value.close()
149164
props.nodeModel.graphModel.eventCenter.emit('refreshFieldList')
150165
onDragHandle()

ui/src/workflow/nodes/base-node/component/UserInputTitleDialog.vue

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
:label="getFieldLabel(item)"
2525
:value="item.field"
2626
:disabled="
27-
!allowedTypes.includes(item.input_type) ||
27+
!ALLOWED_EXPOSED_TYPES.includes(item.input_type) ||
2828
(form.exposed_fields.length >= 3 && !form.exposed_fields.includes(item.field))
2929
"
3030
/>
@@ -53,6 +53,7 @@
5353
import { reactive, ref } from 'vue'
5454
import type { FormInstance } from 'element-plus'
5555
import { t } from '@/locales'
56+
import { ALLOWED_EXPOSED_TYPES } from '@/components/ai-chat/component/inline-params/constants'
5657
const emit = defineEmits(['refresh'])
5758
5859
const fieldFormRef = ref()
@@ -68,17 +69,6 @@ const rules = reactive({
6869
menu_title: [{ required: true, message: t('common.inputPlaceholder'), trigger: 'blur' }],
6970
})
7071
71-
const allowedTypes = [
72-
'Model',
73-
'Knowledge',
74-
'SwitchInput',
75-
'DatePicker',
76-
'TreeSelect',
77-
'SingleSelect',
78-
'MultiSelect',
79-
'RadioCard',
80-
'RadioRow',
81-
]
8272
const dialogVisible = ref<boolean>(false)
8373
8474
const getFieldLabel = (item: any) => {

0 commit comments

Comments
 (0)