diff --git a/packages/web_ui/src/components/InstanceViewPage.jsx b/packages/web_ui/src/components/InstanceViewPage.jsx index 116b7e54..af981afa 100644 --- a/packages/web_ui/src/components/InstanceViewPage.jsx +++ b/packages/web_ui/src/components/InstanceViewPage.jsx @@ -359,6 +359,23 @@ function InstanceConfigTree(props) { } let initialValues = {}; + function onValuesChange(changedValues) { + let newChangedFields = new Set(changedFields); + let changed = false; + for (let [key, value] of Object.entries(changedValues)) { + if (initialValues[key] === value) { + changed = newChangedFields.delete(key) || changed; + } else { + changed = !newChangedFields.has(key) || changed; + newChangedFields.add(key); + } + } + + if (changed) { + setChangedFields(newChangedFields); + } + } + let treeData = []; let propsMap = new Map(); for (let [name, GroupClass] of libConfig.InstanceConfig.groups) { @@ -387,6 +404,9 @@ function InstanceConfigTree(props) { name={propPath} label={`"${prop}"`} rules={[{ validator: (_, fieldValue) => { + if (!fieldValue.length) { + return Promise.reject(new Error("Will be removed")); + } try { JSON.parse(fieldValue); } catch (err) { @@ -403,6 +423,49 @@ function InstanceConfigTree(props) { propsMap.set(propPath, [fieldName, prop]); } + let newPropPath = `${group.name}.${def.name}:add`; + childNode.children.push({ + key: newPropPath, + title: + + + : + + + + + , + }); + } else { childNode.title = Config @@ -455,18 +501,20 @@ function InstanceConfigTree(props) { let request; if (propsMap.has(field)) { let [fieldName, prop] = propsMap.get(field); - try { - value = JSON.parse(value); - } catch (err) { - continue; - } - - request = libLink.messages.setInstanceConfigProp.send(control, { + let data = { instance_id: props.id, field: fieldName, prop, - value, - }); + }; + if (value) { + try { + data.value = JSON.parse(value); + } catch (err) { + continue; + } + } + + request = libLink.messages.setInstanceConfigProp.send(control, data); } else { request = libLink.messages.setInstanceConfigField.send(control, {