v1.1.9: expand dataDescriptor — nested map params as individual fields
This commit is contained in:
+1
-1
@@ -18,7 +18,7 @@ from routes.api import bp as api_bp
|
|||||||
from routes.api_test import bp as api_test_bp
|
from routes.api_test import bp as api_test_bp
|
||||||
|
|
||||||
# Версия — меняется при КАЖДОМ изменении кода. Показывается в топбаре UI.
|
# Версия — меняется при КАЖДОМ изменении кода. Показывается в топбаре UI.
|
||||||
VERSION = "1.1.8"
|
VERSION = "1.1.9"
|
||||||
|
|
||||||
app = Flask(__name__, template_folder="templates", static_folder="static")
|
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")
|
app.config["NUBES_API_ENDPOINT"] = os.getenv("NUBES_API_ENDPOINT", "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc")
|
||||||
|
|||||||
@@ -169,6 +169,28 @@ function showParams(opId,opName){
|
|||||||
input=`<select name="p_${p.svcOperationCfsParamId}" data-type="ref">${opts}</select>`;
|
input=`<select name="p_${p.svcOperationCfsParamId}" data-type="ref">${opts}</select>`;
|
||||||
}else if(p.dataType==='boolean'){
|
}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>`;
|
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{
|
}else{
|
||||||
const dt=isMap?'map':'';
|
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)"':''}>`;
|
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;
|
return;
|
||||||
}
|
}
|
||||||
const pp={};
|
const pp={};
|
||||||
|
const nested={}; // {parentKey: {subKey: value, ...}}
|
||||||
document.querySelectorAll('#params-form [name^="p_"]').forEach(el=>{
|
document.querySelectorAll('#params-form [name^="p_"]').forEach(el=>{
|
||||||
let v=el.value;
|
let v=el.value;
|
||||||
const dt=el.dataset.type||'';
|
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==='array'||dt.startsWith('array')) v=JSON.stringify([v]);
|
||||||
if(dt==='map'||dt==='map-fixed') v=v||'{}';
|
if(dt==='map'||dt==='map-fixed') v=v||'{}';
|
||||||
pp[el.name.replace('p_','')]=v;
|
pp[el.name.replace('p_','')]=v;
|
||||||
});
|
});
|
||||||
|
// Сериализовать вложенные объекты в JSON строки
|
||||||
|
for(const pk in nested) pp[pk]=JSON.stringify(nested[pk]);
|
||||||
executeOp(pp);
|
executeOp(pp);
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user