@xuda.io/runtime-bundle 1.0.489 → 1.0.490

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,7 +2,7 @@
2
2
  ${refIdP.value}
3
3
  })(document.querySelector(\`[xu-ui-id=${elementP}]\`),evt)`,null,null,null,evt);await func.datasource.set_outputField(SESSION_ID,dsSessionP,result,args);return result},execute_evaluate_javascript:async function(){const module=await func.common.get_module(SESSION_ID,"xuda-event-javascript-module.mjs");const result=await module.run_javascript(SESSION_ID,jobNoP,dsSession,`(async function(el,evt) {
4
4
  ${refIdP.value}
5
- })(document.querySelector(\`[xu-ui-id=${elementP}]\`),evt)`,true,null,null,evt);await func.datasource.set_outputField(SESSION_ID,dsSessionP,result,args);return result},loader_on:async function(){glb.CURRENT_APP_LOADING=null;LOADER_ACTIVE=true;LOADER_TEXT=descP;func.events.delete_job(SESSION_ID,jobNoP)},loader_off:async function(){LOADER_ACTIVE=false;func.events.delete_job(SESSION_ID,jobNoP)},emit_event:async function(){if(refIdP.value){$(document).trigger(refIdP.value,[_session.DS_GLB[dsSession]])}else{func.utils.debug_report(SESSION_ID,"func.events.execute","Event name missing","E")}func.events.delete_job(SESSION_ID,jobNoP)},invoke_action:async function(){func.utils.debug.watch(SESSION_ID,calling_trigger_prop?.id,functionP,null,null,expCond);await func.action.execute(SESSION_ID,refIdP.value,_ds,null,null,jobNoP,containerP)},raise_event:async function(){var _ds=_session.DS_GLB[dsSession];const _view_obj=await func.utils.VIEWS_OBJ.get(SESSION_ID,_ds.prog_id);if(callingSourceP==="grid"||callingSourceP==="form"){let _field_obj=func.common.find_item_by_key(_view_obj.progFields,"field_id",field_elm);var event_name=_field_obj?.triggers?.[eventIdP].name.event;if(_field_obj?.triggers?.[eventIdP].name?.properties["xu-exp:event"]){event_name=(await func.expression.get(SESSION_ID,props[`xu-exp:event`],dsSession,"event_name expression")).result}if(field_elm&&event_name){const dsP=await func.datasource.find_event_dataSource(SESSION_ID,event_name,dsSession);return await func.datasource.run_events_functions(SESSION_ID,dsP,event_name,jobNoP,null,calling_trigger_prop?.data?.name?.parameters||{})}}if(callingSourceP.includes("event")){let event_name=refIdP.event;if(refIdP?.properties?.["xu-exp:event"]){event_name=(await func.expression.get(SESSION_ID,refIdP.properties["xu-exp:event"],dsSession,"event_name expression")).result}const dsP=await func.datasource.find_event_dataSource(SESSION_ID,event_name,dsSession);await func.datasource.run_events_functions(SESSION_ID,dsP,event_name,jobNoP,calling_trigger_prop?.props?.async,calling_trigger_prop?.data?.name?.parameters||{})}func.events.delete_job(SESSION_ID,jobNoP);func.utils.debug.watch(SESSION_ID,calling_trigger_prop?.id,functionP,"","",expCond)},get_data:async function(){const params_obj=await get_params_obj();if(!await get_prog_id()){func.utils.debug_report(SESSION_ID,"func.events.execute",`${elementP} > ${triggerP} > ${functionP} > program ${prog} is missing`,"E");func.events.delete_job(SESSION_ID,jobNoP);return}var _ds=_session.DS_GLB[dsSession];if(!_ds){func.events.delete_job(SESSION_ID,jobNoP);return}if(_ds){func.utils.debug.watch(SESSION_ID,calling_trigger_prop?.id,functionP,null,calling_trigger_prop,expCond);const ret=await func.datasource.create(SESSION_ID,await get_prog_id(),args.dataSourceNoP,args.parentDataSourceNoP,args.containerIdP,args.rowIdP,args.jobNoP,args.calling_trigger_prop,null,null,args.callingSourceP,args.calling_jobP,args.screen_dsP,args.is_panelP,params_obj);let _ds_new=_session.DS_GLB[ret.dsSessionP];let parameters=args?.calling_trigger_prop?.data?.name?.parameters;if(parameters&&!_.isEmpty(parameters)){await func.datasource.update_changes_for_out_parameter(SESSION_ID,_ds_new.dsSession,_ds.dsSession)}func.events.delete_job(SESSION_ID,jobNoP);return _ds_new}},set_data:async function(){return this.get_data()},batch:async function(){const result=await this.get_data();return result},update:async function(){const obj_values_to_update=func.datasource.get_viewFields_for_update_function(SESSION_ID,calling_trigger_prop,null,dsSessionP);if(!obj_values_to_update||_.isEmpty(obj_values_to_update)){func.utils.debug_report(SESSION_ID,"Update values object is empty","","W");if(jobNoP)func.events.delete_job(SESSION_ID,jobNoP);return}var updates=[];for await(const[key,val]of Object.entries(obj_values_to_update)){var $element;if(elementP){$element=$(`[xu-ui-id="${elementP}"]`).clone(true)}let ret_field_id=await func.expression.get(SESSION_ID,val.id.trim(),dsSessionP,"update",null,null,null,null,null,null,$element?.length?$element?.data()?.xuData?.iterate_info:null);let ret_value=await func.expression.get(SESSION_ID,val.val.trim(),dsSessionP,"update",null,null,null,null,null,null,$element?.length?$element?.data()?.xuData?.iterate_info:null);let _field_id=ret_field_id.result;let _value=ret_value.result;updates.push({_field_id:_field_id,_value:_value})}let datasource_changes={};for await(const change of updates){let ret_get_value=await func.datasource.get_value(SESSION_ID,change._field_id,dsSessionP);if(ret_get_value.found){let _ds=_session.DS_GLB[ret_get_value.dsSessionP];if(!datasource_changes[_ds.dsSession]){datasource_changes[_ds.dsSession]={}}if(!datasource_changes[_ds.dsSession][ret_get_value.currentRecordId]){datasource_changes[_ds.dsSession][ret_get_value.currentRecordId]={}}datasource_changes[_ds.dsSession][ret_get_value.currentRecordId][change._field_id]=change._value}}await func.datasource.update(SESSION_ID,datasource_changes);if(jobNoP)func.events.delete_job(SESSION_ID,jobNoP)},call_alert:async function(){await func.utils.alerts.invoke(SESSION_ID,"call_alert",refIdP,log_source,dsSession);func.events.delete_job(SESSION_ID,jobNoP)},alert:async function(){await func.utils.alerts.invoke(SESSION_ID,"alert",refIdP,log_source,dsSession);func.events.delete_job(SESSION_ID,jobNoP)},delay:async function(){return new Promise(resolve=>{setTimeout(function(){if(jobNoP)func.events.delete_job(SESSION_ID,jobNoP);resolve()},refIdP.value)})},comment:async function(){if(jobNoP)func.events.delete_job(SESSION_ID,jobNoP)},call_project_api:async function(){const params_obj=await get_params_obj();const _prog_id=await get_prog_id();if(!_prog_id){func.utils.debug_report(SESSION_ID,"func.events.execute",`${elementP} > ${triggerP} > ${functionP} > program not defined`,"E");func.events.delete_job(SESSION_ID,jobNoP);return}const api_ret=await func.api.call_project_api(_prog_id,params_obj);await func.datasource.set_outputField(SESSION_ID,dsSessionP,api_ret,args);func.events.delete_job(SESSION_ID,jobNoP)},call_system_api:async function(){const api_method=await func.datasource.get_args_property_value(SESSION_ID,dsSession,args,"api_method");if(!api_method){func.utils.debug_report(SESSION_ID,"func.events.execute",`${elementP} >${triggerP} >${functionP} > api_method not defined`,"E");func.events.delete_job(SESSION_ID,jobNoP);return}let payload={};const _payload=await func.datasource.get_args_property_value(SESSION_ID,dsSession,args,"payload");if(_payload){const get_payload_property_value=async function(prop_name){let _prop=_payload;let _value=_prop[prop_name];if(_prop?.[`xu-exp:${prop_name}`]){_value=(await func.expression.get(SESSION_ID,_prop[`xu-exp:${prop_name}`],dsSession,`${prop_name} expression`)).result}return _value};for await(let[key,val]of Object.entries(_payload)){const new_key=key.replaceAll("xu-exp:","");payload[new_key]=await get_payload_property_value(new_key)}}const output_field=await func.datasource.get_args_property_value(SESSION_ID,dsSession,args,"outputField");const api_ret=await func.api.call_system_api(api_method,payload);if(output_field){let datasource_changes={};let ret_get_value=await func.datasource.get_value(SESSION_ID,output_field,dsSessionP);if(ret_get_value.found){let _ds=_session.DS_GLB[ret_get_value.dsSessionP];if(!datasource_changes[_ds.dsSession]){datasource_changes[_ds.dsSession]={}}if(!datasource_changes[_ds.dsSession][ret_get_value.currentRecordId]){datasource_changes[_ds.dsSession][ret_get_value.currentRecordId]={}}datasource_changes[_ds.dsSession][ret_get_value.currentRecordId][output_field]=api_ret;await func.datasource.update(SESSION_ID,datasource_changes)}}func.events.delete_job(SESSION_ID,jobNoP)},call_external_api:async function(){const method=await func.datasource.get_args_property_value(SESSION_ID,dsSession,args,"method");if(!method){func.utils.debug_report(SESSION_ID,"func.events.execute",`${elementP} >${triggerP} >${functionP} > method not defined`,"E");func.events.delete_job(SESSION_ID,jobNoP);return}const url=await func.datasource.get_args_property_value(SESSION_ID,dsSession,args,"url");if(!url){func.utils.debug_report(SESSION_ID,"func.events.execute",`${elementP} >${triggerP} >${functionP} > url not defined`,"E");func.events.delete_job(SESSION_ID,jobNoP);return}const payload_arr=await func.datasource.get_args_property_value(SESSION_ID,dsSession,args,"payload");const report_conversion_error=function(res,typeP,valP){var msg=`${elementP} >${triggerP} >${functionP} > error converting from ${valP} to ${typeP}`;if(error){return func.utils.debug_report(SESSION_ID,msg,"","W")}func.utils.debug_report(SESSION_ID,msg+" "+_.capitalize(source)+prog_info,"","E")};const report_conversion_warn=function(res){var msg=`${elementP} >${triggerP} >${functionP} > type mismatch auto conversion from value ${valP} to ${typeP}`;func.utils.debug_report(SESSION_ID,msg+" "+_.capitalize(source)+prog_info,"","W")};if(error){return report_conversion_error()}const module=await func.common.get_module(SESSION_ID,"xuda-get-cast-util-module.mjs");var payload=_.reduce(payload_arr,(ret,val,key)=>{ret[val.key]=module.cast(val.type,val.val,report_conversion_error,report_conversion_warn);return ret},{});const output_field=await func.datasource.get_args_property_value(SESSION_ID,dsSession,args,"outputField");const api_ret=await func.api.call_external_api(method,url,payload);if(output_field){let datasource_changes={};let ret_get_value=await func.datasource.get_value(SESSION_ID,output_field,dsSessionP);if(ret_get_value.found){let _ds=_session.DS_GLB[ret_get_value.dsSessionP];if(!datasource_changes[_ds.dsSession]){datasource_changes[_ds.dsSession]={}}if(!datasource_changes[_ds.dsSession][ret_get_value.currentRecordId]){datasource_changes[_ds.dsSession][ret_get_value.currentRecordId]={}}datasource_changes[_ds.dsSession][ret_get_value.currentRecordId][output_field]=api_ret;await func.datasource.update(SESSION_ID,datasource_changes)}}func.events.delete_job(SESSION_ID,jobNoP)}};return await fx[functionP]()};func.events.delete_job=function(SESSION_ID,jobNoP){var _session=SESSION_OBJ[SESSION_ID];var job_index=func.events.find_job_index(SESSION_ID,jobNoP);if(!_session.WORKER_OBJ.jobs[job_index]){_session.WORKER_OBJ.stat=null;return}var dsSession=_session.WORKER_OBJ.jobs[job_index].dsSessionP;let ds_obj=_session?.DS_GLB[dsSession];if(ds_obj){delete SCREEN_BLOCKER_OBJ[ds_obj.screenId+(ds_obj.callingScreenId?"_"+ds_obj.callingScreenId:"")]}if(dsSession&&ds_obj?.loops_limit&&ds_obj?.loops_count<ds_obj?.loops_limit-1){return}_session.WORKER_OBJ.stat=null;_session.WORKER_OBJ.jobs.splice(job_index,1)};func.events.delete_job_0=function(SESSION_ID){var job_index=0;var _session=SESSION_OBJ[SESSION_ID];if(!_session.WORKER_OBJ.jobs[job_index]){_session.WORKER_OBJ.stat=null;return}var dsSession=_session.WORKER_OBJ.jobs[job_index].dsSession;let ds_obj=_session?.DS_GLB[dsSession];if(ds_obj){delete SCREEN_BLOCKER_OBJ[ds_obj.screenId+(ds_obj.callingScreenId?"_"+ds_obj.callingScreenId:"")]}if(dsSession&&ds_obj&&ds_obj.loops_limit&&ds_obj.loops_count<ds_obj.loops_limit-1){return}_session.WORKER_OBJ.stat=null;_session.WORKER_OBJ.jobs.splice(job_index,1)};func.events.check_jobs_idle=async function(SESSION_ID,jobsP){return new Promise((resolve,reject)=>{var _session=SESSION_OBJ[SESSION_ID];if(!jobsP||jobsP&&jobsP.length===0){resolve();return}var listener=setInterval(function(){var found;for(const[key,val]of Object.entries(jobsP)){_.forEach(_session.WORKER_OBJ.jobs,function(val2,key2){if(key2===val){found=true;return false}})}if(!found){do_callback();return}},100);var do_callback=function(){window.clearInterval(listener);resolve()}})};var loop_detected_obj={};setInterval(function(){loop_detected_obj={}},1e3);func.events.set_browser_changes=function(dsP,fieldsChangedP){if(fieldsChangedP.includes("SYS_GLOBAL_STR_BROWSER_TITLE"))document.title=dsP.dataset_new["SYS_GLOBAL_STR_BROWSER_TITLE"]};func.events.execute_PENDING_OPEN_URL_EVENTS=async function(){for(let[key,url]of Object.entries(PENDING_OPEN_URL_EVENTS)){if(url){glb.WINDOW_LOCATION_SEARCH=url;glb.ROOT_ELEMENT_ATTRIBUTES=func.UI.utils.get_root_element_attributes();const params_obj=func.common.getObjectFromUrl(url,glb.ROOT_ELEMENT_ATTRIBUTES);if(!params_obj.prog){return console.warn("prog empty")}await func.utils.TREE_OBJ.get(SESSION_ID,params_obj.prog);let screen_ret=await func.utils.get_screen_obj(SESSION_ID,params_obj.prog);if(screen_ret){await func.UI.screen.init(SESSION_ID,params_obj.prog,null,null,$("#embed_"+SESSION_ID),null,null,null,null,null,"pendingUrlEvent_embed")}else{console.error("Program not exist",params_obj.prog_id);func.UI.utils.progressScreen.show(SESSION_ID,"Program not exist",null,true)}}else{console.warn("url empty")}}};func.events.invoke=async function(event_id){var _session=SESSION_OBJ[SESSION_ID];if(!event_id){console.warn("event_id Cannot be empty");return false}var ds;for await(const[ds_key,val]of Object.entries(_session.DS_GLB)){const _view_obj=await func.utils.VIEWS_OBJ.get(SESSION_ID,val.prog_id);if(_.isEmpty(_view_obj.progEvents))continue;if(ds)break;for await(const[key,val]of Object.entries(_view_obj.progEvents)){if(val?.data?.type==="user_defined"&&val.data.event_name===event_id){ds=ds_key;break}}}if(!ds){console.warn("event_id not found");return false}func.events.validate(SESSION_ID,"user_defined",ds,event_id)};func.expression={};func.expression.get=async function(SESSION_ID,valP,dsSessionP,sourceP,rowIdP,sourceActionP,secondPassP,calling_fieldIdP,fieldsP,debug_infoP,iterate_info,js_script_callback,jobNo,api_output_type){class xu_class{async get(){var ret;var fields={};var error;var warning;function evalJson(text){return eval("("+text+")")}if(valP===null){ret=""}else{switch(typeof valP){case"string":ret=valP;break;case"undefined":ret="";break;case"boolean":ret=valP?"Y":"N";break;default:ret=valP.toString();break}}ret=ret.replace(/\&amp;/g,"&");ret=func.utils.replace_studio_drive_url(SESSION_ID,ret);const end_results=function(){const replace_quotes=function(ret){for(const[key,val]of Object.entries(fields)){if(typeof val==="string")ret=ret.replace('"'+val+'"',val.replace(/"/gi,""))}return ret};if(["update","javascript"].includes(sourceP)){if(typeof ret==="string")ret=replace_quotes(ret)}const log_error=function(){if(SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP]){func.utils.debug.log(SESSION_ID,SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP].nodeId,{module:"expression",action:sourceP,source:calling_fieldIdP,prop:ret,details:ret,result:ret,error:error,warning:warning,fields:null,type:"exp",prog_id:SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP].prog_id,debug_info:debug_infoP})}};if(error)log_error();return{result:ret,fields:fields,res:res,explain:result,error:error,warning:warning,req:valP,var_error_found:var_error_found}};const variable_not_exist=async function(){try{if(sourceP!=="arguments"){if(ret&&ret.substr(0,6)==="_DATE_"){ret=ret.substr(6)}else if(ret&&ret.length===10&&ret.substr(4,1)==="-"&&ret.substr(7,1)==="-"||ret==="self"){ret=ret}else{ret=await func.expression.secure_eval(SESSION_ID,sourceP,ret,jobNo,dsSessionP,js_script_callback)}return end_results()}else{ret=ret.replace(/_NULL/gi,"");return end_results()}}catch(err){return end_results()}};if(!func.expression.validate_variables(valP)){return await variable_not_exist()}const validate_email=async function(){const ret=await func.expression.secure_eval(SESSION_ID,sourceP,valP,jobNo,dsSessionP,js_script_callback);return glb.emailRegex.test(ret)};if(await validate_email()){return await variable_not_exist()}var var_Arr=[];const split=func.expression.parse(ret)||[];console.log(valP,split);for await(const[arr_key,val]of Object.entries(split)){const key=Number(arr_key);var_Arr[key]={};var_Arr[key].value=val.value;const replace_value_in_string=async function(retP,fieldIdP){if(iterate_info?.iterator_key===fieldIdP||iterate_info?.iterator_val===fieldIdP){if(iterate_info.iterator_key===fieldIdP){retP.value=iterate_info._key}if(iterate_info.iterator_val===fieldIdP){retP.value=iterate_info._val}}const set_value=function(valP){if(typeof valP!=="undefined"){var_Arr[key].value=valP;if(typeof valP==="string")var_Arr[key].type="string"}else{if(retP.type==="object"){var_Arr[key].value="";var_Arr[key].type="string"}}};if(sourceP==="exp"&&retP.type!=="exp"){var_Arr[key].type=retP.type;return}if(typeof retP.value!=="undefined"){var_Arr[key].type=retP.type;var_Arr[key].value=retP.value;if(val.value.indexOf("[")>-1|val.value.indexOf(".")>-1){var data=retP.prop;if(retP.type==="object")data=retP.value;var property1,property2;if(val.value.indexOf("[")===-1&&val.value.indexOf("]")>-1&&val.value.substr(0,1)==="@"){var prevData=var_Arr[key-1].value;var_Arr[key].value=prevData[data];if(val.value.indexOf(".")>-1){property2=await func.expression.get_property(val.value).property2;if(prevData[data])set_value(prevData[data][property2])}delete var_Arr[key-1]}else{property1=await func.expression.get_property(val.value).property1;property2=await func.expression.get_property(val.value).property2;if(property1){var_Arr[key].value=data[property1];if(property2){if(data[property1])set_value(data[property1][property2])}}if(property2&&!property1){if(data){set_value(data[property2])}}}fields[fieldIdP]=var_Arr[key].value;var_Arr[key].fieldId=fieldIdP}else{fields[fieldIdP]=var_Arr[key].value;var_Arr[key].fieldId=fieldIdP}}};if(val.fieldId){if(val.fieldId&&val.fieldId.substr(0,5)==="_THIS"&&calling_fieldIdP&&(val.fieldId.length===5||val.fieldId.length>5&&val.fieldId.substr(5,1)===".")){if(val.fieldId.length===5)val.fieldId=calling_fieldIdP;else val.fieldId=calling_fieldIdP+val.fieldId(5,val.fieldId.length-1)}if(!sourceP==="exp"){var_Arr[key].value='""'}fields[val.fieldId]=var_Arr[key].value;const ret=await func.datasource.get_value(SESSION_ID,val.fieldId,dsSessionP,rowIdP);await replace_value_in_string(ret.ret,ret.fieldIdP)}}try{var res=[];var exp_exist;var var_error_found;_.forEach(var_Arr,function(val,key){if(sourceP==="UI Property EXP"){let ret=func.utils.get_drive_url(SESSION_ID,val.value,true);if(ret.changed){res[key]=ret.value;return true}}if(sourceP==="UI Attr EXP"){let ret=func.utils.get_drive_url(SESSION_ID,val.value,var_Arr.length==1?false:true);if(ret.changed){res[key]=ret.value;return true}}if(val.type==="exp"){exp_exist=true}res[key]=val.value;if(var_Arr.length>1){if(!["DbQuery","alert","exp","api_rendered_output"].includes(sourceP)&&["string","date"].includes(val.type)){res[key]="`"+val.value+"`"}if(["api_rendered_output"].includes(sourceP)&&["json"].includes(api_output_type)&&["string","date"].includes(val.type)){res[key]=`"`+val.value+`"`}}if(val.fieldId&&val.value&&typeof val.value==="string"){if(["query","condition","range","sort","locate"].includes(sourceP)){if(val.value.indexOf("↵")>-1){res[key]=val.value.split("↵").join("")}res[key]=res[key].replace(/(\r\n|\n|\r)/gm,"")}if(["init","update","virtual"].includes(sourceP)){if(val.value.indexOf("↵")>-1)res[key]=val.value.split("↵").join("\n");res[key]=res[key].replace(/(\r\n|\n|\r)/gm,"\\n")}if(typeof IS_PROCESS_SERVER!=="undefined"){res[key]=res[key].replace(/(\r\n|\n|\r)/gm,"<br>")}fields[val.fieldId]=res[key]}if(typeof val.value==="object"&&var_Arr.length>1){if(!Array.isArray(val.value)&&!var_Arr[key+1].value?.includes(".")){res[key]="("+JSON.stringify(val.value)+")"}else{res[key]=JSON.stringify(val.value)}}if(!exp_exist&&sourceP!=="exp"&&val.value&&typeof val.value==="string"&&val.value.substr(0,1)==="@"){warning="Error encoding "+val.value;var_error_found=true;res[key]=0}});const join=function(arrP){return arrP.join("")};var exp=undefined;if(exp_exist&&sourceP!=="exp"){exp=await func.expression.get(SESSION_ID,join(res),dsSessionP,sourceP,rowIdP,sourceActionP,true,calling_fieldIdP,fields,debug_infoP);if(exp.res)res=exp.res;else res=[exp.result];fields=_.assignIn(exp.fields,fieldsP)}var result=join(res);if(res.length===1){result=res[0]}if(secondPassP){ret=result}else if(sourceP!=="exp"){if(res.length===1&&typeof res[0]==="string"&&typeof res[0]!=="object"){ret=join(res);if(ret&&ret.substr(0,1)==="@"){error="Error encoding @ var";var_error_found=true}}else{if(!["arguments","api_rendered_output","DbQuery"].includes(sourceP)){ret=await func.expression.secure_eval(SESSION_ID,sourceP,result,jobNo,dsSessionP,js_script_callback)}else{if(sourceP==="DbQuery"){ret=JSON.stringify(evalJson(result))}else{ret=result}}}}return end_results()}catch(err){ret=result;error=err.message;return end_results()}}}const new_class=new xu_class;return new_class.get()};func.expression.parse_org=function(strP){var extract_str=function(strP,posP){if(!posP)posP=0;var clean_split_str=function(arrP){var arr=[];if(arrP&&arrP.length>1&&arrP[0]===""&&arrP[1].indexOf("@")>-1){for(var i=1;i<=arrP.length;i++){arr.push(arrP[i])}return arr}else return arrP};var nonLettersPatt=/\W/;var validSymbolsNoArray=/[^.@\[]/;var validSymbolsWithArray=/[^.@"'\[\]]/;var validSymbols=validSymbolsNoArray;var splitTmp=strP.replace(/@/g,"^^@").split("^^");var split=clean_split_str(splitTmp);var obj=[];if(split){for(let val of split){if(val){var pos=strP.indexOf(val);if(val&&val.substr(0,1)==="@"){var tmpStr="";var word_start_pos=undefined;var word_end_pos=undefined;for(var i=0;i<=val.length;i++){var key1=i;var val1=val.substr(i,1);if(val1==="."&&!word_start_pos)word_start_pos=key1;if(word_start_pos&&key1>word_start_pos&&nonLettersPatt.test(val1))word_end_pos=key1;if(word_start_pos&&word_start_pos>=0&&word_end_pos&&word_end_pos>=0){var word=val.substr(word_start_pos+1,word_end_pos-word_start_pos-1);tmpStr=tmpStr.substr(0,word_start_pos)+"^^"+tmpStr.substr(word_start_pos,word_end_pos);if(val.substr(word_end_pos,1)===".")word_start_pos=word_end_pos;else word_start_pos=null;word_end_pos=null}if(val1==="[")validSymbols=validSymbolsWithArray;if(nonLettersPatt.test(val1)&&validSymbols.test(val1)&&tmpStr.indexOf("^^")===-1){tmpStr+="^^"+val1}else tmpStr+=val1}if(tmpStr.indexOf("^^")>-1){var obj1=extract_str(tmpStr,pos);obj=obj.concat(obj1)}else{var fieldId=undefined;if(val){fieldId=val.substr(1,val.length);if(val.indexOf(".")>-1)fieldId=val.substr(1,val.indexOf(".")-1);if(val.indexOf("[")>-1)fieldId=val.substr(1,val.indexOf("[")-1)}obj.push({value:val,fieldId:fieldId,pos:pos+posP})}}else{obj.push({value:val,pos:pos+posP})}}}return obj}};var res=extract_str(strP);return res};func.expression.parse_bad=function(strP){const nonLettersPatt=/\W/;const validSymbolsNoArray=/[^.@\[]/;const validSymbolsWithArray=/[^.@"'\[\]]/;function extractStr(str,startPos=0){const cleanSplit=arr=>arr?.length>1&&arr[0]===""&&arr[1].includes("@")?arr.slice(1):arr;const segments=cleanSplit(str.replace(/@/g,"^^@").split("^^"));const result=[];for(const val of segments||[]){if(!val)continue;const pos=str.indexOf(val)+startPos;if(val.startsWith("@")){let tmpStr="";let wordStart=null;let wordEnd=null;let validSymbols=validSymbolsNoArray;for(let i=0;i<val.length;i++){const char=val[i];if(char==="[")validSymbols=validSymbolsWithArray;if(char==="."&&wordStart===null)wordStart=i;else if(wordStart!==null&&nonLettersPatt.test(char))wordEnd=i;if(wordStart!==null&&wordEnd!==null){const word=val.slice(wordStart+1,wordEnd);tmpStr=tmpStr.slice(0,wordStart)+"^^"+tmpStr.slice(wordStart,wordEnd);wordStart=char==="."?wordEnd:null;wordEnd=null}tmpStr+=nonLettersPatt.test(char)&&validSymbols.test(char)&&!tmpStr.includes("^^")?"^^"+char:char}if(tmpStr.includes("^^")){result.push(...extractStr(tmpStr,pos))}else{const fieldIdMatch=val.match(/^@([^.\[]+)/);result.push({value:val,fieldId:fieldIdMatch?fieldIdMatch[1]:undefined,pos:pos})}}else{result.push({value:val,pos:pos})}}return result}return extractStr(strP)};func.expression.parse=function(input){if(typeof input!=="string")return[];const segments=[];let pos=0;const parts=input.split(/(@\w+)/).filter(Boolean);for(const part of parts){if(part.startsWith("@")){const fieldId=part.slice(1);segments.push({value:part,fieldId:fieldId,pos:pos})}else{segments.push({value:part,pos:pos})}pos+=part.length}return segments};func.expression.get_property=async function(valP){async function secure_eval(val){if(typeof IS_PROCESS_SERVER==="undefined"){try{return eval(val)}catch(err){console.error(err);return}}try{let vm=new VM.VM({sandbox:{func:func,SESSION_ID:SESSION_ID,SESSION_OBJ:{[`${SESSION_ID}`]:SESSION_OBJ[SESSION_ID]}},timeout:1e3,allowAsync:false});return await vm.run(val)}catch(err){throw""}}var property1,property2;if(valP.indexOf("[")>-1&&valP.indexOf("]")>-1){property1=valP.substr(valP.indexOf("[")+1,valP.indexOf("]")-valP.indexOf("[")-1);property1=await secure_eval(property1)}if(valP.indexOf(".")>-1)property2=valP.substr(valP.indexOf(".")+1,valP.length);return{property1:property1,property2:property2}};func.expression.validate_constant=function(valP){var patt=/["']/;if(typeof valP==="string"&&patt.test(valP.substr(0,1))&&patt.test(valP.substr(0,valP.length-1)))return true;else return false};func.expression.validate_variables=function(valP){if(typeof valP==="string"&&valP.indexOf("@")>-1)return true;else return false};func.expression.remove_quotes=function(valP){if(func.expression.validate_constant(valP))return valP.substr(1,valP.length-2);else return valP};func.expression.secure_eval=async function(SESSION_ID,sourceP,val,job_id,dsSessionP,js_script_callback,evt){const api_utils=await func.common.get_module(SESSION_ID,"xuda-api-library.mjs",{func:func,glb:glb,SESSION_OBJ:SESSION_OBJ,SESSION_ID:SESSION_ID,APP_OBJ:APP_OBJ,dsSession:dsSessionP,job_id:job_id});const xu=api_utils;if(typeof IS_PROCESS_SERVER==="undefined"&&typeof IS_DOCKER==="undefined"){try{return eval(val)}catch(err){try{return JSON5.parse(val)}catch(err){return val}}}if(sourceP==="javascript"){process.on("uncaughtException",err=>{console.error("Asynchronous error caught.",err);func.events.delete_job(SESSION_ID,job_id);if(typeof IS_PROCESS_SERVER!=="undefined"||typeof IS_DOCKER!=="undefined"){if(SESSION_OBJ[SESSION_ID].crawler)return;return __.rpi.write_log(SESSION_OBJ[SESSION_ID].app_id,"error","worker","vm error",err,null,val,"func.expression.get.secure_eval")}});try{const dir=path.join(_conf.studio_drive_path,SESSION_OBJ[SESSION_ID].app_id,"node_modules","/");const script=new VM.VMScript(`try{${val}}catch(e){func.api.error(SESSION_ID, "nodejs error", e); console.error(e); func.events.delete_job(SESSION_ID, job_id);}`,{filename:dir,dirname:dir});let vm=new VM.NodeVM({require:{external:true},sandbox:{func:func,xu:xu,SESSION_ID:SESSION_ID,SESSION_OBJ:{[`${SESSION_ID}`]:SESSION_OBJ[SESSION_ID]},callback:js_script_callback,job_id:job_id,axios:axios,got:got,FormData:FormData},timeout:6e4});return await vm.run(script,{filename:dir,dirname:dir})}catch(err){console.error("Failed to execute script.",err);if(typeof IS_PROCESS_SERVER!=="undefined"){func.events.delete_job(SESSION_ID,jobNo);return __.db.add_error_log(SESSION_OBJ[SESSION_ID].app_id,"api",err)}}}else{try{try{let vm=new VM.VM({sandbox:{xu:xu,func:func,SESSION_ID:SESSION_ID,SESSION_OBJ:{[`${SESSION_ID}`]:SESSION_OBJ[SESSION_ID]},callback:js_script_callback,job_id:job_id},timeout:1e3,allowAsync:false});let ret=val;if(typeof val==="string"){ret=await vm.run(val)}return ret}catch(err){throw""}}catch(err){try{return JSON5.parse(val)}catch(err){return val}}}}; export default {
5
+ })(document.querySelector(\`[xu-ui-id=${elementP}]\`),evt)`,true,null,null,evt);await func.datasource.set_outputField(SESSION_ID,dsSessionP,result,args);return result},loader_on:async function(){glb.CURRENT_APP_LOADING=null;LOADER_ACTIVE=true;LOADER_TEXT=descP;func.events.delete_job(SESSION_ID,jobNoP)},loader_off:async function(){LOADER_ACTIVE=false;func.events.delete_job(SESSION_ID,jobNoP)},emit_event:async function(){if(refIdP.value){$(document).trigger(refIdP.value,[_session.DS_GLB[dsSession]])}else{func.utils.debug_report(SESSION_ID,"func.events.execute","Event name missing","E")}func.events.delete_job(SESSION_ID,jobNoP)},invoke_action:async function(){func.utils.debug.watch(SESSION_ID,calling_trigger_prop?.id,functionP,null,null,expCond);await func.action.execute(SESSION_ID,refIdP.value,_ds,null,null,jobNoP,containerP)},raise_event:async function(){var _ds=_session.DS_GLB[dsSession];const _view_obj=await func.utils.VIEWS_OBJ.get(SESSION_ID,_ds.prog_id);if(callingSourceP==="grid"||callingSourceP==="form"){let _field_obj=func.common.find_item_by_key(_view_obj.progFields,"field_id",field_elm);var event_name=_field_obj?.triggers?.[eventIdP].name.event;if(_field_obj?.triggers?.[eventIdP].name?.properties["xu-exp:event"]){event_name=(await func.expression.get(SESSION_ID,props[`xu-exp:event`],dsSession,"event_name expression")).result}if(field_elm&&event_name){const dsP=await func.datasource.find_event_dataSource(SESSION_ID,event_name,dsSession);return await func.datasource.run_events_functions(SESSION_ID,dsP,event_name,jobNoP,null,calling_trigger_prop?.data?.name?.parameters||{})}}if(callingSourceP.includes("event")){let event_name=refIdP.event;if(refIdP?.properties?.["xu-exp:event"]){event_name=(await func.expression.get(SESSION_ID,refIdP.properties["xu-exp:event"],dsSession,"event_name expression")).result}const dsP=await func.datasource.find_event_dataSource(SESSION_ID,event_name,dsSession);await func.datasource.run_events_functions(SESSION_ID,dsP,event_name,jobNoP,calling_trigger_prop?.props?.async,calling_trigger_prop?.data?.name?.parameters||{})}func.events.delete_job(SESSION_ID,jobNoP);func.utils.debug.watch(SESSION_ID,calling_trigger_prop?.id,functionP,"","",expCond)},get_data:async function(){const params_obj=await get_params_obj();if(!await get_prog_id()){func.utils.debug_report(SESSION_ID,"func.events.execute",`${elementP} > ${triggerP} > ${functionP} > program ${prog} is missing`,"E");func.events.delete_job(SESSION_ID,jobNoP);return}var _ds=_session.DS_GLB[dsSession];if(!_ds){func.events.delete_job(SESSION_ID,jobNoP);return}if(_ds){func.utils.debug.watch(SESSION_ID,calling_trigger_prop?.id,functionP,null,calling_trigger_prop,expCond);const ret=await func.datasource.create(SESSION_ID,await get_prog_id(),args.dataSourceNoP,args.parentDataSourceNoP,args.containerIdP,args.rowIdP,args.jobNoP,args.calling_trigger_prop,null,null,args.callingSourceP,args.calling_jobP,args.screen_dsP,args.is_panelP,params_obj);let _ds_new=_session.DS_GLB[ret.dsSessionP];let parameters=args?.calling_trigger_prop?.data?.name?.parameters;if(parameters&&!_.isEmpty(parameters)){await func.datasource.update_changes_for_out_parameter(SESSION_ID,_ds_new.dsSession,_ds.dsSession)}func.events.delete_job(SESSION_ID,jobNoP);return _ds_new}},set_data:async function(){return this.get_data()},batch:async function(){const result=await this.get_data();return result},update:async function(){const obj_values_to_update=func.datasource.get_viewFields_for_update_function(SESSION_ID,calling_trigger_prop,null,dsSessionP);if(!obj_values_to_update||_.isEmpty(obj_values_to_update)){func.utils.debug_report(SESSION_ID,"Update values object is empty","","W");if(jobNoP)func.events.delete_job(SESSION_ID,jobNoP);return}var updates=[];for await(const[key,val]of Object.entries(obj_values_to_update)){var $element;if(elementP){$element=$(`[xu-ui-id="${elementP}"]`).clone(true)}let ret_field_id=await func.expression.get(SESSION_ID,val.id.trim(),dsSessionP,"update",null,null,null,null,null,null,$element?.length?$element?.data()?.xuData?.iterate_info:null);let ret_value=await func.expression.get(SESSION_ID,val.val.trim(),dsSessionP,"update",null,null,null,null,null,null,$element?.length?$element?.data()?.xuData?.iterate_info:null);let _field_id=ret_field_id.result;let _value=ret_value.result;updates.push({_field_id:_field_id,_value:_value})}let datasource_changes={};for await(const change of updates){let ret_get_value=await func.datasource.get_value(SESSION_ID,change._field_id,dsSessionP);if(ret_get_value.found){let _ds=_session.DS_GLB[ret_get_value.dsSessionP];if(!datasource_changes[_ds.dsSession]){datasource_changes[_ds.dsSession]={}}if(!datasource_changes[_ds.dsSession][ret_get_value.currentRecordId]){datasource_changes[_ds.dsSession][ret_get_value.currentRecordId]={}}datasource_changes[_ds.dsSession][ret_get_value.currentRecordId][change._field_id]=change._value}}await func.datasource.update(SESSION_ID,datasource_changes);if(jobNoP)func.events.delete_job(SESSION_ID,jobNoP)},call_alert:async function(){await func.utils.alerts.invoke(SESSION_ID,"call_alert",refIdP,log_source,dsSession);func.events.delete_job(SESSION_ID,jobNoP)},alert:async function(){await func.utils.alerts.invoke(SESSION_ID,"alert",refIdP,log_source,dsSession);func.events.delete_job(SESSION_ID,jobNoP)},delay:async function(){return new Promise(resolve=>{setTimeout(function(){if(jobNoP)func.events.delete_job(SESSION_ID,jobNoP);resolve()},refIdP.value)})},comment:async function(){if(jobNoP)func.events.delete_job(SESSION_ID,jobNoP)},call_project_api:async function(){const params_obj=await get_params_obj();const _prog_id=await get_prog_id();if(!_prog_id){func.utils.debug_report(SESSION_ID,"func.events.execute",`${elementP} > ${triggerP} > ${functionP} > program not defined`,"E");func.events.delete_job(SESSION_ID,jobNoP);return}const api_ret=await func.api.call_project_api(_prog_id,params_obj);await func.datasource.set_outputField(SESSION_ID,dsSessionP,api_ret,args);func.events.delete_job(SESSION_ID,jobNoP)},call_system_api:async function(){const api_method=await func.datasource.get_args_property_value(SESSION_ID,dsSession,args,"api_method");if(!api_method){func.utils.debug_report(SESSION_ID,"func.events.execute",`${elementP} >${triggerP} >${functionP} > api_method not defined`,"E");func.events.delete_job(SESSION_ID,jobNoP);return}let payload={};const _payload=await func.datasource.get_args_property_value(SESSION_ID,dsSession,args,"payload");if(_payload){const get_payload_property_value=async function(prop_name){let _prop=_payload;let _value=_prop[prop_name];if(_prop?.[`xu-exp:${prop_name}`]){_value=(await func.expression.get(SESSION_ID,_prop[`xu-exp:${prop_name}`],dsSession,`${prop_name} expression`)).result}return _value};for await(let[key,val]of Object.entries(_payload)){const new_key=key.replaceAll("xu-exp:","");payload[new_key]=await get_payload_property_value(new_key)}}const output_field=await func.datasource.get_args_property_value(SESSION_ID,dsSession,args,"outputField");const api_ret=await func.api.call_system_api(api_method,payload);if(output_field){let datasource_changes={};let ret_get_value=await func.datasource.get_value(SESSION_ID,output_field,dsSessionP);if(ret_get_value.found){let _ds=_session.DS_GLB[ret_get_value.dsSessionP];if(!datasource_changes[_ds.dsSession]){datasource_changes[_ds.dsSession]={}}if(!datasource_changes[_ds.dsSession][ret_get_value.currentRecordId]){datasource_changes[_ds.dsSession][ret_get_value.currentRecordId]={}}datasource_changes[_ds.dsSession][ret_get_value.currentRecordId][output_field]=api_ret;await func.datasource.update(SESSION_ID,datasource_changes)}}func.events.delete_job(SESSION_ID,jobNoP)},call_external_api:async function(){const method=await func.datasource.get_args_property_value(SESSION_ID,dsSession,args,"method");if(!method){func.utils.debug_report(SESSION_ID,"func.events.execute",`${elementP} >${triggerP} >${functionP} > method not defined`,"E");func.events.delete_job(SESSION_ID,jobNoP);return}const url=await func.datasource.get_args_property_value(SESSION_ID,dsSession,args,"url");if(!url){func.utils.debug_report(SESSION_ID,"func.events.execute",`${elementP} >${triggerP} >${functionP} > url not defined`,"E");func.events.delete_job(SESSION_ID,jobNoP);return}const payload_arr=await func.datasource.get_args_property_value(SESSION_ID,dsSession,args,"payload");const report_conversion_error=function(res,typeP,valP){var msg=`${elementP} >${triggerP} >${functionP} > error converting from ${valP} to ${typeP}`;if(error){return func.utils.debug_report(SESSION_ID,msg,"","W")}func.utils.debug_report(SESSION_ID,msg+" "+_.capitalize(source)+prog_info,"","E")};const report_conversion_warn=function(res){var msg=`${elementP} >${triggerP} >${functionP} > type mismatch auto conversion from value ${valP} to ${typeP}`;func.utils.debug_report(SESSION_ID,msg+" "+_.capitalize(source)+prog_info,"","W")};if(error){return report_conversion_error()}const module=await func.common.get_module(SESSION_ID,"xuda-get-cast-util-module.mjs");var payload=_.reduce(payload_arr,(ret,val,key)=>{ret[val.key]=module.cast(val.type,val.val,report_conversion_error,report_conversion_warn);return ret},{});const output_field=await func.datasource.get_args_property_value(SESSION_ID,dsSession,args,"outputField");const api_ret=await func.api.call_external_api(method,url,payload);if(output_field){let datasource_changes={};let ret_get_value=await func.datasource.get_value(SESSION_ID,output_field,dsSessionP);if(ret_get_value.found){let _ds=_session.DS_GLB[ret_get_value.dsSessionP];if(!datasource_changes[_ds.dsSession]){datasource_changes[_ds.dsSession]={}}if(!datasource_changes[_ds.dsSession][ret_get_value.currentRecordId]){datasource_changes[_ds.dsSession][ret_get_value.currentRecordId]={}}datasource_changes[_ds.dsSession][ret_get_value.currentRecordId][output_field]=api_ret;await func.datasource.update(SESSION_ID,datasource_changes)}}func.events.delete_job(SESSION_ID,jobNoP)}};return await fx[functionP]()};func.events.delete_job=function(SESSION_ID,jobNoP){var _session=SESSION_OBJ[SESSION_ID];var job_index=func.events.find_job_index(SESSION_ID,jobNoP);if(!_session.WORKER_OBJ.jobs[job_index]){_session.WORKER_OBJ.stat=null;return}var dsSession=_session.WORKER_OBJ.jobs[job_index].dsSessionP;let ds_obj=_session?.DS_GLB[dsSession];if(ds_obj){delete SCREEN_BLOCKER_OBJ[ds_obj.screenId+(ds_obj.callingScreenId?"_"+ds_obj.callingScreenId:"")]}if(dsSession&&ds_obj?.loops_limit&&ds_obj?.loops_count<ds_obj?.loops_limit-1){return}_session.WORKER_OBJ.stat=null;_session.WORKER_OBJ.jobs.splice(job_index,1)};func.events.delete_job_0=function(SESSION_ID){var job_index=0;var _session=SESSION_OBJ[SESSION_ID];if(!_session.WORKER_OBJ.jobs[job_index]){_session.WORKER_OBJ.stat=null;return}var dsSession=_session.WORKER_OBJ.jobs[job_index].dsSession;let ds_obj=_session?.DS_GLB[dsSession];if(ds_obj){delete SCREEN_BLOCKER_OBJ[ds_obj.screenId+(ds_obj.callingScreenId?"_"+ds_obj.callingScreenId:"")]}if(dsSession&&ds_obj&&ds_obj.loops_limit&&ds_obj.loops_count<ds_obj.loops_limit-1){return}_session.WORKER_OBJ.stat=null;_session.WORKER_OBJ.jobs.splice(job_index,1)};func.events.check_jobs_idle=async function(SESSION_ID,jobsP){return new Promise((resolve,reject)=>{var _session=SESSION_OBJ[SESSION_ID];if(!jobsP||jobsP&&jobsP.length===0){resolve();return}var listener=setInterval(function(){var found;for(const[key,val]of Object.entries(jobsP)){_.forEach(_session.WORKER_OBJ.jobs,function(val2,key2){if(key2===val){found=true;return false}})}if(!found){do_callback();return}},100);var do_callback=function(){window.clearInterval(listener);resolve()}})};var loop_detected_obj={};setInterval(function(){loop_detected_obj={}},1e3);func.events.set_browser_changes=function(dsP,fieldsChangedP){if(fieldsChangedP.includes("SYS_GLOBAL_STR_BROWSER_TITLE"))document.title=dsP.dataset_new["SYS_GLOBAL_STR_BROWSER_TITLE"]};func.events.execute_PENDING_OPEN_URL_EVENTS=async function(){for(let[key,url]of Object.entries(PENDING_OPEN_URL_EVENTS)){if(url){glb.WINDOW_LOCATION_SEARCH=url;glb.ROOT_ELEMENT_ATTRIBUTES=func.UI.utils.get_root_element_attributes();const params_obj=func.common.getObjectFromUrl(url,glb.ROOT_ELEMENT_ATTRIBUTES);if(!params_obj.prog){return console.warn("prog empty")}await func.utils.TREE_OBJ.get(SESSION_ID,params_obj.prog);let screen_ret=await func.utils.get_screen_obj(SESSION_ID,params_obj.prog);if(screen_ret){await func.UI.screen.init(SESSION_ID,params_obj.prog,null,null,$("#embed_"+SESSION_ID),null,null,null,null,null,"pendingUrlEvent_embed")}else{console.error("Program not exist",params_obj.prog_id);func.UI.utils.progressScreen.show(SESSION_ID,"Program not exist",null,true)}}else{console.warn("url empty")}}};func.events.invoke=async function(event_id){var _session=SESSION_OBJ[SESSION_ID];if(!event_id){console.warn("event_id Cannot be empty");return false}var ds;for await(const[ds_key,val]of Object.entries(_session.DS_GLB)){const _view_obj=await func.utils.VIEWS_OBJ.get(SESSION_ID,val.prog_id);if(_.isEmpty(_view_obj.progEvents))continue;if(ds)break;for await(const[key,val]of Object.entries(_view_obj.progEvents)){if(val?.data?.type==="user_defined"&&val.data.event_name===event_id){ds=ds_key;break}}}if(!ds){console.warn("event_id not found");return false}func.events.validate(SESSION_ID,"user_defined",ds,event_id)};func.expression={};func.expression.get_org=async function(SESSION_ID,valP,dsSessionP,sourceP,rowIdP,sourceActionP,secondPassP,calling_fieldIdP,fieldsP,debug_infoP,iterate_info,js_script_callback,jobNo,api_output_type){class xu_class{async get(){var ret;var fields={};var error;var warning;function evalJson(text){return eval("("+text+")")}if(valP===null){ret=""}else{switch(typeof valP){case"string":ret=valP;break;case"undefined":ret="";break;case"boolean":ret=valP?"Y":"N";break;default:ret=valP.toString();break}}ret=ret.replace(/\&amp;/g,"&");ret=func.utils.replace_studio_drive_url(SESSION_ID,ret);const end_results=function(){const replace_quotes=function(ret){for(const[key,val]of Object.entries(fields)){if(typeof val==="string")ret=ret.replace('"'+val+'"',val.replace(/"/gi,""))}return ret};if(["update","javascript"].includes(sourceP)){if(typeof ret==="string")ret=replace_quotes(ret)}const log_error=function(){if(SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP]){func.utils.debug.log(SESSION_ID,SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP].nodeId,{module:"expression",action:sourceP,source:calling_fieldIdP,prop:ret,details:ret,result:ret,error:error,warning:warning,fields:null,type:"exp",prog_id:SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP].prog_id,debug_info:debug_infoP})}};if(error)log_error();return{result:ret,fields:fields,res:res,explain:result,error:error,warning:warning,req:valP,var_error_found:var_error_found}};const variable_not_exist=async function(){try{if(sourceP!=="arguments"){if(ret&&ret.substr(0,6)==="_DATE_"){ret=ret.substr(6)}else if(ret&&ret.length===10&&ret.substr(4,1)==="-"&&ret.substr(7,1)==="-"||ret==="self"){ret=ret}else{ret=await func.expression.secure_eval(SESSION_ID,sourceP,ret,jobNo,dsSessionP,js_script_callback)}return end_results()}else{ret=ret.replace(/_NULL/gi,"");return end_results()}}catch(err){return end_results()}};if(!func.expression.validate_variables(valP)){return await variable_not_exist()}const validate_email=async function(){const ret=await func.expression.secure_eval(SESSION_ID,sourceP,valP,jobNo,dsSessionP,js_script_callback);return glb.emailRegex.test(ret)};if(await validate_email()){return await variable_not_exist()}var var_Arr=[];const split=func.expression.parse(ret)||[];for await(const[arr_key,val]of Object.entries(split)){const key=Number(arr_key);var_Arr[key]={};var_Arr[key].value=val.value;const replace_value_in_string=async function(retP,fieldIdP){if(iterate_info?.iterator_key===fieldIdP||iterate_info?.iterator_val===fieldIdP){if(iterate_info.iterator_key===fieldIdP){retP.value=iterate_info._key}if(iterate_info.iterator_val===fieldIdP){retP.value=iterate_info._val}}const set_value=function(valP){if(typeof valP!=="undefined"){var_Arr[key].value=valP;if(typeof valP==="string")var_Arr[key].type="string"}else{if(retP.type==="object"){var_Arr[key].value="";var_Arr[key].type="string"}}};if(sourceP==="exp"&&retP.type!=="exp"){var_Arr[key].type=retP.type;return}if(typeof retP.value!=="undefined"){var_Arr[key].type=retP.type;var_Arr[key].value=retP.value;if(val.value.indexOf("[")>-1|val.value.indexOf(".")>-1){var data=retP.prop;if(retP.type==="object")data=retP.value;var property1,property2;if(val.value.indexOf("[")===-1&&val.value.indexOf("]")>-1&&val.value.substr(0,1)==="@"){var prevData=var_Arr[key-1].value;var_Arr[key].value=prevData[data];if(val.value.indexOf(".")>-1){property2=await func.expression.get_property(val.value).property2;if(prevData[data])set_value(prevData[data][property2])}delete var_Arr[key-1]}else{property1=await func.expression.get_property(val.value).property1;property2=await func.expression.get_property(val.value).property2;if(property1){var_Arr[key].value=data[property1];if(property2){if(data[property1])set_value(data[property1][property2])}}if(property2&&!property1){if(data){set_value(data[property2])}}}fields[fieldIdP]=var_Arr[key].value;var_Arr[key].fieldId=fieldIdP}else{fields[fieldIdP]=var_Arr[key].value;var_Arr[key].fieldId=fieldIdP}}};if(val.fieldId){if(val.fieldId&&val.fieldId.substr(0,5)==="_THIS"&&calling_fieldIdP&&(val.fieldId.length===5||val.fieldId.length>5&&val.fieldId.substr(5,1)===".")){if(val.fieldId.length===5)val.fieldId=calling_fieldIdP;else val.fieldId=calling_fieldIdP+val.fieldId(5,val.fieldId.length-1)}if(!sourceP==="exp"){var_Arr[key].value='""'}fields[val.fieldId]=var_Arr[key].value;const ret=await func.datasource.get_value(SESSION_ID,val.fieldId,dsSessionP,rowIdP);await replace_value_in_string(ret.ret,ret.fieldIdP)}}try{var res=[];var exp_exist;var var_error_found;_.forEach(var_Arr,function(val,key){if(sourceP==="UI Property EXP"){let ret=func.utils.get_drive_url(SESSION_ID,val.value,true);if(ret.changed){res[key]=ret.value;return true}}if(sourceP==="UI Attr EXP"){let ret=func.utils.get_drive_url(SESSION_ID,val.value,var_Arr.length==1?false:true);if(ret.changed){res[key]=ret.value;return true}}if(val.type==="exp"){exp_exist=true}res[key]=val.value;if(var_Arr.length>1){if(!["DbQuery","alert","exp","api_rendered_output"].includes(sourceP)&&["string","date"].includes(val.type)){res[key]="`"+val.value+"`"}if(["api_rendered_output"].includes(sourceP)&&["json"].includes(api_output_type)&&["string","date"].includes(val.type)){res[key]=`"`+val.value+`"`}}if(val.fieldId&&val.value&&typeof val.value==="string"){if(["query","condition","range","sort","locate"].includes(sourceP)){if(val.value.indexOf("↵")>-1){res[key]=val.value.split("↵").join("")}res[key]=res[key].replace(/(\r\n|\n|\r)/gm,"")}if(["init","update","virtual"].includes(sourceP)){if(val.value.indexOf("↵")>-1)res[key]=val.value.split("↵").join("\n");res[key]=res[key].replace(/(\r\n|\n|\r)/gm,"\\n")}if(typeof IS_PROCESS_SERVER!=="undefined"){res[key]=res[key].replace(/(\r\n|\n|\r)/gm,"<br>")}fields[val.fieldId]=res[key]}if(typeof val.value==="object"&&var_Arr.length>1){if(!Array.isArray(val.value)&&!var_Arr[key+1].value?.includes(".")){res[key]="("+JSON.stringify(val.value)+")"}else{res[key]=JSON.stringify(val.value)}}if(!exp_exist&&sourceP!=="exp"&&val.value&&typeof val.value==="string"&&val.value.substr(0,1)==="@"){warning="Error encoding "+val.value;var_error_found=true;res[key]=0}});const join=function(arrP){return arrP.join("")};var exp=undefined;if(exp_exist&&sourceP!=="exp"){exp=await func.expression.get(SESSION_ID,join(res),dsSessionP,sourceP,rowIdP,sourceActionP,true,calling_fieldIdP,fields,debug_infoP);if(exp.res)res=exp.res;else res=[exp.result];fields=_.assignIn(exp.fields,fieldsP)}var result=join(res);if(res.length===1){result=res[0]}if(secondPassP){ret=result}else if(sourceP!=="exp"){if(res.length===1&&typeof res[0]==="string"&&typeof res[0]!=="object"){ret=join(res);if(ret&&ret.substr(0,1)==="@"){error="Error encoding @ var";var_error_found=true}}else{if(!["arguments","api_rendered_output","DbQuery"].includes(sourceP)){ret=await func.expression.secure_eval(SESSION_ID,sourceP,result,jobNo,dsSessionP,js_script_callback)}else{if(sourceP==="DbQuery"){ret=JSON.stringify(evalJson(result))}else{ret=result}}}}return end_results()}catch(err){ret=result;error=err.message;return end_results()}}}const new_class=new xu_class;return new_class.get()};func.expression.get=async function(SESSION_ID,valP,dsSessionP,sourceP,rowIdP,sourceActionP,secondPassP,calling_fieldIdP,fieldsP={},debug_infoP,iterate_info,js_script_callback,jobNo,api_output_type){const evalJson=text=>eval(`(${text})`);const replaceQuotes=str=>{for(const[key,val]of Object.entries(fields)){if(typeof val==="string")str=str.replace(`"${val}"`,val.replace(/"/g,""))}return str};let ret,error,warning,var_error_found;const fields={...fieldsP};if(valP===null||typeof valP==="undefined")ret="";else if(typeof valP==="boolean")ret=valP?"Y":"N";else ret=valP.toString();ret=ret.replace(/\&/g,"&");ret=func.utils.replace_studio_drive_url(SESSION_ID,ret);const endResults=()=>{if(["update","javascript"].includes(sourceP)&&typeof ret==="string"){ret=replaceQuotes(ret)}if((error||warning)&&SESSION_OBJ[SESSION_ID]?.DS_GLB[dsSessionP]){func.utils.debug.log(SESSION_ID,SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP].nodeId,{module:"expression",action:sourceP,source:calling_fieldIdP,prop:ret,details:ret,result:ret,error:error,warning:warning,fields:null,type:"exp",prog_id:SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP].prog_id,debug_info:debug_infoP})}return{result:ret,fields:fields,error:error,warning:warning,req:valP,var_error_found:var_error_found}};const handleNonVariable=async()=>{try{if(sourceP!=="arguments"){if(ret.startsWith("_DATE_"))ret=ret.slice(6);else if(/^\d{4}-\d{2}-\d{2}$/.test(ret)||ret==="self")return endResults();else ret=await func.expression.secure_eval(SESSION_ID,sourceP,ret,jobNo,dsSessionP,js_script_callback)}else{ret=ret.replace(/_NULL/gi,"")}return endResults()}catch(err){error=err.message;return endResults()}};if(!func.expression.validate_variables(valP))return await handleNonVariable();if(glb.emailRegex.test(await func.expression.secure_eval(SESSION_ID,sourceP,valP,jobNo,dsSessionP,js_script_callback))){return await handleNonVariable()}const split=func.expression.parse(ret)||[];const var_Arr=await Promise.all(split.map(async(val,key)=>{const result={value:val.value,fieldId:val.fieldId};if(!val.fieldId)return result;if(val.fieldId.startsWith("_THIS")&&calling_fieldIdP){result.fieldId=val.fieldId.length===5?calling_fieldIdP:calling_fieldIdP+val.fieldId.slice(5)}const{ret:fetchedValue,fieldIdP}=await func.datasource.get_value(SESSION_ID,result.fieldId,dsSessionP,rowIdP);result.value=fetchedValue?.value??(sourceP==="exp"?fetchedValue?.value:'""');result.type=fetchedValue?.type;if(iterate_info){if(iterate_info.iterator_key===fieldIdP)result.value=iterate_info._key;if(iterate_info.iterator_val===fieldIdP)result.value=iterate_info._val}if(val.value.includes("[")||val.value.includes(".")){const{property1,property2}=await func.expression.get_property(val.value);const data=fetchedValue?.type==="object"?fetchedValue.value:fetchedValue?.prop;if(key>0&&val.value.includes("]")&&!val.value.includes("[")&&split[key-1].value){const prevData=split[key-1].value;result.value=prevData[fieldIdP];if(val.value.includes(".")&&prevData[fieldIdP]){result.value=prevData[fieldIdP][property2]??""}}else if(data){if(property1)result.value=data[property1]??"";if(property2)result.value=(property1?data[property1]?.[property2]:data[property2])??""}}fields[fieldIdP]=result.value;return result}));try{const res=var_Arr.map((val,key)=>{if(sourceP==="UI Property EXP"||sourceP==="UI Attr EXP"){const{changed,value}=func.utils.get_drive_url(SESSION_ID,val.value,sourceP==="UI Attr EXP"&&var_Arr.length>1);if(changed)return value}let value=val.value;if(var_Arr.length>1){if(!["DbQuery","alert","exp","api_rendered_output"].includes(sourceP)&&["string","date"].includes(val.type)){value=`\`${value}\``}else if(sourceP==="api_rendered_output"&&api_output_type==="json"&&["string","date"].includes(val.type)){value=`"${value}"`}}if(val.fieldId&&typeof value==="string"){if(["query","condition","range","sort","locate"].includes(sourceP))value=value.replace(/↵|\r\n|\n|\r/g,"");if(["init","update","virtual"].includes(sourceP))value=value.replace(/↵|\r\n|\n|\r/g,"\\n");if(typeof IS_PROCESS_SERVER!=="undefined")value=value.replace(/↵|\r\n|\n|\r/g,"<br>");fields[val.fieldId]=value}if(typeof value==="object"&&var_Arr.length>1){value=Array.isArray(value)||var_Arr[key+1]?.value?.includes(".")?JSON.stringify(value):`(${JSON.stringify(value)})`}if(!val.type==="exp"&&sourceP!=="exp"&&typeof value==="string"&&value.startsWith("@")){warning=`Error encoding ${value}`;var_error_found=true;return"0"}return value});ret=res.length===1?res[0]:res.join("");if(var_Arr.some(v=>v.type==="exp")&&sourceP!=="exp"&&!secondPassP){const exp=await func.expression.get(SESSION_ID,ret,dsSessionP,sourceP,rowIdP,sourceActionP,true,calling_fieldIdP,fields,debug_infoP);ret=exp.res?.[0]??exp.result;Object.assign(fields,exp.fields)}else if(!secondPassP&&!["arguments","api_rendered_output","DbQuery"].includes(sourceP)){ret=await func.expression.secure_eval(SESSION_ID,sourceP,ret,jobNo,dsSessionP,js_script_callback)}else if(sourceP==="DbQuery"){ret=JSON.stringify(evalJson(ret))}if(typeof ret==="string"&&ret.startsWith("@")){error="Error encoding @ var";var_error_found=true}}catch(err){error=err.message}return endResults()};func.expression.parse_org=function(strP){var extract_str=function(strP,posP){if(!posP)posP=0;var clean_split_str=function(arrP){var arr=[];if(arrP&&arrP.length>1&&arrP[0]===""&&arrP[1].indexOf("@")>-1){for(var i=1;i<=arrP.length;i++){arr.push(arrP[i])}return arr}else return arrP};var nonLettersPatt=/\W/;var validSymbolsNoArray=/[^.@\[]/;var validSymbolsWithArray=/[^.@"'\[\]]/;var validSymbols=validSymbolsNoArray;var splitTmp=strP.replace(/@/g,"^^@").split("^^");var split=clean_split_str(splitTmp);var obj=[];if(split){for(let val of split){if(val){var pos=strP.indexOf(val);if(val&&val.substr(0,1)==="@"){var tmpStr="";var word_start_pos=undefined;var word_end_pos=undefined;for(var i=0;i<=val.length;i++){var key1=i;var val1=val.substr(i,1);if(val1==="."&&!word_start_pos)word_start_pos=key1;if(word_start_pos&&key1>word_start_pos&&nonLettersPatt.test(val1))word_end_pos=key1;if(word_start_pos&&word_start_pos>=0&&word_end_pos&&word_end_pos>=0){var word=val.substr(word_start_pos+1,word_end_pos-word_start_pos-1);tmpStr=tmpStr.substr(0,word_start_pos)+"^^"+tmpStr.substr(word_start_pos,word_end_pos);if(val.substr(word_end_pos,1)===".")word_start_pos=word_end_pos;else word_start_pos=null;word_end_pos=null}if(val1==="[")validSymbols=validSymbolsWithArray;if(nonLettersPatt.test(val1)&&validSymbols.test(val1)&&tmpStr.indexOf("^^")===-1){tmpStr+="^^"+val1}else tmpStr+=val1}if(tmpStr.indexOf("^^")>-1){var obj1=extract_str(tmpStr,pos);obj=obj.concat(obj1)}else{var fieldId=undefined;if(val){fieldId=val.substr(1,val.length);if(val.indexOf(".")>-1)fieldId=val.substr(1,val.indexOf(".")-1);if(val.indexOf("[")>-1)fieldId=val.substr(1,val.indexOf("[")-1)}obj.push({value:val,fieldId:fieldId,pos:pos+posP})}}else{obj.push({value:val,pos:pos+posP})}}}return obj}};var res=extract_str(strP);return res};func.expression.parse_bad=function(strP){const nonLettersPatt=/\W/;const validSymbolsNoArray=/[^.@\[]/;const validSymbolsWithArray=/[^.@"'\[\]]/;function extractStr(str,startPos=0){const cleanSplit=arr=>arr?.length>1&&arr[0]===""&&arr[1].includes("@")?arr.slice(1):arr;const segments=cleanSplit(str.replace(/@/g,"^^@").split("^^"));const result=[];for(const val of segments||[]){if(!val)continue;const pos=str.indexOf(val)+startPos;if(val.startsWith("@")){let tmpStr="";let wordStart=null;let wordEnd=null;let validSymbols=validSymbolsNoArray;for(let i=0;i<val.length;i++){const char=val[i];if(char==="[")validSymbols=validSymbolsWithArray;if(char==="."&&wordStart===null)wordStart=i;else if(wordStart!==null&&nonLettersPatt.test(char))wordEnd=i;if(wordStart!==null&&wordEnd!==null){const word=val.slice(wordStart+1,wordEnd);tmpStr=tmpStr.slice(0,wordStart)+"^^"+tmpStr.slice(wordStart,wordEnd);wordStart=char==="."?wordEnd:null;wordEnd=null}tmpStr+=nonLettersPatt.test(char)&&validSymbols.test(char)&&!tmpStr.includes("^^")?"^^"+char:char}if(tmpStr.includes("^^")){result.push(...extractStr(tmpStr,pos))}else{const fieldIdMatch=val.match(/^@([^.\[]+)/);result.push({value:val,fieldId:fieldIdMatch?fieldIdMatch[1]:undefined,pos:pos})}}else{result.push({value:val,pos:pos})}}return result}return extractStr(strP)};func.expression.parse=function(input){if(typeof input!=="string")return[];const segments=[];let pos=0;const parts=input.split(/(@\w+)/).filter(Boolean);for(const part of parts){if(part.startsWith("@")){const fieldId=part.slice(1);segments.push({value:part,fieldId:fieldId,pos:pos})}else{segments.push({value:part,pos:pos})}pos+=part.length}return segments};func.expression.get_property=async function(valP){async function secure_eval(val){if(typeof IS_PROCESS_SERVER==="undefined"){try{return eval(val)}catch(err){console.error(err);return}}try{let vm=new VM.VM({sandbox:{func:func,SESSION_ID:SESSION_ID,SESSION_OBJ:{[`${SESSION_ID}`]:SESSION_OBJ[SESSION_ID]}},timeout:1e3,allowAsync:false});return await vm.run(val)}catch(err){throw""}}var property1,property2;if(valP.indexOf("[")>-1&&valP.indexOf("]")>-1){property1=valP.substr(valP.indexOf("[")+1,valP.indexOf("]")-valP.indexOf("[")-1);property1=await secure_eval(property1)}if(valP.indexOf(".")>-1)property2=valP.substr(valP.indexOf(".")+1,valP.length);return{property1:property1,property2:property2}};func.expression.validate_constant=function(valP){var patt=/["']/;if(typeof valP==="string"&&patt.test(valP.substr(0,1))&&patt.test(valP.substr(0,valP.length-1)))return true;else return false};func.expression.validate_variables=function(valP){if(typeof valP==="string"&&valP.indexOf("@")>-1)return true;else return false};func.expression.remove_quotes=function(valP){if(func.expression.validate_constant(valP))return valP.substr(1,valP.length-2);else return valP};func.expression.secure_eval=async function(SESSION_ID,sourceP,val,job_id,dsSessionP,js_script_callback,evt){const api_utils=await func.common.get_module(SESSION_ID,"xuda-api-library.mjs",{func:func,glb:glb,SESSION_OBJ:SESSION_OBJ,SESSION_ID:SESSION_ID,APP_OBJ:APP_OBJ,dsSession:dsSessionP,job_id:job_id});const xu=api_utils;if(typeof IS_PROCESS_SERVER==="undefined"&&typeof IS_DOCKER==="undefined"){try{return eval(val)}catch(err){try{return JSON5.parse(val)}catch(err){return val}}}if(sourceP==="javascript"){process.on("uncaughtException",err=>{console.error("Asynchronous error caught.",err);func.events.delete_job(SESSION_ID,job_id);if(typeof IS_PROCESS_SERVER!=="undefined"||typeof IS_DOCKER!=="undefined"){if(SESSION_OBJ[SESSION_ID].crawler)return;return __.rpi.write_log(SESSION_OBJ[SESSION_ID].app_id,"error","worker","vm error",err,null,val,"func.expression.get.secure_eval")}});try{const dir=path.join(_conf.studio_drive_path,SESSION_OBJ[SESSION_ID].app_id,"node_modules","/");const script=new VM.VMScript(`try{${val}}catch(e){func.api.error(SESSION_ID, "nodejs error", e); console.error(e); func.events.delete_job(SESSION_ID, job_id);}`,{filename:dir,dirname:dir});let vm=new VM.NodeVM({require:{external:true},sandbox:{func:func,xu:xu,SESSION_ID:SESSION_ID,SESSION_OBJ:{[`${SESSION_ID}`]:SESSION_OBJ[SESSION_ID]},callback:js_script_callback,job_id:job_id,axios:axios,got:got,FormData:FormData},timeout:6e4});return await vm.run(script,{filename:dir,dirname:dir})}catch(err){console.error("Failed to execute script.",err);if(typeof IS_PROCESS_SERVER!=="undefined"){func.events.delete_job(SESSION_ID,jobNo);return __.db.add_error_log(SESSION_OBJ[SESSION_ID].app_id,"api",err)}}}else{try{try{let vm=new VM.VM({sandbox:{xu:xu,func:func,SESSION_ID:SESSION_ID,SESSION_OBJ:{[`${SESSION_ID}`]:SESSION_OBJ[SESSION_ID]},callback:js_script_callback,job_id:job_id},timeout:1e3,allowAsync:false});let ret=val;if(typeof val==="string"){ret=await vm.run(val)}return ret}catch(err){throw""}}catch(err){try{return JSON5.parse(val)}catch(err){return val}}}}; export default {
6
6
  glb,
7
7
  func,
8
8
  APP_OBJ,
@@ -7753,7 +7753,7 @@ func.events.invoke = async function (event_id) {
7753
7753
  };
7754
7754
  func.expression = {};
7755
7755
 
7756
- func.expression.get = async function (SESSION_ID, valP, dsSessionP, sourceP, rowIdP, sourceActionP, secondPassP, calling_fieldIdP, fieldsP, debug_infoP, iterate_info, js_script_callback, jobNo, api_output_type) {
7756
+ func.expression.get_org = async function (SESSION_ID, valP, dsSessionP, sourceP, rowIdP, sourceActionP, secondPassP, calling_fieldIdP, fieldsP, debug_infoP, iterate_info, js_script_callback, jobNo, api_output_type) {
7757
7757
  class xu_class {
7758
7758
  async get() {
7759
7759
  var ret;
@@ -7873,7 +7873,7 @@ func.expression.get = async function (SESSION_ID, valP, dsSessionP, sourceP, row
7873
7873
  // var split = [];
7874
7874
  var var_Arr = [];
7875
7875
  const split = func.expression.parse(ret) || [];
7876
- console.log(valP, split);
7876
+ // console.log(valP, split);
7877
7877
  for await (const [arr_key, val] of Object.entries(split)) {
7878
7878
  // run each field
7879
7879
  const key = Number(arr_key);
@@ -8107,6 +8107,177 @@ func.expression.get = async function (SESSION_ID, valP, dsSessionP, sourceP, row
8107
8107
  return new_class.get();
8108
8108
  };
8109
8109
 
8110
+ func.expression.get = async function (SESSION_ID, valP, dsSessionP, sourceP, rowIdP, sourceActionP, secondPassP, calling_fieldIdP, fieldsP = {}, debug_infoP, iterate_info, js_script_callback, jobNo, api_output_type) {
8111
+ const evalJson = (text) => eval(`(${text})`);
8112
+ const replaceQuotes = (str) => {
8113
+ for (const [key, val] of Object.entries(fields)) {
8114
+ if (typeof val === 'string') str = str.replace(`"${val}"`, val.replace(/"/g, ''));
8115
+ }
8116
+ return str;
8117
+ };
8118
+
8119
+ let ret, error, warning, var_error_found;
8120
+ const fields = { ...fieldsP };
8121
+
8122
+ // Initial value processing
8123
+ if (valP === null || typeof valP === 'undefined') ret = '';
8124
+ else if (typeof valP === 'boolean') ret = valP ? 'Y' : 'N';
8125
+ else ret = valP.toString();
8126
+
8127
+ ret = ret.replace(/\&/g, '&');
8128
+ ret = func.utils.replace_studio_drive_url(SESSION_ID, ret);
8129
+
8130
+ // End results helper
8131
+ const endResults = () => {
8132
+ if (['update', 'javascript'].includes(sourceP) && typeof ret === 'string') {
8133
+ ret = replaceQuotes(ret);
8134
+ }
8135
+ if ((error || warning) && SESSION_OBJ[SESSION_ID]?.DS_GLB[dsSessionP]) {
8136
+ func.utils.debug.log(SESSION_ID, SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP].nodeId, {
8137
+ module: 'expression',
8138
+ action: sourceP,
8139
+ source: calling_fieldIdP,
8140
+ prop: ret,
8141
+ details: ret,
8142
+ result: ret,
8143
+ error,
8144
+ warning,
8145
+ fields: null,
8146
+ type: 'exp',
8147
+ prog_id: SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP].prog_id,
8148
+ debug_info: debug_infoP,
8149
+ });
8150
+ }
8151
+ return { result: ret, fields, error, warning, req: valP, var_error_found };
8152
+ };
8153
+
8154
+ // Handle non-variable cases
8155
+ const handleNonVariable = async () => {
8156
+ try {
8157
+ if (sourceP !== 'arguments') {
8158
+ if (ret.startsWith('_DATE_')) ret = ret.slice(6);
8159
+ else if (/^\d{4}-\d{2}-\d{2}$/.test(ret) || ret === 'self') return endResults();
8160
+ else ret = await func.expression.secure_eval(SESSION_ID, sourceP, ret, jobNo, dsSessionP, js_script_callback);
8161
+ } else {
8162
+ ret = ret.replace(/_NULL/gi, '');
8163
+ }
8164
+ return endResults();
8165
+ } catch (err) {
8166
+ error = err.message;
8167
+ return endResults();
8168
+ }
8169
+ };
8170
+
8171
+ // Early return for simple cases
8172
+ if (!func.expression.validate_variables(valP)) return await handleNonVariable();
8173
+ if (glb.emailRegex.test(await func.expression.secure_eval(SESSION_ID, sourceP, valP, jobNo, dsSessionP, js_script_callback))) {
8174
+ return await handleNonVariable();
8175
+ }
8176
+
8177
+ // Parse and process variables
8178
+ const split = func.expression.parse(ret) || [];
8179
+ const var_Arr = await Promise.all(
8180
+ split.map(async (val, key) => {
8181
+ const result = { value: val.value, fieldId: val.fieldId };
8182
+
8183
+ if (!val.fieldId) return result;
8184
+
8185
+ // Handle _THIS substitution
8186
+ if (val.fieldId.startsWith('_THIS') && calling_fieldIdP) {
8187
+ result.fieldId = val.fieldId.length === 5 ? calling_fieldIdP : calling_fieldIdP + val.fieldId.slice(5);
8188
+ }
8189
+
8190
+ // Fetch value from datasource
8191
+ const { ret: fetchedValue, fieldIdP } = await func.datasource.get_value(SESSION_ID, result.fieldId, dsSessionP, rowIdP);
8192
+ result.value = fetchedValue?.value ?? (sourceP === 'exp' ? fetchedValue?.value : '""');
8193
+ result.type = fetchedValue?.type;
8194
+
8195
+ // Handle iteration
8196
+ if (iterate_info) {
8197
+ if (iterate_info.iterator_key === fieldIdP) result.value = iterate_info._key;
8198
+ if (iterate_info.iterator_val === fieldIdP) result.value = iterate_info._val;
8199
+ }
8200
+
8201
+ // Process nested properties
8202
+ if (val.value.includes('[') || val.value.includes('.')) {
8203
+ const { property1, property2 } = await func.expression.get_property(val.value);
8204
+ const data = fetchedValue?.type === 'object' ? fetchedValue.value : fetchedValue?.prop;
8205
+
8206
+ if (key > 0 && val.value.includes(']') && !val.value.includes('[') && split[key - 1].value) {
8207
+ const prevData = split[key - 1].value;
8208
+ result.value = prevData[fieldIdP];
8209
+ if (val.value.includes('.') && prevData[fieldIdP]) {
8210
+ result.value = prevData[fieldIdP][property2] ?? '';
8211
+ }
8212
+ } else if (data) {
8213
+ if (property1) result.value = data[property1] ?? '';
8214
+ if (property2) result.value = (property1 ? data[property1]?.[property2] : data[property2]) ?? '';
8215
+ }
8216
+ }
8217
+
8218
+ fields[fieldIdP] = result.value;
8219
+ return result;
8220
+ }),
8221
+ );
8222
+
8223
+ // Final evaluation
8224
+ try {
8225
+ const res = var_Arr.map((val, key) => {
8226
+ if (sourceP === 'UI Property EXP' || sourceP === 'UI Attr EXP') {
8227
+ const { changed, value } = func.utils.get_drive_url(SESSION_ID, val.value, sourceP === 'UI Attr EXP' && var_Arr.length > 1);
8228
+ if (changed) return value;
8229
+ }
8230
+
8231
+ let value = val.value;
8232
+ if (var_Arr.length > 1) {
8233
+ if (!['DbQuery', 'alert', 'exp', 'api_rendered_output'].includes(sourceP) && ['string', 'date'].includes(val.type)) {
8234
+ value = `\`${value}\``;
8235
+ } else if (sourceP === 'api_rendered_output' && api_output_type === 'json' && ['string', 'date'].includes(val.type)) {
8236
+ value = `"${value}"`;
8237
+ }
8238
+ }
8239
+
8240
+ if (val.fieldId && typeof value === 'string') {
8241
+ if (['query', 'condition', 'range', 'sort', 'locate'].includes(sourceP)) value = value.replace(/↵|\r\n|\n|\r/g, '');
8242
+ if (['init', 'update', 'virtual'].includes(sourceP)) value = value.replace(/↵|\r\n|\n|\r/g, '\\n');
8243
+ if (typeof IS_PROCESS_SERVER !== 'undefined') value = value.replace(/↵|\r\n|\n|\r/g, '<br>');
8244
+ fields[val.fieldId] = value;
8245
+ }
8246
+
8247
+ if (typeof value === 'object' && var_Arr.length > 1) {
8248
+ value = Array.isArray(value) || var_Arr[key + 1]?.value?.includes('.') ? JSON.stringify(value) : `(${JSON.stringify(value)})`;
8249
+ }
8250
+
8251
+ if (!val.type === 'exp' && sourceP !== 'exp' && typeof value === 'string' && value.startsWith('@')) {
8252
+ warning = `Error encoding ${value}`;
8253
+ var_error_found = true;
8254
+ return '0';
8255
+ }
8256
+ return value;
8257
+ });
8258
+
8259
+ ret = res.length === 1 ? res[0] : res.join('');
8260
+ if (var_Arr.some((v) => v.type === 'exp') && sourceP !== 'exp' && !secondPassP) {
8261
+ const exp = await func.expression.get(SESSION_ID, ret, dsSessionP, sourceP, rowIdP, sourceActionP, true, calling_fieldIdP, fields, debug_infoP);
8262
+ ret = exp.res?.[0] ?? exp.result;
8263
+ Object.assign(fields, exp.fields);
8264
+ } else if (!secondPassP && !['arguments', 'api_rendered_output', 'DbQuery'].includes(sourceP)) {
8265
+ ret = await func.expression.secure_eval(SESSION_ID, sourceP, ret, jobNo, dsSessionP, js_script_callback);
8266
+ } else if (sourceP === 'DbQuery') {
8267
+ ret = JSON.stringify(evalJson(ret));
8268
+ }
8269
+
8270
+ if (typeof ret === 'string' && ret.startsWith('@')) {
8271
+ error = 'Error encoding @ var';
8272
+ var_error_found = true;
8273
+ }
8274
+ } catch (err) {
8275
+ error = err.message;
8276
+ }
8277
+
8278
+ return endResults();
8279
+ };
8280
+
8110
8281
  func.expression.parse_org = function (strP) {
8111
8282
  var extract_str = function (strP, posP) {
8112
8283
  if (!posP) posP = 0;
@@ -7753,7 +7753,7 @@ func.events.invoke = async function (event_id) {
7753
7753
  };
7754
7754
  func.expression = {};
7755
7755
 
7756
- func.expression.get = async function (SESSION_ID, valP, dsSessionP, sourceP, rowIdP, sourceActionP, secondPassP, calling_fieldIdP, fieldsP, debug_infoP, iterate_info, js_script_callback, jobNo, api_output_type) {
7756
+ func.expression.get_org = async function (SESSION_ID, valP, dsSessionP, sourceP, rowIdP, sourceActionP, secondPassP, calling_fieldIdP, fieldsP, debug_infoP, iterate_info, js_script_callback, jobNo, api_output_type) {
7757
7757
  class xu_class {
7758
7758
  async get() {
7759
7759
  var ret;
@@ -7873,7 +7873,7 @@ func.expression.get = async function (SESSION_ID, valP, dsSessionP, sourceP, row
7873
7873
  // var split = [];
7874
7874
  var var_Arr = [];
7875
7875
  const split = func.expression.parse(ret) || [];
7876
- console.log(valP, split);
7876
+ // console.log(valP, split);
7877
7877
  for await (const [arr_key, val] of Object.entries(split)) {
7878
7878
  // run each field
7879
7879
  const key = Number(arr_key);
@@ -8107,6 +8107,177 @@ func.expression.get = async function (SESSION_ID, valP, dsSessionP, sourceP, row
8107
8107
  return new_class.get();
8108
8108
  };
8109
8109
 
8110
+ func.expression.get = async function (SESSION_ID, valP, dsSessionP, sourceP, rowIdP, sourceActionP, secondPassP, calling_fieldIdP, fieldsP = {}, debug_infoP, iterate_info, js_script_callback, jobNo, api_output_type) {
8111
+ const evalJson = (text) => eval(`(${text})`);
8112
+ const replaceQuotes = (str) => {
8113
+ for (const [key, val] of Object.entries(fields)) {
8114
+ if (typeof val === 'string') str = str.replace(`"${val}"`, val.replace(/"/g, ''));
8115
+ }
8116
+ return str;
8117
+ };
8118
+
8119
+ let ret, error, warning, var_error_found;
8120
+ const fields = { ...fieldsP };
8121
+
8122
+ // Initial value processing
8123
+ if (valP === null || typeof valP === 'undefined') ret = '';
8124
+ else if (typeof valP === 'boolean') ret = valP ? 'Y' : 'N';
8125
+ else ret = valP.toString();
8126
+
8127
+ ret = ret.replace(/\&/g, '&');
8128
+ ret = func.utils.replace_studio_drive_url(SESSION_ID, ret);
8129
+
8130
+ // End results helper
8131
+ const endResults = () => {
8132
+ if (['update', 'javascript'].includes(sourceP) && typeof ret === 'string') {
8133
+ ret = replaceQuotes(ret);
8134
+ }
8135
+ if ((error || warning) && SESSION_OBJ[SESSION_ID]?.DS_GLB[dsSessionP]) {
8136
+ func.utils.debug.log(SESSION_ID, SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP].nodeId, {
8137
+ module: 'expression',
8138
+ action: sourceP,
8139
+ source: calling_fieldIdP,
8140
+ prop: ret,
8141
+ details: ret,
8142
+ result: ret,
8143
+ error,
8144
+ warning,
8145
+ fields: null,
8146
+ type: 'exp',
8147
+ prog_id: SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP].prog_id,
8148
+ debug_info: debug_infoP,
8149
+ });
8150
+ }
8151
+ return { result: ret, fields, error, warning, req: valP, var_error_found };
8152
+ };
8153
+
8154
+ // Handle non-variable cases
8155
+ const handleNonVariable = async () => {
8156
+ try {
8157
+ if (sourceP !== 'arguments') {
8158
+ if (ret.startsWith('_DATE_')) ret = ret.slice(6);
8159
+ else if (/^\d{4}-\d{2}-\d{2}$/.test(ret) || ret === 'self') return endResults();
8160
+ else ret = await func.expression.secure_eval(SESSION_ID, sourceP, ret, jobNo, dsSessionP, js_script_callback);
8161
+ } else {
8162
+ ret = ret.replace(/_NULL/gi, '');
8163
+ }
8164
+ return endResults();
8165
+ } catch (err) {
8166
+ error = err.message;
8167
+ return endResults();
8168
+ }
8169
+ };
8170
+
8171
+ // Early return for simple cases
8172
+ if (!func.expression.validate_variables(valP)) return await handleNonVariable();
8173
+ if (glb.emailRegex.test(await func.expression.secure_eval(SESSION_ID, sourceP, valP, jobNo, dsSessionP, js_script_callback))) {
8174
+ return await handleNonVariable();
8175
+ }
8176
+
8177
+ // Parse and process variables
8178
+ const split = func.expression.parse(ret) || [];
8179
+ const var_Arr = await Promise.all(
8180
+ split.map(async (val, key) => {
8181
+ const result = { value: val.value, fieldId: val.fieldId };
8182
+
8183
+ if (!val.fieldId) return result;
8184
+
8185
+ // Handle _THIS substitution
8186
+ if (val.fieldId.startsWith('_THIS') && calling_fieldIdP) {
8187
+ result.fieldId = val.fieldId.length === 5 ? calling_fieldIdP : calling_fieldIdP + val.fieldId.slice(5);
8188
+ }
8189
+
8190
+ // Fetch value from datasource
8191
+ const { ret: fetchedValue, fieldIdP } = await func.datasource.get_value(SESSION_ID, result.fieldId, dsSessionP, rowIdP);
8192
+ result.value = fetchedValue?.value ?? (sourceP === 'exp' ? fetchedValue?.value : '""');
8193
+ result.type = fetchedValue?.type;
8194
+
8195
+ // Handle iteration
8196
+ if (iterate_info) {
8197
+ if (iterate_info.iterator_key === fieldIdP) result.value = iterate_info._key;
8198
+ if (iterate_info.iterator_val === fieldIdP) result.value = iterate_info._val;
8199
+ }
8200
+
8201
+ // Process nested properties
8202
+ if (val.value.includes('[') || val.value.includes('.')) {
8203
+ const { property1, property2 } = await func.expression.get_property(val.value);
8204
+ const data = fetchedValue?.type === 'object' ? fetchedValue.value : fetchedValue?.prop;
8205
+
8206
+ if (key > 0 && val.value.includes(']') && !val.value.includes('[') && split[key - 1].value) {
8207
+ const prevData = split[key - 1].value;
8208
+ result.value = prevData[fieldIdP];
8209
+ if (val.value.includes('.') && prevData[fieldIdP]) {
8210
+ result.value = prevData[fieldIdP][property2] ?? '';
8211
+ }
8212
+ } else if (data) {
8213
+ if (property1) result.value = data[property1] ?? '';
8214
+ if (property2) result.value = (property1 ? data[property1]?.[property2] : data[property2]) ?? '';
8215
+ }
8216
+ }
8217
+
8218
+ fields[fieldIdP] = result.value;
8219
+ return result;
8220
+ }),
8221
+ );
8222
+
8223
+ // Final evaluation
8224
+ try {
8225
+ const res = var_Arr.map((val, key) => {
8226
+ if (sourceP === 'UI Property EXP' || sourceP === 'UI Attr EXP') {
8227
+ const { changed, value } = func.utils.get_drive_url(SESSION_ID, val.value, sourceP === 'UI Attr EXP' && var_Arr.length > 1);
8228
+ if (changed) return value;
8229
+ }
8230
+
8231
+ let value = val.value;
8232
+ if (var_Arr.length > 1) {
8233
+ if (!['DbQuery', 'alert', 'exp', 'api_rendered_output'].includes(sourceP) && ['string', 'date'].includes(val.type)) {
8234
+ value = `\`${value}\``;
8235
+ } else if (sourceP === 'api_rendered_output' && api_output_type === 'json' && ['string', 'date'].includes(val.type)) {
8236
+ value = `"${value}"`;
8237
+ }
8238
+ }
8239
+
8240
+ if (val.fieldId && typeof value === 'string') {
8241
+ if (['query', 'condition', 'range', 'sort', 'locate'].includes(sourceP)) value = value.replace(/↵|\r\n|\n|\r/g, '');
8242
+ if (['init', 'update', 'virtual'].includes(sourceP)) value = value.replace(/↵|\r\n|\n|\r/g, '\\n');
8243
+ if (typeof IS_PROCESS_SERVER !== 'undefined') value = value.replace(/↵|\r\n|\n|\r/g, '<br>');
8244
+ fields[val.fieldId] = value;
8245
+ }
8246
+
8247
+ if (typeof value === 'object' && var_Arr.length > 1) {
8248
+ value = Array.isArray(value) || var_Arr[key + 1]?.value?.includes('.') ? JSON.stringify(value) : `(${JSON.stringify(value)})`;
8249
+ }
8250
+
8251
+ if (!val.type === 'exp' && sourceP !== 'exp' && typeof value === 'string' && value.startsWith('@')) {
8252
+ warning = `Error encoding ${value}`;
8253
+ var_error_found = true;
8254
+ return '0';
8255
+ }
8256
+ return value;
8257
+ });
8258
+
8259
+ ret = res.length === 1 ? res[0] : res.join('');
8260
+ if (var_Arr.some((v) => v.type === 'exp') && sourceP !== 'exp' && !secondPassP) {
8261
+ const exp = await func.expression.get(SESSION_ID, ret, dsSessionP, sourceP, rowIdP, sourceActionP, true, calling_fieldIdP, fields, debug_infoP);
8262
+ ret = exp.res?.[0] ?? exp.result;
8263
+ Object.assign(fields, exp.fields);
8264
+ } else if (!secondPassP && !['arguments', 'api_rendered_output', 'DbQuery'].includes(sourceP)) {
8265
+ ret = await func.expression.secure_eval(SESSION_ID, sourceP, ret, jobNo, dsSessionP, js_script_callback);
8266
+ } else if (sourceP === 'DbQuery') {
8267
+ ret = JSON.stringify(evalJson(ret));
8268
+ }
8269
+
8270
+ if (typeof ret === 'string' && ret.startsWith('@')) {
8271
+ error = 'Error encoding @ var';
8272
+ var_error_found = true;
8273
+ }
8274
+ } catch (err) {
8275
+ error = err.message;
8276
+ }
8277
+
8278
+ return endResults();
8279
+ };
8280
+
8110
8281
  func.expression.parse_org = function (strP) {
8111
8282
  var extract_str = function (strP, posP) {
8112
8283
  if (!posP) posP = 0;