v1.1.9: expand dataDescriptor — nested map params as individual fields

This commit is contained in:
2026-07-28 13:38:57 +04:00
parent a3ecbcd6c4
commit d326b63aa2
2 changed files with 35 additions and 1 deletions
+1 -1
View File
@@ -18,7 +18,7 @@ from routes.api import bp as api_bp
from routes.api_test import bp as api_test_bp
# Версия — меняется при КАЖДОМ изменении кода. Показывается в топбаре UI.
VERSION = "1.1.8"
VERSION = "1.1.9"
app = Flask(__name__, template_folder="templates", static_folder="static")
app.config["NUBES_API_ENDPOINT"] = os.getenv("NUBES_API_ENDPOINT", "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc")
+34
View File
@@ -169,6 +169,28 @@ function showParams(opId,opName){
input=`<select name="p_${p.svcOperationCfsParamId}" data-type="ref">${opts}</select>`;
}else if(p.dataType==='boolean'){
input=`<select name="p_${p.svcOperationCfsParamId}" data-type="boolean"><option value="true" ${dfl==='true'||dfl===true?'selected':''}>true</option><option value="false" ${dfl==='false'||dfl===false?'selected':''}>false</option></select>`;
}else if(p.dataDescriptor&&isMap){
// Раскрыть dataDescriptor — вложенные поля вместо JSON-строки
const dd=p.dataDescriptor;
let subHtml='';
let dflObj={};
try{dflObj=JSON.parse(dfl||'{}');}catch(e){}
Object.keys(dd).forEach(subKey=>{
const sub=dd[subKey];
const subDfl=dflObj[subKey]!==undefined?dflObj[subKey]:'';
const subVl=sub.valueList;
let si;
if(subVl&&Array.isArray(subVl)){
si=`<select name="p_${p.svcOperationCfsParamId}.${subKey}" data-type="mapchild">${subVl.map(v=>`<option value="${_esc(v)}" ${v==subDfl?'selected':''}>${_esc(v)}</option>`).join('')}</select>`;
}else if(sub.dataType==='boolean'){
si=`<select name="p_${p.svcOperationCfsParamId}.${subKey}" data-type="mapchild"><option value="true" ${subDfl==='true'||subDfl===true?'selected':''}>true</option><option value="false" ${subDfl==='false'||subDfl===false?'selected':''}>false</option></select>`;
}else{
si=`<input type="text" name="p_${p.svcOperationCfsParamId}.${subKey}" value="${_esc(subDfl)}" data-type="mapchild">`;
}
subHtml+=`<div class="param-row"><label>${_esc(subKey)}</label>${si}</div>`;
});
input=`<div style="border-left:2px solid var(--brand-gray);margin-left:8px;padding:0 0 4px 8px;">${subHtml}</div>`;
return `<div class="param-row"><label class="${labelCls}">${_esc(p.name)}</label></div>${input}`;
}else{
const dt=isMap?'map':'';
input=`<input type="text" name="p_${p.svcOperationCfsParamId}" value="${_esc(dfl)}" data-type="${dt}" placeholder="${req&&!hasDfl?'обязательно':''}"${isMap?' onblur="validateJson(this)"':''}>`;
@@ -190,13 +212,25 @@ function showParams(opId,opName){
return;
}
const pp={};
const nested={}; // {parentKey: {subKey: value, ...}}
document.querySelectorAll('#params-form [name^="p_"]').forEach(el=>{
let v=el.value;
const dt=el.dataset.type||'';
if(dt==='mapchild'){
const name=el.name.replace('p_','');
const dot=name.indexOf('.');
const parentKey=name.substring(0,dot);
const subKey=name.substring(dot+1);
if(!nested[parentKey]) nested[parentKey]={};
nested[parentKey][subKey]=v;
return;
}
if(dt==='array'||dt.startsWith('array')) v=JSON.stringify([v]);
if(dt==='map'||dt==='map-fixed') v=v||'{}';
pp[el.name.replace('p_','')]=v;
});
// Сериализовать вложенные объекты в JSON строки
for(const pk in nested) pp[pk]=JSON.stringify(nested[pk]);
executeOp(pp);
};
});