44 * Licensed under the MIT License. See License.txt in the project root for license information.
55 *--------------------------------------------------------------------------------------------*/
66
7- import { useState } from 'react' ;
8- import { Button , Collapse , Popover } from 'antd' ;
9- import { PlusOutlined , QuestionCircleOutlined } from '@ant-design/icons' ;
7+ import React , { useEffect , useState } from 'react' ;
8+ import { Button , Collapse , Popover , Form } from 'antd' ;
9+ import { DeleteOutlined , EditOutlined , PlusOutlined , QuestionCircleOutlined } from '@ant-design/icons' ;
1010import { StartInputForm } from './StartInputForm.jsx' ;
1111import './style.css' ;
1212import { useConfigContext , useDispatch , useShapeContext } from '@/components/DefaultRoot.jsx' ;
@@ -16,7 +16,6 @@ import PropTypes from 'prop-types';
1616import { Trans , useTranslation } from 'react-i18next' ;
1717import { AppConfiguration } from '@/components/start/AppConfiguration.jsx' ;
1818import { JadeCollapse } from '@/components/common/JadeCollapse.jsx' ;
19- import IconTrashBin from '../asserts/icon-delete-trash-bin.svg?react' ; // 导入背景图片
2019
2120const { Panel} = Collapse ;
2221
@@ -51,6 +50,25 @@ export default function StartFormWrapper({data, shapeStatus}) {
5150 return isConfig ? items . map ( item => item . id ) : [ ] ;
5251 } ) ;
5352
53+ useEffect ( ( ) => {
54+ items . map ( item => {
55+ shape . page . registerObservable ( {
56+ nodeId : shape . id ,
57+ observableId : item . id ,
58+ value : item . name ,
59+ type : item . type ,
60+ parentId : undefined ,
61+ } ) ;
62+ } )
63+
64+ // 组件unmount时,删除observable.
65+ return ( ) => {
66+ items . map ( item => {
67+ shape . page . removeObservable ( shape . id , item . id ) ;
68+ } )
69+ } ;
70+ } , [ ] ) ;
71+
5472 // 添加新元素到 items 数组中,并将其 key 添加到当前展开的面板数组中
5573 const addItem = ( ) => {
5674 // 开始节点入参最大数量为20
@@ -68,27 +86,37 @@ export default function StartFormWrapper({data, shapeStatus}) {
6886 ?. config
6987 ?. find ( configItem => configItem . hasOwnProperty ( 'allowAdd' ) ) ; // 查找具有 "allowAdd" 属性的对象
7088 if ( configObject ? configObject . allowAdd : false ) {
89+ const inputParams = data . find ( item => item . name === 'input' ) ?. value ;
7190 return ( < >
7291 < Button disabled = { shapeStatus . disabled }
7392 type = "text"
7493 className = "icon-button jade-start-add-icon"
75- onClick = { addItem } >
94+ onClick = { ( event ) => {
95+ triggerAddInput ( event , inputParams ) ;
96+ } } >
7697 < PlusOutlined />
7798 </ Button >
7899 </ > ) ;
79100 }
80101 return null ;
81102 } ;
82103
83- const renderDeleteIcon = ( item ) => {
104+ const renderIcons = ( item ) => {
84105 if ( ! item . disableModifiable ) {
85106 return ( < >
107+ < Button
108+ disabled = { shape . status . disabled }
109+ type = "text"
110+ className = "icon-button start-node-edit-icon-button"
111+ onClick = { ( event ) => triggerEditInput ( event , item . id , item ) } >
112+ < EditOutlined />
113+ </ Button >
86114 < Button
87115 disabled = { shapeStatus . disabled }
88116 type = "text"
89117 className = "icon-button start-node-delete-icon-button"
90118 onClick = { ( ) => handleDelete ( item . id ) } >
91- < IconTrashBin />
119+ < DeleteOutlined />
92120 </ Button >
93121 </ > ) ;
94122 }
@@ -99,6 +127,7 @@ export default function StartFormWrapper({data, shapeStatus}) {
99127 const updatedOpenItems = openItems . filter ( ( key ) => key !== itemId ) ;
100128 setOpenItems ( updatedOpenItems ) ;
101129 dispatch ( { actionType : 'deleteInputParam' , id : itemId } ) ;
130+ shape . page . removeObservable ( shape . id , itemId )
102131 } ;
103132
104133 const content = ( < div className = { 'jade-font-size' } style = { { lineHeight : '1.2' } } >
@@ -128,50 +157,117 @@ export default function StartFormWrapper({data, shapeStatus}) {
128157 dispatch ( { actionType : 'changeMemorySwitch' , value : e } ) ;
129158 } ;
130159
160+ /**
161+ * 添加增加开始节点自定义参数的回调函数
162+ *
163+ * @param event 事件
164+ */
165+ const triggerAddInput = ( event , existParam ) => {
166+ event . preventDefault ( ) ;
167+ shape . page . triggerEvent ( {
168+ type : 'ADD_START_INPUT' ,
169+ value : {
170+ existParam : items ,
171+ onAdd : ( param ) => {
172+ dispatch ( {
173+ actionType : 'addParam' ,
174+ value : param ,
175+ } ) ;
176+ shape . page . registerObservable ( {
177+ nodeId : shape . id ,
178+ observableId : param . id ,
179+ value : param . name ,
180+ type : param . type ,
181+ parentId : undefined
182+ } ) ;
183+
184+ if ( isConfig ) {
185+ setOpenItems ( prev => [ ...prev , param . id ] ) ;
186+ }
187+ } ,
188+ } ,
189+ } ) ;
190+ event . stopPropagation ( ) ;
191+ } ;
192+
193+ /**
194+ * 添加修改开始节点自定义参数的回调函数
195+ *
196+ * @param event 事件
197+ */
198+ const triggerEditInput = ( event , id , selectedParam ) => {
199+ event . preventDefault ( ) ;
200+ shape . page . triggerEvent ( {
201+ type : 'EDIT_START_INPUT' ,
202+ value : {
203+ id : id ,
204+ selectedParam : selectedParam ,
205+ onEdit : ( param ) => {
206+ dispatch ( {
207+ actionType : 'editParam' ,
208+ value : param ,
209+ id : id ,
210+ } ) ;
211+ shape . emit ( id , { type : param . type , value : param . name } ) ;
212+ } ,
213+ } ,
214+ } ) ;
215+ event . stopPropagation ( ) ;
216+ } ;
217+
218+
131219 return ( < >
132220 < div >
133- < div style = { {
134- display : 'flex' ,
135- alignItems : 'center' ,
136- marginBottom : '8px' ,
137- paddingLeft : '8px' ,
138- paddingRight : '4px' ,
139- height : '32px' ,
140- } } >
141- < div className = "jade-panel-header-font" > { t ( 'input' ) } </ div >
142- < Popover
143- content = { content }
144- align = { { offset : [ 0 , 3 ] } }
145- overlayClassName = { 'jade-custom-popover' }
146- >
147- < QuestionCircleOutlined className = "jade-panel-header-popover-content" />
148- </ Popover >
149- { renderAddInputIcon ( ) }
150- </ div >
151221 < JadeCollapse
152- activeKey = { openItems }
153- onChange = { ( keys ) => setOpenItems ( keys ) }
154- style = { { backgroundColor : 'transparent' } } >
155- {
156- items . map ( ( item ) => (
157- < Panel
158- key = { item . id }
159- header = {
160- < div className = "panel-header" >
161- < span className = "jade-panel-header-font" > { item . name } </ span > { /* 显示Name值的元素 */ }
162- { renderDeleteIcon ( item ) }
163- </ div >
164- }
165- className = "jade-panel"
166- style = { { marginBottom : 8 , borderRadius : '8px' , width : '100%' } }
167- forceRender
222+ defaultActiveKey = { [ "startInput" ] }
223+ >
224+ < Panel
225+ key = { "startInput" }
226+ header = {
227+ < div style = { {
228+ display : 'flex' ,
229+ alignItems : 'center' ,
230+ paddingRight : '4px' ,
231+ height : '32px' ,
232+ } } >
233+ < div className = "jade-panel-header-font" > { t ( 'input' ) } </ div >
234+ < Popover
235+ content = { content }
236+ align = { { offset : [ 0 , 3 ] } }
237+ overlayClassName = { 'jade-custom-popover' }
168238 >
169- < div className = { 'jade-custom-panel-content' } >
170- < StartInputForm item = { item } items = { items } />
171- </ div >
172- </ Panel >
173- ) )
239+ < QuestionCircleOutlined className = "jade-panel-header-popover-content" />
240+ </ Popover >
241+ { renderAddInputIcon ( ) }
242+ </ div >
174243 }
244+ className = 'jade-panel'
245+ >
246+ { items . map ( ( item ) => (
247+ < Form . Item
248+ className = 'jade-input-item'
249+ name = { `input-${ item . id } ` }
250+ key = { item . id }
251+ >
252+ < div className = "param-item" >
253+ < div className = "param-row" >
254+ < div className = "param-left" >
255+ < div className = "param-name" > { item . name } </ div >
256+ < div className = "param-display-name" > { item . displayName } </ div >
257+ </ div >
258+ < div className = "param-right" >
259+ < div className = "param-type-wrapper" >
260+ < div className = "param-type" > { item . type } </ div >
261+ </ div >
262+ < div className = "param-icons" >
263+ { renderIcons ( item ) }
264+ </ div >
265+ </ div >
266+ </ div >
267+ </ div >
268+ </ Form . Item >
269+ ) ) }
270+ </ Panel >
175271 </ JadeCollapse >
176272
177273 < MultiConversation className = "jade-multi-conversation"
0 commit comments