SimpleChatTC:Trappable UiShowObjPropsEdit for custom handling

Use it to handle apiEP and iRecentUserMsgCnt in more user friendly
way, where they get a selection to choose from.
This commit is contained in:
hanishkvc 2025-10-20 15:35:34 +05:30
parent 3718a39c06
commit 6253c717b3
2 changed files with 33 additions and 51 deletions

View File

@ -1107,60 +1107,27 @@ class Me {
} }
/**
* Auto create ui input elements for fields in apiRequestOptions
* Currently supports text and number field types.
* @param {HTMLDivElement} elDiv
*/
show_settings_apirequestoptions(elDiv) {
let typeDict = {
"string": "text",
"number": "number",
};
let fs = document.createElement("fieldset");
let legend = document.createElement("legend");
legend.innerText = "ApiRequestOptions";
fs.appendChild(legend);
elDiv.appendChild(fs);
for(const k in this.apiRequestOptions) {
let val = this.apiRequestOptions[k];
let type = typeof(val);
if (((type == "string") || (type == "number"))) {
let inp = ui.el_creatediv_input(`Set${k}`, k, typeDict[type], this.apiRequestOptions[k], (val)=>{
if (type == "number") {
val = Number(val);
}
this.apiRequestOptions[k] = val;
});
fs.appendChild(inp.div);
} else if (type == "boolean") {
let bbtn = ui.el_creatediv_boolbutton(`Set{k}`, k, {true: "true", false: "false"}, val, (userVal)=>{
this.apiRequestOptions[k] = userVal;
});
fs.appendChild(bbtn.div);
}
}
}
/** /**
* Show settings ui for configurable parameters, in the passed Div element. * Show settings ui for configurable parameters, in the passed Div element.
* @param {HTMLDivElement} elDiv * @param {HTMLDivElement} elDiv
*/ */
show_settings(elDiv) { show_settings(elDiv) {
ui.ui_show_obj_props_edit(elDiv, this, ["baseURL", "headers", "bStream", "bTools", "apiRequestOptions", "apiEP", "iRecentUserMsgCnt", "bTrimGarbage", "bCompletionFreshChatAlways", "bCompletionInsertStandardRolePrefix"], "Settings") ui.ui_show_obj_props_edit(elDiv, this, ["baseURL", "headers", "bStream", "bTools", "apiRequestOptions", "TRAPME-apiEP", "TRAPME-iRecentUserMsgCnt", "bTrimGarbage", "bCompletionFreshChatAlways", "bCompletionInsertStandardRolePrefix"], "Settings", "TRAPME-", (tag, elParent)=>{
if (tag == "TRAPME-apiEP") {
let sel = ui.el_creatediv_select("SetApiEP", "ApiEndPoint", ApiEP.Type, this.apiEP, (val)=>{ let sel = ui.el_creatediv_select("SetApiEP", "ApiEndPoint", ApiEP.Type, this.apiEP, (val)=>{
// @ts-ignore // @ts-ignore
this.apiEP = ApiEP.Type[val]; this.apiEP = ApiEP.Type[val];
}); });
elDiv.appendChild(sel.div); elParent.appendChild(sel.div);
}
sel = ui.el_creatediv_select("SetChatHistoryInCtxt", "ChatHistoryInCtxt", this.sRecentUserMsgCnt, this.iRecentUserMsgCnt, (val)=>{ if (tag == "TRAPME-iRecentUserMsgCnt") {
this.iRecentUserMsgCnt = this.sRecentUserMsgCnt[val]; let sel = ui.el_creatediv_select("SetChatHistoryInCtxt", "ChatHistoryInCtxt", this.sRecentUserMsgCnt, this.iRecentUserMsgCnt, (val)=>{
}); this.iRecentUserMsgCnt = this.sRecentUserMsgCnt[val];
elDiv.appendChild(sel.div); });
elParent.appendChild(sel.div);
}
})
} }
} }

View File

@ -233,14 +233,21 @@ export function el_creatediv_input(id, label, type, defaultValue, cb, className=
/** /**
* Auto create ui input elements for fields in apiRequestOptions * Auto create ui input elements for specified fields/properties in given object
* Currently supports text and number field types. * Currently supports text, number, boolean field types.
* Also supports recursing if a object type field is found.
* For some reason if caller wants to handle certain properties on their own
* * prefix the prop name in lProps with sTrapTag
* * fTrapper will be called with the parent ui element
* into which the new ui elements created for editting the prop, if any, should be attached
* @param {HTMLDivElement|HTMLFieldSetElement} elDiv * @param {HTMLDivElement|HTMLFieldSetElement} elDiv
* @param {any} oObj * @param {any} oObj
* @param {Array<string>} lProps * @param {Array<string>} lProps
* @param {string} sLegend * @param {string} sLegend
* @param {string | undefined} sTrapTag
* @param {((tagPlusProp: string, elParent: HTMLFieldSetElement)=>void) | undefined} fTrapper
*/ */
export function ui_show_obj_props_edit(elDiv, oObj, lProps, sLegend) { export function ui_show_obj_props_edit(elDiv, oObj, lProps, sLegend, sTrapTag=undefined, fTrapper=undefined) {
let typeDict = { let typeDict = {
"string": "text", "string": "text",
"number": "number", "number": "number",
@ -251,6 +258,14 @@ export function ui_show_obj_props_edit(elDiv, oObj, lProps, sLegend) {
fs.appendChild(legend); fs.appendChild(legend);
elDiv.appendChild(fs); elDiv.appendChild(fs);
for(const k of lProps) { for(const k of lProps) {
if (sTrapTag) {
if (k.startsWith(sTrapTag)) {
if (fTrapper) {
fTrapper(k, fs)
}
continue
}
}
let val = oObj[k]; let val = oObj[k];
let type = typeof(val); let type = typeof(val);
if (((type == "string") || (type == "number"))) { if (((type == "string") || (type == "number"))) {