@xuda.io/runtime-bundle 1.0.1413 → 1.0.1415
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.
- package/js/modules/xuda-actions-module.esm.js +10 -10
- package/js/modules/xuda-actions-module.esm.min.js +1 -1
- package/js/modules/xuda-api-library.min.mjs +1 -1
- package/js/modules/xuda-api-library.mjs +1 -1
- package/js/modules/xuda-datasource-db-adapter-module.min.mjs +1 -1
- package/js/modules/xuda-datasource-db-adapter-module.mjs +4 -4
- package/js/modules/xuda-db-adapter-module.min.mjs +1 -1
- package/js/modules/xuda-db-adapter-module.mjs +9 -9
- package/js/modules/xuda-debug-utils-module.min.mjs +1 -1
- package/js/modules/xuda-debug-utils-module.mjs +6 -6
- package/js/modules/xuda-event-ui-elements-module.esm.js +6 -6
- package/js/modules/xuda-event-ui-elements-module.esm.min.js +1 -1
- package/js/modules/xuda-get-cast-util-module.min.mjs +1 -1
- package/js/modules/xuda-get-cast-util-module.mjs +5 -10
- package/js/modules/xuda-get-support-module.esm.js +15 -12
- package/js/modules/xuda-get-support-module.esm.min.js +1 -1
- package/js/modules/xuda-input-musk-utils-module.min.mjs +1 -1
- package/js/modules/xuda-input-musk-utils-module.mjs +22 -35
- package/js/modules/xuda-live-preview-module.esm.js +36 -31
- package/js/modules/xuda-live-preview-module.esm.min.js +1 -1
- package/js/modules/xuda-peer-actions-module.esm.js +5 -5
- package/js/modules/xuda-peer-actions-module.esm.min.js +1 -1
- package/js/modules/xuda-progs-loader-module.min.mjs +1 -1
- package/js/modules/xuda-progs-loader-module.mjs +8 -7
- package/js/modules/xuda-project-loader-module.esm.js +17 -12
- package/js/modules/xuda-project-loader-module.esm.min.js +1 -1
- package/js/modules/xuda-studio-checker.min.mjs +1 -1
- package/js/modules/xuda-studio-checker.mjs +79 -80
- package/js/xuda-runtime-bundle.js +1604 -1186
- package/js/xuda-runtime-bundle.min.js +5 -5
- package/js/xuda-runtime-mini-bundle.js +22 -52
- package/js/xuda-runtime-mini-bundle.min.js +1 -1
- package/js/xuda-runtime-slim.js +1604 -1111
- package/js/xuda-runtime-slim.min.es.js +1605 -1187
- package/js/xuda-runtime-slim.min.js +4 -4
- package/js/xuda-runtime-vendor.js +1 -212
- package/js/xuda-runtime-vendor.min.js +2 -2
- package/js/xuda-server-bundle.min.mjs +2 -2
- package/js/xuda-server-bundle.mjs +746 -158
- package/js/xuda-worker-bundle.js +746 -158
- package/js/xuda-worker-bundle.min.js +2 -2
- package/js/xuda_common-bundle.js +237 -29
- package/js/xuda_common-bundle.min.js +1 -1
- package/js/xuda_worker.js +0 -6
- package/js/xuda_worker.min.js +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const screen_save = async function (SESSION_ID, paramsP) {
|
|
2
2
|
var str = '[screenid="' + paramsP.screenId + '"]';
|
|
3
|
-
var elm =
|
|
3
|
+
var elm = document.getElementById(paramsP.screenId)?.querySelectorAll(str);
|
|
4
4
|
var dsSession;
|
|
5
5
|
|
|
6
6
|
if (!elm || !elm.length) {
|
|
@@ -15,7 +15,7 @@ const screen_save = async function (SESSION_ID, paramsP) {
|
|
|
15
15
|
continue;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
dsSession =
|
|
18
|
+
dsSession = func.runtime.ui.get_data(val, 'xuData').dsSession;
|
|
19
19
|
let _ds = SESSION_OBJ[SESSION_ID].DS_GLB[dsSession];
|
|
20
20
|
if (!dsSession || !_ds) {
|
|
21
21
|
continue;
|
|
@@ -59,20 +59,20 @@ export const action_execute = async function (SESSION_ID, actionP, params, isScr
|
|
|
59
59
|
act_next: async function () {
|
|
60
60
|
await locate_record(SESSION_ID, 'next', params.dsSession);
|
|
61
61
|
if (_ds.tree_obj.renderType === 'form') {
|
|
62
|
-
|
|
62
|
+
func.runtime.platform.emit('xu-bind-refresh.' + params.dsSession.toString());
|
|
63
63
|
}
|
|
64
64
|
},
|
|
65
65
|
act_prev: async function () {
|
|
66
66
|
await locate_record(SESSION_ID, 'prev', params.dsSession);
|
|
67
|
-
if (_ds.tree_obj.renderType === 'form')
|
|
67
|
+
if (_ds.tree_obj.renderType === 'form') func.runtime.platform.emit('xu-bind-refresh.' + params.dsSession.toString());
|
|
68
68
|
},
|
|
69
69
|
act_last: async function () {
|
|
70
70
|
await locate_record(SESSION_ID, 'last', params.dsSession);
|
|
71
|
-
if (_ds.tree_obj.renderType === 'form')
|
|
71
|
+
if (_ds.tree_obj.renderType === 'form') func.runtime.platform.emit('xu-bind-refresh.' + params.dsSession.toString());
|
|
72
72
|
},
|
|
73
73
|
act_first: async function () {
|
|
74
74
|
await locate_record(SESSION_ID, 'first', params.dsSession);
|
|
75
|
-
if (_ds.tree_obj.renderType === 'form')
|
|
75
|
+
if (_ds.tree_obj.renderType === 'form') func.runtime.platform.emit('xu-bind-refresh.' + params.dsSession.toString());
|
|
76
76
|
},
|
|
77
77
|
act_refresh: async function (sourceP) {
|
|
78
78
|
let screen_params = params.screen_params;
|
|
@@ -81,7 +81,7 @@ export const action_execute = async function (SESSION_ID, actionP, params, isScr
|
|
|
81
81
|
let _ds = SESSION_OBJ[SESSION_ID].DS_GLB[params.dsSession];
|
|
82
82
|
_ds.screen_params = screen_params;
|
|
83
83
|
func.runtime.ui.update_sys_obj_win_info(SESSION_ID, params.dsSession);
|
|
84
|
-
|
|
84
|
+
func.runtime.platform.emit('xu-bind-refresh.' + params.dsSession.toString());
|
|
85
85
|
|
|
86
86
|
let prog_obj = await func.utils.VIEWS_OBJ.get(SESSION_ID, _ds.prog_id);
|
|
87
87
|
let field_changed = [];
|
|
@@ -172,7 +172,7 @@ export const action_execute = async function (SESSION_ID, actionP, params, isScr
|
|
|
172
172
|
act_reload: async function () {
|
|
173
173
|
var _ds = SESSION_OBJ[SESSION_ID].DS_GLB[params.dsSession];
|
|
174
174
|
|
|
175
|
-
let screen_params =
|
|
175
|
+
let screen_params = klona.klona(params.screen_params);
|
|
176
176
|
|
|
177
177
|
switch (params.screen_params.screen_type) {
|
|
178
178
|
case 'modal':
|
|
@@ -190,12 +190,12 @@ export const action_execute = async function (SESSION_ID, actionP, params, isScr
|
|
|
190
190
|
break;
|
|
191
191
|
|
|
192
192
|
case 'page':
|
|
193
|
-
let nav =
|
|
193
|
+
let nav = SESSION_OBJ[SESSION_ID].root_element.querySelector('xu-nav');
|
|
194
194
|
nav.popTo();
|
|
195
195
|
break;
|
|
196
196
|
|
|
197
197
|
default:
|
|
198
|
-
screen_params.$callingContainerP
|
|
198
|
+
func.runtime.ui.empty(screen_params.$callingContainerP);
|
|
199
199
|
break;
|
|
200
200
|
}
|
|
201
201
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const screen_save=async function(SESSION_ID,paramsP){var str='[screenid="'+paramsP.screenId+'"]';var elm
|
|
1
|
+
const screen_save=async function(SESSION_ID,paramsP){var str='[screenid="'+paramsP.screenId+'"]';var elm=document.getElementById(paramsP.screenId)?.querySelectorAll(str);var dsSession;if(!elm||!elm.length){return func.db.save_data(SESSION_ID,paramsP.dsSession,0)}for await(const[key,val]of Object.entries(elm)){if(key==="length"){break}if(!val){continue}dsSession=func.runtime.ui.get_data(val,"xuData").dsSession;let _ds=SESSION_OBJ[SESSION_ID].DS_GLB[dsSession];if(!dsSession||!_ds){continue}if(_ds.tree_obj.renderType==="form"){if(_ds._dataSourceTableId){if(!_ds.abort_save)await func.db.save_data(SESSION_ID,dsSession,key);_ds.abort_save=false;continue}}}};export const action_execute=async function(SESSION_ID,actionP,params,isScreenActionP,event_sourceP,jobNoP,containerP){var _ds=SESSION_OBJ[SESSION_ID].DS_GLB[params.dsSession];if(!_ds){func.events.delete_job(SESSION_ID,jobNoP);return}var action=actionP;var formGrid_dsSession;var EVENTSUFFIX="_triggered";if(!isScreenActionP)formGrid_dsSession=params.dsSession;var do_event=async function(actionP){var delete_job=async function(jobsP){await func.events.check_jobs_idle(SESSION_ID,jobsP);func.events.delete_job(SESSION_ID,jobNoP)};const jobsP=await func.events.validate(SESSION_ID,actionP+EVENTSUFFIX,params.dsSession,null,"action");await delete_job(jobsP)};const fx={act_next:async function(){await locate_record(SESSION_ID,"next",params.dsSession);if(_ds.tree_obj.renderType==="form"){func.runtime.platform.emit("xu-bind-refresh."+params.dsSession.toString())}},act_prev:async function(){await locate_record(SESSION_ID,"prev",params.dsSession);if(_ds.tree_obj.renderType==="form")func.runtime.platform.emit("xu-bind-refresh."+params.dsSession.toString())},act_last:async function(){await locate_record(SESSION_ID,"last",params.dsSession);if(_ds.tree_obj.renderType==="form")func.runtime.platform.emit("xu-bind-refresh."+params.dsSession.toString())},act_first:async function(){await locate_record(SESSION_ID,"first",params.dsSession);if(_ds.tree_obj.renderType==="form")func.runtime.platform.emit("xu-bind-refresh."+params.dsSession.toString())},act_refresh:async function(sourceP){let screen_params=params.screen_params;await func.datasource.create(SESSION_ID,params.prog_id,params.dsSession,params.parentDataSourceNo,params.containerId,params.rowIdP);let _ds=SESSION_OBJ[SESSION_ID].DS_GLB[params.dsSession];_ds.screen_params=screen_params;func.runtime.ui.update_sys_obj_win_info(SESSION_ID,params.dsSession);func.runtime.platform.emit("xu-bind-refresh."+params.dsSession.toString());let prog_obj=await func.utils.VIEWS_OBJ.get(SESSION_ID,_ds.prog_id);let field_changed=[];for(let field of prog_obj?.progFields){field_changed.push(field?.data?.field_id||"")}func.runtime.ui.refresh_xu_attributes({SESSION_ID:SESSION_ID,fields_arr:field_changed})},act_save:async function(){await screen_save(SESSION_ID,params)},act_delete:async function(){_ds.data_feed.rows_deleted.push(_ds.currentRecordId);await screen_save(SESSION_ID,params)},act_reload:async function(){var _ds=SESSION_OBJ[SESSION_ID].DS_GLB[params.dsSession];let screen_params=klona.klona(params.screen_params);switch(params.screen_params.screen_type){case"modal":debugger;break;case"popover":debugger;break;case"panel":func.runtime.ui.refresh_screen({SESSION_ID:SESSION_ID,fields_changed_arr:null,datasource_changed:params.dsSession});func.events.delete_job(SESSION_ID,jobNoP);break;case"page":let nav=SESSION_OBJ[SESSION_ID].root_element.querySelector("xu-nav");nav.popTo();break;default:func.runtime.ui.empty(screen_params.$callingContainerP);break}let ret=await func.runtime.ui.init_screen({SESSION_ID:SESSION_ID,prog_id:params.screen_params.prog_id,sourceScreenP:params.screen_params.sourceScreenP,callingDataSource_objP:params.screen_params.callingDataSource_objP,$callingContainerP:params.screen_params.$callingContainerP,triggerIdP:params.screen_params.triggerIdP,rowIdP:params.screen_params.rowIdP,jobNoP:null,is_panelP:params.screen_params.is_panelP,parameters_obj_inP:params.screen_params.parameters_obj_inP,source_functionP:params.screen_params.source_functionP})},act_print:async function(){window.print()}};if(event_sourceP==="click"){await func.events.validate(SESSION_ID,action+"_clicked",params.dsSession,null,"toolbar");params.event_sourceP=event_sourceP;params.isScreenActionP=isScreenActionP;await func.events.add_to_queue(SESSION_ID,params.renderType,null,event_sourceP,"invoke_action",action,params.udfContainer,null,null,null,null,params.rootScreenIdP,null,null,null,null,null,"click",params,null,null,null)}else{await fx[action]();await do_event(action)}};const locate_record=async function(SESSION_ID,actionP,dsSessionP){var arr=[];var result;var _ds=SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP];var current=_ds.currentRecordId;if(!current)return;var i=1;try{let arr=ds?.data_feed?.rows||[];var len=srr.length;const idx=func.common.find_ROWID_idx(_ds,_ds.currentRecordId);if(actionP==="next"){if(idx+1<len){new_idx=idx+1;result=arr[new_idx]._ROWID}else{new_idx=idx;result=arr[new_idx]._ROWID}}if(actionP==="prev"){if(idx-1>0){new_idx=idx-1;result=arr[new_idx]._ROWID}else{new_idx=idx;result=arr[new_idx]._ROWID}}if(actionP==="first"){new_idx=1;result=arr[new_idx]._ROWID}if(actionP==="last"){new_idx=arr.length-1;result=arr[new_idx]._ROWID}var datasource_changes={[_ds.dsSession]:{[result]:"set"}};await func.datasource.update(SESSION_ID,datasource_changes)}catch(err){console.error(err)}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export class XudaModule{constructor(e){this.func=e.func;this.glb=e.glb;this.SESSION_OBJ=e.SESSION_OBJ;this.SESSION_ID=e.SESSION_ID;this.APP_OBJ=e.APP_OBJ;this.dsSession=e.dsSession;this.job_id=e.job_id;this._session=this.SESSION_OBJ[this.SESSION_ID];return this}async get_field_value(field_id){if(!field_id){console.error("xu.getFieldValue: field_id cannot be empty");return false}let ret_get_value=await this.func.datasource.get_value(this.SESSION_ID,field_id,this.dsSession);if(!ret_get_value.found){console.error(`xu.getFieldValue: ${field_id} field not found`);return false}return ret_get_value.ret.value}async set_field_value(field_id,value,avoid_refresh){if(!field_id){console.error("xu.setFieldValue: field_id cannot be empty");return false}if(typeof value==="undefined"){console.error(`xu.setFieldValue: ${field_id} - value cannot be undefined`);return false}let ret_get_value=await this.func.datasource.get_value(this.SESSION_ID,field_id,this.dsSession);if(!ret_get_value.found){console.error(`xu.setFieldValue: ${field_id} field not found`);return false}let _ds=this._session.DS_GLB[ret_get_value.dsSessionP];const datasource_changes={[_ds.dsSession]:{[ret_get_value.currentRecordId]:{[field_id]:value}}};return await this.func.datasource.update(this.SESSION_ID,datasource_changes,null,avoid_refresh)}async invoke_event(event_id){if(!event_id){console.error("xu.invokeEvent: event_id cannot be empty");return false}let ds;for await(const[key,val]of Object.entries(Object.assign([],this._session.DS_GLB).reverse())){let ds_val=val;let ds_key=ds_val.dsSession;const _view_obj=await this.func.utils.VIEWS_OBJ.get(this.SESSION_ID,ds_val.prog_id);if(
|
|
1
|
+
export class XudaModule{constructor(e){this.func=e.func;this.glb=e.glb;this.SESSION_OBJ=e.SESSION_OBJ;this.SESSION_ID=e.SESSION_ID;this.APP_OBJ=e.APP_OBJ;this.dsSession=e.dsSession;this.job_id=e.job_id;this._session=this.SESSION_OBJ[this.SESSION_ID];return this}async get_field_value(field_id){if(!field_id){console.error("xu.getFieldValue: field_id cannot be empty");return false}let ret_get_value=await this.func.datasource.get_value(this.SESSION_ID,field_id,this.dsSession);if(!ret_get_value.found){console.error(`xu.getFieldValue: ${field_id} field not found`);return false}return ret_get_value.ret.value}async set_field_value(field_id,value,avoid_refresh){if(!field_id){console.error("xu.setFieldValue: field_id cannot be empty");return false}if(typeof value==="undefined"){console.error(`xu.setFieldValue: ${field_id} - value cannot be undefined`);return false}let ret_get_value=await this.func.datasource.get_value(this.SESSION_ID,field_id,this.dsSession);if(!ret_get_value.found){console.error(`xu.setFieldValue: ${field_id} field not found`);return false}let _ds=this._session.DS_GLB[ret_get_value.dsSessionP];const datasource_changes={[_ds.dsSession]:{[ret_get_value.currentRecordId]:{[field_id]:value}}};return await this.func.datasource.update(this.SESSION_ID,datasource_changes,null,avoid_refresh)}async invoke_event(event_id){if(!event_id){console.error("xu.invokeEvent: event_id cannot be empty");return false}let ds;for await(const[key,val]of Object.entries(Object.assign([],this._session.DS_GLB).reverse())){let ds_val=val;let ds_key=ds_val.dsSession;const _view_obj=await this.func.utils.VIEWS_OBJ.get(this.SESSION_ID,ds_val.prog_id);if(xu_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(typeof ds==="undefined"){this.reject("xu.invokeEvent error",`${event_id} event_id not found`,this.job_id);return false}return this.func.events.validate(this.SESSION_ID,"user_defined",ds,event_id)}async read_drive(filename,cb){try{const response=await fetch(`https://${this._session.domain}/workspace-drive/`+filename+"&"+this._session.gtp_token);if(cb){return cb(await response.json())}return await response.json()}catch(e){console.error(e);this.reject("xu.readDrive error",e,this.job_id)}}async write_drive(stream,filename,make_public,cb){var data={app_id:this._session.app_id,gtp_token:this._session.gtp_token,app_token:this._session.app_token,req_from_api:"true",public:make_public?"true":""};const form=new FormData;for(const[key,val]of Object.entries(data)){form.append(key,val)}form.append("file",stream,filename);try{const response=await fetch(this.func.common.get_url(this.SESSION_ID,"rpi","runtime_upload_file"),{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(form)});if(cb){return cb(await response.json())}return await response.json()}catch(e){console.error(e);this.reject("xu.writeDrive error",e,this.job_id)}}resolve(cb,job_id){if(job_id){this.func.events.delete_job(this.SESSION_ID,job_id)}if(cb){cb()}}reject(msg,details,job_id){if(job_id){this.func.events.delete_job(this.SESSION_ID,job_id)}this.log("E",msg,details)}log(type,msg,details){this.func.utils.debug_report(this.SESSION_ID,msg,details,type)}alert(type,display,msg,details){this.func.utils.alerts.execute(this.SESSION_ID,type,display,details,msg)}async call_project_api(prog_id,params,cb){const _prog_obj=await this.func.utils.DOCS_OBJ.get(this.SESSION_ID,prog_id);if(_prog_obj?.properties?.menuType!=="api"){return this.reject("xu.callApiProgram error",`${prog_id} is not an API program`,this.job_id)}if(this._session.engine_mode==="live_preview"||typeof IS_PROCESS_SERVER!=="undefined"){const ret=await this.func.datasource.prepare(this.SESSION_ID,prog_id,null,0,null,null,null,null,null,null,"api",null,null,null,params);try{const _ds=this._session.DS_GLB[ret.dsSessionP];if(typeof _ds.api_rendered_output==="undefined"||typeof _ds.tree_obj.apiOutput==="undefined"||!_ds.tree_obj.apiOutput){throw new Error("undefined api_rendered_output/apiOutput")}if(_ds.tree_obj.apiOutput==="json"){try{return JSON5.parse(_ds.api_rendered_output)}catch(err){console.error(err);return{}}}return _ds.api_rendered_output}catch(e){this.reject("xu.call_project_api error",e.message||e,this.job_id)}}if(["miniapp"].includes(this._session.engine_mode)){try{const response=await fetch(`https://${this._session.domain}/api`,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({...params,...{prog_id:prog_id}})});if(cb){return cb(await response.json())}return await response.json()}catch(e){console.error(e);this.reject("xu.get_table_data error",e,this.job_id)}}try{const response=await fetch(`https://${this._session.domain}/execute_api_program`,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({...params,...{prog_id:prog_id}})});if(cb){return cb(await response.json())}return await response.json()}catch(e){console.error(e);this.reject("xu.get_table_data error",e,this.job_id)}}async call_system_api(api_method,payload={},cb){try{let body={...{app_id:this._session.app_id,app_id_query:this._session.app_id,app_token:this._session.app_token},...payload};const response=await fetch(`https://${this._session.domain}/cpi/${api_method}`,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(body)});const json=await response.json();if(cb){return cb(json)}return json}catch(e){console.error(e);this.reject("xu.call_system_api error",e,this.job_id)}}async call_external_api(method,url,payload={},cb){try{let json={...{app_id:this._session.app_id,app_id_query:this._session.app_id,app_token:this._session.app_token},...payload};const response=await fetch(`https://${url}`,{method:method,headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(json)});if(cb){return cb(await response.json())}return await response.json()}catch(e){console.error(e);this.reject("xu.call_external_api error",e,this.job_id)}}async call_javascript(prog_id,params={},evaluate=false){try{const module=await this.func.common.get_module(this.SESSION_ID,"xuda-event-javascript-module.mjs");const result=await module.call_javascript(this.SESSION_ID,this.job_id,{prog:prog_id,parameters:params},this.dsSession,evaluate);return result}catch(e){console.error(e);this.reject("xu.call_javascript error",e,this.job_id)}}async dbs_create(table_id,data,cb){const _table_obj=await this.func.utils.DOCS_OBJ.get(this.SESSION_ID,table_id);if(_table_obj?.properties?.menuType!=="table"){return this.reject("xu.dbsCreate error",`${table_id} is not a table`,this.job_id)}try{const ret=await this.func.common.db(this.SESSION_ID,"dbs_create",{table_id:table_id,table_data:data});if(cb){return cb(ret)}return ret}catch(e){console.error(e);this.reject("xu.dbs_create error",e,this.job_id)}}async dbs_read(table_id,selector={},fields=[],sort,limit=999,skip,cb){const _table_obj=await this.func.utils.DOCS_OBJ.get(this.SESSION_ID,table_id);if(_table_obj?.properties?.menuType!=="table"){return this.reject("xu.dbsRead error",`${table_id} is not a table`,this.job_id)}let data={fields:fields,table_id:table_id,dataSourceFilterModelType:"query",filterModelMongo:selector,limit:limit,skip:skip,sort:sort};try{const ret=await this.func.common.db(this.SESSION_ID,"dbs_read",data);if(cb){return cb(ret)}return ret}catch(e){console.error(e);this.reject("xu.dbs_read error",e,this.job_id)}}async dbs_update(table_id,row_id,data,cb){const _table_obj=await this.func.utils.DOCS_OBJ.get(this.SESSION_ID,table_id);if(_table_obj?.properties?.menuType!=="table"){return this.reject("xu.dbsUpdate error",`${table_id} is not a table`,this.job_id)}if(!row_id){return this.reject("xu.dbsDelete error",`row_id is a mandatory field`,this.job_id)}try{const ret=await this.func.common.db(this.SESSION_ID,"dbs_update",{table_id:table_id,row_id:row_id,table_data:data});if(cb){return cb(ret)}return ret}catch(e){console.error(e);this.reject("xu.dbs_update error",e,this.job_id)}}async dbs_delete(table_id,row_id,cb){const _table_obj=await this.func.utils.DOCS_OBJ.get(this.SESSION_ID,table_id);if(_table_obj?.properties?.menuType!=="table"){return this.reject("xu.dbsDelete error",`${table_id} is not a table`,this.job_id)}if(!row_id){return this.reject("xu.dbsDelete error",`row_id is a mandatory field`,this.job_id)}try{const ret=await this.func.common.db(this.SESSION_ID,"dbs_delete",{table_id:table_id,ids:[row_id]});if(cb){return cb(ret)}return ret}catch(e){console.error(e);this.reject("xu.dbs_delete error",e,this.job_id)}}}
|
|
@@ -67,7 +67,7 @@ export class XudaModule {
|
|
|
67
67
|
let ds_val = val;
|
|
68
68
|
let ds_key = ds_val.dsSession;
|
|
69
69
|
const _view_obj = await this.func.utils.VIEWS_OBJ.get(this.SESSION_ID, ds_val.prog_id);
|
|
70
|
-
if (
|
|
70
|
+
if (xu_isEmpty(_view_obj.progEvents)) continue;
|
|
71
71
|
if (ds) break;
|
|
72
72
|
|
|
73
73
|
for await (const [key, val] of Object.entries(_view_obj.progEvents)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const _this={};export const init_module=e=>{_this.func=e.func;_this.glb=e.glb;_this.SESSION_OBJ=e.SESSION_OBJ;_this.APP_OBJ=e.APP_OBJ;_this.IS_DOCKER=e.IS_DOCKER;_this.IS_API_SERVER=e.IS_API_SERVER;_this.IS_PROCESS_SERVER=e.IS_PROCESS_SERVER};export const build_filter=async function(SESSION_ID,dataSourceSession,v,_ds){let file_ret2=await _this.func.utils.FILES_OBJ.get(SESSION_ID,_ds._dataSourceTableId);if(!file_ret2){_this.func.utils.debug_report(SESSION_ID,"datasource build query","Table reference not exist","E");return}let view_ret=await _this.func.utils.VIEWS_OBJ.get(SESSION_ID,_ds.args.prog_id);v.dataSourceIndexId=view_ret.progDataSource.dataSourceIndexId;v.dataSourceIndexIdExp=view_ret.progDataSource.dataSourceIndexIdExp;if(v.dataSourceIndexIdExp){let ret_dataSourceIndexIdExp=await _this.func.expression.get(SESSION_ID,v.dataSourceIndexIdExp,dataSourceSession,"index",_ds.args.rowIdP);if(ret_dataSourceIndexIdExp.result){v.dataSourceIndexId=ret_dataSourceIndexIdExp.result}if(!v.dataSourceIndexId){_this.func.utils.debug_report(SESSION_ID,"BUILD FILTER QUERY","Index expression return empty result","W")}v.dataSourceIndexesObj=view_ret.progDataSource.dataSourceIndexesObj;const index_obj=_this.func.common.find_item_by_key_root(file_ret2.tableIndexes,"id",v.dataSourceIndexId);if(!index_obj){return _this.func.utils.debug_report(SESSION_ID,"BUILD FILTER QUERY","Index not found in table: "+_ds._dataSourceTableId,"W")}if(!v.dataSourceIndexesObj?.[v.dataSourceIndexId]){_this.func.utils.debug_report(SESSION_ID,"BUILD FILTER QUERY","Index not found","W")}}var filter_from={};var filter_to={};let ret=await _this.func.utils.VIEWS_OBJ.get(SESSION_ID,_ds.args.prog_id);var sortOrder=ret.progDataSource.dataSourceSort;var sortOrderTypeExp=ret.progDataSource.dataSourceSortExp;if(_ds.sortOrder){sortOrder=_ds.sortOrder}if(_ds.sortOrderTypeExp){sortOrderTypeExp=_ds.sortOrderTypeExp}v.sortOrder=sortOrder;v.sortOrderTypeExp=sortOrderTypeExp;if(sortOrderTypeExp){var sort_orderExp=await _this.func.expression.get(SESSION_ID,v.sortOrderTypeExp,dataSourceSession,"sortorder",_ds.args.rowIdP);if(sort_orderExp.result){v.sortOrder=sort_orderExp.result;sortOrder=v.sortOrder}}let file_ret=await _this.func.utils.FILES_OBJ.get(SESSION_ID,_ds._dataSourceTableId);if(v.dataSourceIndexId){_ds.filter_from={};_ds.filter_to={};_ds.locate_from={};_ds.locate_to={};var locate_exist;var locate_error;v.segFrom=[];v.segTo=[];if(v.viewIndex){for await(const[keySegment,valSegment]of Object.entries(v.viewIndex[v.dataSourceIndexId])){var fieldId=keySegment;if(!_this.func.common.find_item_by_key(file_ret.tableFields,"field_id",fieldId)){_this.func.utils.debug_report(SESSION_ID,"datasource build query",`Wrong index fields for ${fieldId} at field range ${v.viewSourceDesc}`,"E",null,_ds);break}var fieldProp=_this.func.common.find_item_by_key(file_ret.tableFields,"field_id",fieldId);var fieldType=fieldProp.props.fieldType;var fieldValFrom=valSegment.from;var fieldValTo=valSegment.to;const get_val=async function(valP,actionP,typeP){var ret={};ret.result=valP;ret.fields={};ret.fields[fieldId]=valP;if(!ret.result){ret.result=0;if(fieldType!=="number"){ret.result="";ret.fields[fieldId]=ret.result}}else{if(fieldType==="number"){if(!valP.includes("@")){if(typeof valP==="boolean"){ret.result=valP?1:0}else{ret.result=Number(valP)}ret.fields[fieldId]=ret.result}}else{if(!valP.includes("@")){ret.result=valP;ret.fields[fieldId]=ret.result}}ret=await _this.func.expression.get(SESSION_ID,ret.result,dataSourceSession,"query",_ds.args.rowIdP)}_this.func.utils.debug.log(SESSION_ID,_ds.args.prog_id+"_"+valSegment.id,{module:v.viewModule,action:actionP,prop:typeP,details:ret.result,result:ret.result,error:ret.error,warning:ret.warning,source:v.viewSourceDesc,fields:ret.fields,type:"query",prog_id:_ds.args.prog_id,dsSession:dataSourceSession});return ret};var value_from=await get_val(fieldValFrom,"range","from");var value_to=await get_val(fieldValTo,"range","to");v.segFrom.push(value_from.result);v.segTo.push(value_to.result);var add_filters_to_datasource=function(objP,typeP){for(let[key,val]of Object.entries(objP.fields)){if(!val)val=null;_ds[typeP][key]=val}};add_filters_to_datasource(value_from,"filter_from");add_filters_to_datasource(value_to,"filter_to");filter_from[fieldId]=value_from.result;filter_to[fieldId]=value_to.result;if(_ds.tree_obj.menuType==="component"){v.segLocateFrom[keySegment]=v.segFrom[keySegment];v.segLocateTo[keySegment]=v.segTo[keySegment];v.fieldLocateValFrom=valSegment.locate_from;v.fieldLocateValTo=valSegment.locate_to;if(valSegment.locate_from||valSegment.locate_to)locate_exist=true;var value_from_locate=await get_val(v.fieldLocateValFrom,"locate","from");var value_to_locate=await get_val(v.fieldLocateValTo,"locate","to");v.segLocateFrom[keySegment]=value_from_locate.result;v.segLocateTo[keySegment]=value_to_locate.result;add_filters_to_datasource(value_from_locate,"locate_from");add_filters_to_datasource(value_to_locate,"locate_to")}}}const query_string_helper=function(fileIdP,indexIdP,segFromP,segToP,sortOrderP,filter_from,filter_to){var query={};var from=[fileIdP,indexIdP,segFromP];var to=[fileIdP,indexIdP,segToP];query.desc=sortOrderP==="des";query.view="db_index";query.table_id=fileIdP;query.indexId=indexIdP;if(sortOrderP==="des"){query.startkey=to;query.endkey=from}else{query.startkey=from;query.endkey=to}query.filter_from=filter_from;query.filter_to=filter_to;query.sortOrder=sortOrderP;return query};{v.couchView=query_string_helper(_ds._dataSourceTableId,v.dataSourceIndexId,v.segFrom,v.segTo,sortOrder,filter_from,filter_to)}if(_ds.tree_obj.menuType==="component"&&locate_exist&&!locate_error){v.locateQuery=query_string_helper(_ds._dataSourceTableId,v.dataSourceIndexId,v.segLocateFrom,v.segLocateTo,sortOrder,_ds.locate_from,_ds.locate_to)}}else{v.couchView={view:"db_index_all",table_id:_ds._dataSourceTableId}}};export const process_view_dataset=async function(SESSION_ID,dataSourceSession,_ds){const tree_obj=await _this.func.utils.TREE_OBJ.get(SESSION_ID,_ds.prog_id);var rows_count=_ds?.v.raw_data?.rows?.length||0;var args=_ds.args;const finish_dataset=async function(){_ds.rows_found=rows_count;if(tree_obj.menuType==="get_data"&&rows_count&&await _this.func.datasource.get_view_events_count(SESSION_ID,dataSourceSession,"after_record")>0){await _this.func.datasource.execute_view_events(SESSION_ID,dataSourceSession,"after_record")}return _this.func.datasource.callback(SESSION_ID,dataSourceSession,args.dataSourceNoP,args.rowIdP,args.jobNoP,null,_ds.nodeId)};const iterate_rows=async function(){for await(const[key,raw_data_row]of Object.entries(_ds.v.raw_data.rows)){_ds.currentRecordId=raw_data_row.id;await _this.func.datasource.render_fields_dataset(SESSION_ID,dataSourceSession,raw_data_row);break}return await finish_dataset()};if(rows_count){return await iterate_rows()}_ds.currentRecordId="dataset";_ds.set_mode="C";await _this.func.datasource.render_fields_dataset(SESSION_ID,dataSourceSession);await _this.func.events.validate(SESSION_ID,"record_not_found",dataSourceSession);_ds.record_not_found=true;return await finish_dataset()};export const set_dataset_key_data=function(SESSION_ID,dataSourceSession,valP){var _ds=_this.SESSION_OBJ[SESSION_ID].DS_GLB[dataSourceSession];var v=_ds.v;v.udfData=valP.value.udfData;var keyData={_id:valP.value._id,_rev:valP.value._rev,table_id:_ds._dataSourceTableId};_ds.key=keyData};export const get_locate_from_db=async function(SESSION_ID,dataSourceSession){var _ds=_this.SESSION_OBJ[SESSION_ID].DS_GLB[dataSourceSession];var v=_ds.v;if(!v.locateQuery){return}const json=await _this.func.db.get_query(SESSION_ID,_ds._dataSourceTableId,v.locateQuery,dataSourceSession,v.viewSourceDesc,"locate record");var rows=json.rows.length;if(!rows){return await _this.func.events.validate(SESSION_ID,"locate_not_found",dataSourceSession)}_ds.locatedRecordId=json.rows[0].id;return};export const find_fieldId_in_index=function(SESSION_ID,dataSourceSession,fieldId){var _ds=_this.SESSION_OBJ[SESSION_ID].DS_GLB[dataSourceSession];var v=_ds.v;var ret;
|
|
1
|
+
const _this={};export const init_module=e=>{_this.func=e.func;_this.glb=e.glb;_this.SESSION_OBJ=e.SESSION_OBJ;_this.APP_OBJ=e.APP_OBJ;_this.IS_DOCKER=e.IS_DOCKER;_this.IS_API_SERVER=e.IS_API_SERVER;_this.IS_PROCESS_SERVER=e.IS_PROCESS_SERVER};export const build_filter=async function(SESSION_ID,dataSourceSession,v,_ds){let file_ret2=await _this.func.utils.FILES_OBJ.get(SESSION_ID,_ds._dataSourceTableId);if(!file_ret2){_this.func.utils.debug_report(SESSION_ID,"datasource build query","Table reference not exist","E");return}let view_ret=await _this.func.utils.VIEWS_OBJ.get(SESSION_ID,_ds.args.prog_id);v.dataSourceIndexId=view_ret.progDataSource.dataSourceIndexId;v.dataSourceIndexIdExp=view_ret.progDataSource.dataSourceIndexIdExp;if(v.dataSourceIndexIdExp){let ret_dataSourceIndexIdExp=await _this.func.expression.get(SESSION_ID,v.dataSourceIndexIdExp,dataSourceSession,"index",_ds.args.rowIdP);if(ret_dataSourceIndexIdExp.result){v.dataSourceIndexId=ret_dataSourceIndexIdExp.result}if(!v.dataSourceIndexId){_this.func.utils.debug_report(SESSION_ID,"BUILD FILTER QUERY","Index expression return empty result","W")}v.dataSourceIndexesObj=view_ret.progDataSource.dataSourceIndexesObj;const index_obj=_this.func.common.find_item_by_key_root(file_ret2.tableIndexes,"id",v.dataSourceIndexId);if(!index_obj){return _this.func.utils.debug_report(SESSION_ID,"BUILD FILTER QUERY","Index not found in table: "+_ds._dataSourceTableId,"W")}if(!v.dataSourceIndexesObj?.[v.dataSourceIndexId]){_this.func.utils.debug_report(SESSION_ID,"BUILD FILTER QUERY","Index not found","W")}}var filter_from={};var filter_to={};let ret=await _this.func.utils.VIEWS_OBJ.get(SESSION_ID,_ds.args.prog_id);var sortOrder=ret.progDataSource.dataSourceSort;var sortOrderTypeExp=ret.progDataSource.dataSourceSortExp;if(_ds.sortOrder){sortOrder=_ds.sortOrder}if(_ds.sortOrderTypeExp){sortOrderTypeExp=_ds.sortOrderTypeExp}v.sortOrder=sortOrder;v.sortOrderTypeExp=sortOrderTypeExp;if(sortOrderTypeExp){var sort_orderExp=await _this.func.expression.get(SESSION_ID,v.sortOrderTypeExp,dataSourceSession,"sortorder",_ds.args.rowIdP);if(sort_orderExp.result){v.sortOrder=sort_orderExp.result;sortOrder=v.sortOrder}}let file_ret=await _this.func.utils.FILES_OBJ.get(SESSION_ID,_ds._dataSourceTableId);if(v.dataSourceIndexId){_ds.filter_from={};_ds.filter_to={};_ds.locate_from={};_ds.locate_to={};var locate_exist;var locate_error;v.segFrom=[];v.segTo=[];if(v.viewIndex){for await(const[keySegment,valSegment]of Object.entries(v.viewIndex[v.dataSourceIndexId])){var fieldId=keySegment;if(!_this.func.common.find_item_by_key(file_ret.tableFields,"field_id",fieldId)){_this.func.utils.debug_report(SESSION_ID,"datasource build query",`Wrong index fields for ${fieldId} at field range ${v.viewSourceDesc}`,"E",null,_ds);break}var fieldProp=_this.func.common.find_item_by_key(file_ret.tableFields,"field_id",fieldId);var fieldType=fieldProp.props.fieldType;var fieldValFrom=valSegment.from;var fieldValTo=valSegment.to;const get_val=async function(valP,actionP,typeP){var ret={};ret.result=valP;ret.fields={};ret.fields[fieldId]=valP;if(!ret.result){ret.result=0;if(fieldType!=="number"){ret.result="";ret.fields[fieldId]=ret.result}}else{if(fieldType==="number"){if(!valP.includes("@")){if(typeof valP==="boolean"){ret.result=valP?1:0}else{ret.result=Number(valP)}ret.fields[fieldId]=ret.result}}else{if(!valP.includes("@")){ret.result=valP;ret.fields[fieldId]=ret.result}}ret=await _this.func.expression.get(SESSION_ID,ret.result,dataSourceSession,"query",_ds.args.rowIdP)}_this.func.utils.debug.log(SESSION_ID,_ds.args.prog_id+"_"+valSegment.id,{module:v.viewModule,action:actionP,prop:typeP,details:ret.result,result:ret.result,error:ret.error,warning:ret.warning,source:v.viewSourceDesc,fields:ret.fields,type:"query",prog_id:_ds.args.prog_id,dsSession:dataSourceSession});return ret};var value_from=await get_val(fieldValFrom,"range","from");var value_to=await get_val(fieldValTo,"range","to");v.segFrom.push(value_from.result);v.segTo.push(value_to.result);var add_filters_to_datasource=function(objP,typeP){for(let[key,val]of Object.entries(objP.fields)){if(!val)val=null;_ds[typeP][key]=val}};add_filters_to_datasource(value_from,"filter_from");add_filters_to_datasource(value_to,"filter_to");filter_from[fieldId]=value_from.result;filter_to[fieldId]=value_to.result;if(_ds.tree_obj.menuType==="component"){v.segLocateFrom[keySegment]=v.segFrom[keySegment];v.segLocateTo[keySegment]=v.segTo[keySegment];v.fieldLocateValFrom=valSegment.locate_from;v.fieldLocateValTo=valSegment.locate_to;if(valSegment.locate_from||valSegment.locate_to)locate_exist=true;var value_from_locate=await get_val(v.fieldLocateValFrom,"locate","from");var value_to_locate=await get_val(v.fieldLocateValTo,"locate","to");v.segLocateFrom[keySegment]=value_from_locate.result;v.segLocateTo[keySegment]=value_to_locate.result;add_filters_to_datasource(value_from_locate,"locate_from");add_filters_to_datasource(value_to_locate,"locate_to")}}}const query_string_helper=function(fileIdP,indexIdP,segFromP,segToP,sortOrderP,filter_from,filter_to){var query={};var from=[fileIdP,indexIdP,segFromP];var to=[fileIdP,indexIdP,segToP];query.desc=sortOrderP==="des";query.view="db_index";query.table_id=fileIdP;query.indexId=indexIdP;if(sortOrderP==="des"){query.startkey=to;query.endkey=from}else{query.startkey=from;query.endkey=to}query.filter_from=filter_from;query.filter_to=filter_to;query.sortOrder=sortOrderP;return query};{v.couchView=query_string_helper(_ds._dataSourceTableId,v.dataSourceIndexId,v.segFrom,v.segTo,sortOrder,filter_from,filter_to)}if(_ds.tree_obj.menuType==="component"&&locate_exist&&!locate_error){v.locateQuery=query_string_helper(_ds._dataSourceTableId,v.dataSourceIndexId,v.segLocateFrom,v.segLocateTo,sortOrder,_ds.locate_from,_ds.locate_to)}}else{v.couchView={view:"db_index_all",table_id:_ds._dataSourceTableId}}};export const process_view_dataset=async function(SESSION_ID,dataSourceSession,_ds){const tree_obj=await _this.func.utils.TREE_OBJ.get(SESSION_ID,_ds.prog_id);var rows_count=_ds?.v.raw_data?.rows?.length||0;var args=_ds.args;const finish_dataset=async function(){_ds.rows_found=rows_count;if(tree_obj.menuType==="get_data"&&rows_count&&await _this.func.datasource.get_view_events_count(SESSION_ID,dataSourceSession,"after_record")>0){await _this.func.datasource.execute_view_events(SESSION_ID,dataSourceSession,"after_record")}return _this.func.datasource.callback(SESSION_ID,dataSourceSession,args.dataSourceNoP,args.rowIdP,args.jobNoP,null,_ds.nodeId)};const iterate_rows=async function(){for await(const[key,raw_data_row]of Object.entries(_ds.v.raw_data.rows)){_ds.currentRecordId=raw_data_row.id;await _this.func.datasource.render_fields_dataset(SESSION_ID,dataSourceSession,raw_data_row);break}return await finish_dataset()};if(rows_count){return await iterate_rows()}_ds.currentRecordId="dataset";_ds.set_mode="C";await _this.func.datasource.render_fields_dataset(SESSION_ID,dataSourceSession);await _this.func.events.validate(SESSION_ID,"record_not_found",dataSourceSession);_ds.record_not_found=true;return await finish_dataset()};export const set_dataset_key_data=function(SESSION_ID,dataSourceSession,valP){var _ds=_this.SESSION_OBJ[SESSION_ID].DS_GLB[dataSourceSession];var v=_ds.v;v.udfData=valP.value.udfData;var keyData={_id:valP.value._id,_rev:valP.value._rev,table_id:_ds._dataSourceTableId};_ds.key=keyData};export const get_locate_from_db=async function(SESSION_ID,dataSourceSession){var _ds=_this.SESSION_OBJ[SESSION_ID].DS_GLB[dataSourceSession];var v=_ds.v;if(!v.locateQuery){return}const json=await _this.func.db.get_query(SESSION_ID,_ds._dataSourceTableId,v.locateQuery,dataSourceSession,v.viewSourceDesc,"locate record");var rows=json.rows.length;if(!rows){return await _this.func.events.validate(SESSION_ID,"locate_not_found",dataSourceSession)}_ds.locatedRecordId=json.rows[0].id;return};export const find_fieldId_in_index=function(SESSION_ID,dataSourceSession,fieldId){var _ds=_this.SESSION_OBJ[SESSION_ID].DS_GLB[dataSourceSession];var v=_ds.v;var ret;for(const[key,val]of Object.entries(v.viewIndex)){if(val.data[0]===fieldId){ret=key;break}}return ret};export const dataset_save_before_exit=async function(SESSION_ID,dataSourceSession,reEnterP){var exit_event_count=0;if(!reEnterP){exit_event_count=await _this.func.datasource.get_view_events_count(SESSION_ID,dataSourceSession,"on_exit")}var _ds=_this.SESSION_OBJ[SESSION_ID].DS_GLB[dataSourceSession];var v=_ds.v;if(exit_event_count){await _this.func.datasource.execute_view_events(SESSION_ID,dataSourceSession,"on_exit");if(v?.screenInfo?.properties?.menuType==="set_data"&&v.jsonP.rows.length){return await _this.func.db.save_data(SESSION_ID,dataSourceSession)}}return};
|
|
@@ -293,12 +293,12 @@ export const find_fieldId_in_index = function (SESSION_ID, dataSourceSession, fi
|
|
|
293
293
|
var v = _ds.v;
|
|
294
294
|
var ret;
|
|
295
295
|
|
|
296
|
-
|
|
296
|
+
for (const [key, val] of Object.entries(v.viewIndex)) {
|
|
297
297
|
if (val.data[0] === fieldId) {
|
|
298
298
|
ret = key;
|
|
299
|
-
|
|
299
|
+
break;
|
|
300
300
|
}
|
|
301
|
-
}
|
|
301
|
+
}
|
|
302
302
|
return ret;
|
|
303
303
|
};
|
|
304
304
|
|
|
@@ -323,7 +323,7 @@ export const dataset_save_before_exit = async function (SESSION_ID, dataSourceSe
|
|
|
323
323
|
if (exit_event_count) {
|
|
324
324
|
await _this.func.datasource.execute_view_events(SESSION_ID, dataSourceSession, 'on_exit');
|
|
325
325
|
|
|
326
|
-
if (v?.screenInfo?.properties?.menuType === 'set_data' &&
|
|
326
|
+
if (v?.screenInfo?.properties?.menuType === 'set_data' && v.jsonP.rows.length) {
|
|
327
327
|
return await _this.func.db.save_data(SESSION_ID, dataSourceSession);
|
|
328
328
|
}
|
|
329
329
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const _this={};export const init_module=async e=>{_this.func=e.func;_this.glb=e.glb;_this.SESSION_OBJ=e.SESSION_OBJ;_this.APP_OBJ=e.APP_OBJ;_this.IS_DOCKER=e.IS_DOCKER;_this.IS_API_SERVER=e.IS_API_SERVER;_this.IS_PROCESS_SERVER=e.IS_PROCESS_SERVER;if(!_this.xuda_dbs_plugin&&typeof _this.IS_DOCKER==="undefined"&&typeof _this.IS_PROCESS_SERVER==="undefined"&&typeof _this.IS_API_SERVER==="undefined"){await init_xuda_dbs_plugin(e.SESSION_ID)}_this.db_replication_store;_this.db_changes_store;_this.db_replication_from_stat=3;_this.db_replication_to_stat=3};export let _db={};_db.save_data=async function(SESSION_ID,dsSessionP,keyP){var db_driver=await this.get_db_driver(SESSION_ID,dsSessionP);if(db_driver==="pouchdb"&&_this.glb.IS_WORKER){var callback_id=_this.func.utils.set_callback_queue(SESSION_ID,callbackP);var obj=_this.func.utils.clean_returned_datasource(SESSION_ID,dsSessionP);return _this.func.utils.post_back_to_client(SESSION_ID,"execute_local_sava_data",_this.SESSION_OBJ[SESSION_ID].worker_id,{ds_obj:obj,dsSessionP:dsSessionP,keyP:keyP,callback_id:callback_id})}_db.save_indicator(SESSION_ID,true);var _ds=_this.SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP];let _view_obj=await _this.func.utils.VIEWS_OBJ.get(SESSION_ID,_ds.prog_id);var dataSourceTableId=_view_obj?.progDataSource?.dataSourceTableId;if(!dataSourceTableId){_db.save_indicator(SESSION_ID,false);_this.func.utils.alerts.invoke(SESSION_ID,"system_msg","SYS_MSG_0105");return}var db_driver=await _db.get_db_driver(SESSION_ID,dsSessionP);let table_ret=await _this.func.utils.FILES_OBJ.get(SESSION_ID,dataSourceTableId);if(!table_ret.tableIndexes||_.isEmpty(table_ret.tableIndexes)){_db.save_indicator(SESSION_ID,false);_this.func.utils.alerts.invoke(SESSION_ID,"system_msg","SYS_MSG_0104");return}if(!_ds.data_feed.rows){return console.error("data_feed rows is empty")}const clean_virtual_fields=async function(table_id,data){let table_obj=await func.utils.VIEWS_OBJ.get(SESSION_ID,table_id);var data_obj={};for(const[key,val]of Object.entries(data)){const _tableFieldsObj=func.common.find_item_by_key(table_obj.tableFields,"field_id",key);if(_tableFieldsObj){data_obj[key]=val}}return data_obj};let save_ret;if(_view_obj.properties.menuType==="component"){if(_view_obj?.properties?.rwMode!=="U"){return _this.func.utils.alerts.invoke(SESSION_ID,"system_msg","SYS_MSG_0126")}let data={prog_id:_ds.prog_id};if(_ds.data_feed.rows_added?.length){if(!_view_obj?.properties?.allowCreate){_this.func.utils.alerts.invoke(SESSION_ID,"system_msg","SYS_MSG_0120")}_.forEach(_ds.data_feed.rows_added,function(val,key){data[key]=val});delete _ds.data_feed.rows_added["newRecord"];save_ret=await _this.func.common.db(SESSION_ID,"dbs_create",data,{},dsSessionP);refresh_document_changes_for_realtime_update(SESSION_ID,{row_id:save_ret.data.id,table_id:dataSourceTableId});return save_ret}if(_ds.data_feed.rows_deleted?.length){data.table_id=_ds._dataSourceTableId;data.ids=[];for await(const[key,val]of Object.entries(_ds.data_feed.rows_deleted)){data.ids.push(val);try{const row_idx=func.common.find_ROWID_idx(_ds,val);delete _ds.data_feed.rows[row_idx]}catch(error){}}_ds.data_feed.rows_deleted=[];save_ret=await _this.func.common.db(SESSION_ID,"dbs_delete",data,{},dsSessionP);refresh_document_changes_for_realtime_update(SESSION_ID,{row_id:save_ret.data?.id?.[0],table_id:dataSourceTableId});return save_ret}if(_ds.data_feed.rows_changed?.length){for await(const[key,row_id]of Object.entries(_ds.data_feed.rows_changed)){if(row_id==="datasource_main")continue;let data={prog_id:_ds.prog_id};try{const row_idx=func.common.find_ROWID_idx(_ds,row_id);data.table_data=await clean_virtual_fields(_ds._dataSourceTableId,_ds.data_feed.rows[row_idx])}catch(err){console.error(err)}data.table_id=_ds._dataSourceTableId;data.row_id=row_id;save_ret=await _this.func.common.db(SESSION_ID,"dbs_update",data,{},dsSessionP);refresh_document_changes_for_realtime_update(SESSION_ID,{row_id:save_ret.data?.id?.[0],table_id:dataSourceTableId})}return save_ret}return}if(_view_obj.properties.menuType!=="set_data"){return _this.func.utils.alerts.invoke(SESSION_ID,"system_msg","SYS_MSG_0126")}var mode=_ds.set_mode;if(!mode||mode==="U"){let data={prog_id:_ds.prog_id};data.table_id=_ds._dataSourceTableId;data.row_id=_ds.currentRecordId;data.table_data={};try{const row_idx=func.common.find_ROWID_idx(_ds,_ds.currentRecordId);data.table_data=await clean_virtual_fields(_ds._dataSourceTableId,_ds.data_feed.rows[row_idx])}catch(err){console.error(err)}save_ret=await _this.func.common.db(SESSION_ID,"dbs_update",data,{},dsSessionP);refresh_document_changes_for_realtime_update(SESSION_ID,{row_id:save_ret.data?.id?.[0],table_id:dataSourceTableId})}if(mode==="D"){let data={prog_id:_ds.prog_id};data.table_id=_ds._dataSourceTableId;data.ids=[_ds.currentRecordId];save_ret=await _this.func.common.db(SESSION_ID,"dbs_delete",data,{},dsSessionP);refresh_document_changes_for_realtime_update(SESSION_ID,{row_id:save_ret.data?.id?.[0],table_id:dataSourceTableId});return save_ret}if(mode==="C"){if(_view_obj.properties.crudMode!=="C"&&_view_obj.properties.crudMode==="U"&&!_view_obj.properties.allowCreate){return _this.func.utils.alerts.invoke(SESSION_ID,"system_msg","SYS_MSG_0120")}let data={prog_id:_ds.prog_id};data.table_id=_ds._dataSourceTableId;try{const row_idx=func.common.find_ROWID_idx(_ds,_ds.currentRecordId);data.table_data=_ds.data_feed.rows[row_idx];save_ret=await _this.func.common.db(SESSION_ID,"dbs_create",data,{},dsSessionP);refresh_document_changes_for_realtime_update(SESSION_ID,{row_id:save_ret.data.id,table_id:dataSourceTableId});return save_ret}catch(err){console.error(err)}}};_db.get_db_driver=async function(SESSION_ID,dsSessionP){var db_driver;if(dsSessionP){var _ds=_this.SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP];let _view_obj=await _this.func.utils.VIEWS_OBJ.get(SESSION_ID,_ds.prog_id);var dataSourceTableId=_view_obj?.progDataSource?.dataSourceTableId;if(!dataSourceTableId){_this.func.utils.alerts.invoke(SESSION_ID,"system_msg","SYS_MSG_0105");return}let file_ret=await _this.func.utils.FILES_OBJ.get(SESSION_ID,dataSourceTableId);db_driver=file_ret.properties.db_driver||"xuda"}if(_this.SESSION_OBJ[SESSION_ID].engine_mode==="live_preview"&&!db_driver&&_this.SESSION_OBJ[SESSION_ID].app_id==="temp"){db_driver="pouchdb"}return db_driver};_db.get_query=async function(SESSION_ID,table_id,queryP,dsSessionP,viewSourceDescP,sourceP,reduceP,skipP,limitP,countP,idsP,sortModel,sort_dir,filterModel={filterModelNative:filterModelNative,filterModelMongo:filterModelMongo,filterModelSql:filterModelSql,filterModelUserMongo:filterModelUserMongo,filterModelUserSql:filterModelUserSql},dataSourceFilterModelType="index",total_fields_info){const get_fields=async function(_ds){var fields=[];const _view_obj=await _this.func.utils.VIEWS_OBJ.get(SESSION_ID,_ds.prog_id);if(_view_obj.progFields){for(let val of _view_obj.progFields){if(val.data.type==="table"){fields.push(val.data.field_id)}}}return fields};const run_local=async function(){if(!_this.SESSION_OBJ[SESSION_ID])return;if(!_this.SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP])return;var ds=_this.SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP];var v=ds.v;var query_string;if(queryP.indexId){if(countP&&queryP.desc){query_string=`startkey=${JSON.stringify(queryP.endkey)}&endkey=${JSON.stringify(queryP.startkey)}`}else{query_string=`startkey=${JSON.stringify(queryP.startkey)}&endkey=${JSON.stringify(queryP.endkey)}&desc=${queryP.desc}`}}else{query_string="key="+queryP.table_id}var db_driver=await _db.get_db_driver(SESSION_ID,dsSessionP);var fields_arr=await get_fields(ds);const response={success:async function(json){if(dsSessionP&&!_this.SESSION_OBJ[SESSION_ID]?.DS_GLB?.[dsSessionP]){return}if(json.code<0){response.error(json.data);return}var data=json.data;if(dsSessionP)_this.func.utils.debug.log(SESSION_ID,ds._dataSourceTableId,{module:ds.viewModule,action:"read",prop:sourceP,details:query_string,result:data.rows?data.rows.length:0,error:null,source:viewSourceDescP,json:data,fields:_.assignIn(ds.locate_from,ds.locate_to),type:"file",dsSession:dsSessionP});return data},error:async function(err){if(dsSessionP&&!ds)return;if(dsSessionP){var err_msg=err&&err.data?err.data:err;_this.func.utils.debug.log(SESSION_ID,_this.SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP]._dataSourceTableId,{module:ds.viewModule,action:"read",prop:sourceP,details:query_string,result:null,error:err_msg,source:viewSourceDescP,json:null,fields:_.assignIn(ds.locate_from,ds.locate_to),type:"file",dsSession:dsSessionP})}_this.func.utils.debug_report(SESSION_ID,"datasource couchDB query "+sourceP,err_msg,"E");return{rows:[],error:true}}};var data={desc:queryP.desc,indexId:queryP.indexId,key:queryP.table_id,reduce:reduceP,viewSourceDesc:viewSourceDescP,limit:limitP,skip:skipP,count:countP,ids:idsP,table_id:queryP.table_id,prog_id:ds.prog_id};data.filter_from=JSON.stringify(queryP.filter_from);data.filter_to=JSON.stringify(queryP.filter_to);data.sortOrder=queryP.sortOrder;data.table_id=queryP.table_id;data.startkey=JSON.stringify(queryP.startkey);data.endkey=JSON.stringify(queryP.endkey);if(countP&&queryP.desc){data.sortOrder="asc";data.startkey=JSON.stringify(queryP.endkey);data.endkey=JSON.stringify(queryP.startkey)}data.dataSourceFilterModelType=dataSourceFilterModelType;if(sortModel){data.sortModel=JSON.stringify(sortModel);data.sort_dir=sort_dir}if(!_.isEmpty(filterModel?.filterModelNative)){data.filterModelNative=JSON.stringify(filterModel.filterModelNative)}if(!_.isEmpty(filterModel?.filterModelMongo)){data.filterModelMongo=JSON.stringify(filterModel.filterModelMongo)}if(filterModel?.filterModelSql){data.filterModelSql=JSON.stringify(filterModel.filterModelSql)}if(!_.isEmpty(filterModel?.filterModelUserMongo)){data.filterModelUserMongo=JSON.stringify(filterModel.filterModelUserMongo)}if(filterModel?.filterModelUserSql){data.filterModelUserSql=JSON.stringify(filterModel.filterModelUserSql)}if(total_fields_info){data.total_fields_info=JSON.stringify(total_fields_info)}if(!reduceP&&!countP){data.fields=fields_arr}try{const json=await _this.func.common.db(SESSION_ID,"dbs_read",data,{node:true},dsSessionP);return await response.success(json)}catch(e){return await response.error(e?.message||e?.data||e)}};var db_driver=await this.get_db_driver(SESSION_ID,dsSessionP);if(db_driver==="pouchdb"&&_this.glb.IS_WORKER&&!_this.SESSION_OBJ[SESSION_ID].engine_mode==="live_preview"){var callback_id=_this.func.utils.set_callback_queue(SESSION_ID,callbackP);var obj=_this.func.utils.clean_returned_datasource(SESSION_ID,dsSessionP);return _this.func.utils.post_back_to_client(SESSION_ID,"execute_local_db_query",_this.SESSION_OBJ[SESSION_ID].worker_id,{ds_obj:obj,dsSessionP:dsSessionP,table_id:table_id,queryP:queryP,dsSessionP:dsSessionP,viewSourceDescP:viewSourceDescP,sourceP:sourceP,reduceP:reduceP,skipP:skipP,limitP:limitP,countP:countP,idsP:idsP,callback_id:callback_id})}return await run_local()};_db.utils={};_db.save_indicator=function(SESSION_ID,stateP){if(!_this.glb.IS_WORKER){_this.func.UI.utils.save(SESSION_ID,stateP)}};const init_xuda_dbs_plugin=async function(SESSION_ID){var _session=_this.SESSION_OBJ[SESSION_ID];const plugin_name="@xuda.io/xuda-dbs-plugin-xuda";const get_path=function(plugin_name,resource){var path=`https://${_session.domain}/plugins/${plugin_name}${resource?"/"+resource:""}?app_id=${_session.app_id}`;return path};try{_this.xuda_dbs_plugin=await import(get_path(plugin_name,"studio.mjs"));const db=await func.utils.connect_pouchdb(SESSION_ID);await _db.call_pouch_xuda_dbs_plugin(SESSION_ID,"create_design",{db:db})}catch(err){return console.error(err.message)}};_db.call_pouch_xuda_dbs_plugin=async function(SESSION_ID,method,params){return new Promise(async(resolve,reject)=>{try{if(params.e){params.table_obj=await func.utils.DOCS_OBJ.get(SESSION_ID,params.e.table_id)}await _this.xuda_dbs_plugin[method](params,resolve,reject)}catch(err){reject()}})};_db.pouch={};_db.pouch.dbs_read=async function(SESSION_ID,e){const db=await func.utils.connect_pouchdb(SESSION_ID);return await _db.call_pouch_xuda_dbs_plugin(SESSION_ID,"read",{db:db,e:e})};_db.pouch.dbs_create=async function(SESSION_ID,e){const db=await func.utils.connect_pouchdb(SESSION_ID);return await _db.call_pouch_xuda_dbs_plugin(SESSION_ID,"create",{db:db,e:e})};_db.pouch.dbs_delete=async function(SESSION_ID,e){const db=await func.utils.connect_pouchdb(SESSION_ID);return await _db.call_pouch_xuda_dbs_plugin(SESSION_ID,"del",{db:db,e:e})};_db.pouch.dbs_update=async function(SESSION_ID,e){const db=await func.utils.connect_pouchdb(SESSION_ID);return await _db.call_pouch_xuda_dbs_plugin(SESSION_ID,"update",{db:db,e:e})};_db.pouch.init_db_replication=async function(SESSION_ID){const db=await func.utils.connect_pouchdb(SESSION_ID);var _session=_this.SESSION_OBJ[SESSION_ID];if(_session.url_params.avoid_local||_session.engine_mode==="miniapp"||_session.engine_mode!=="live_preview"&&!_session.opt.enable_offline){return}const changes=db.changes({live:true,include_docs:true}).on("change",function(change){if(!change.doc.udfData)return;func.runtime.ui.refresh_document_changes_for_realtime_update(SESSION_ID,{row_id:change.id,table_id:change.doc.udfData.udffileid})}).on("complete",function(info){console.log("complete",info)}).on("error",function(err){console.error(err)});set_replication_stat(SESSION_ID,null,3);const db_name=APP_OBJ[_session.app_id].app_db_name;const rep=db.replicate.to(`https://${_session.domain}/db/${db_name}`,{selector:{docType:"database"},live:true,retry:true,fetch:function(url,opts){if(_session.gtp_token){opts.headers.set("xu-gtp-token",_session.gtp_token)}if(_session.app_token)opts.headers.set("xu-app-token",_session.app_token);{opts.headers.set("xu-db",db_name)}return PouchDB.fetch(url,opts)}}).on("change",function(info){}).on("paused",function(err){if(err){return set_replication_stat(SESSION_ID,null,2)}set_replication_stat(SESSION_ID,null,3)}).on("active",function(){}).on("denied",function(err){set_replication_stat(SESSION_ID,null,2)}).on("complete",function(info){}).on("error",function(err){set_replication_stat(SESSION_ID,null,2);IS_ONLINE=false});_db.pouch.set_db_replication_from_server(SESSION_ID);$("body").on("set_db_replication_from_server",()=>{_db.pouch.set_db_replication_from_server(SESSION_ID)})};_db.pouch.set_db_replication_from_server=async function(SESSION_ID){if(!IS_ONLINE)return;const db=await func.utils.connect_pouchdb(SESSION_ID);const rep_docs=await _db.pouch.get_replications(SESSION_ID);const _session=_this.SESSION_OBJ[SESSION_ID];const db_name=APP_OBJ[_session.app_id].app_db_name;const remote_db_url=`https://${_session.domain}/db/${db_name}`;const remote_db=new PouchDB(remote_db_url,{fetch:function(url,opts){if(_session.gtp_token){opts.headers.set("xu-gtp-token",_session.gtp_token)}if(_session.app_token)opts.headers.set("xu-app-token",_session.app_token);{opts.headers.set("xu-db",db_name)}return PouchDB.fetch(url,opts)}});if(_this.db_changes_store){_this.db_changes_store.cancel()}const write_stat=async function(rep_id,stat,reason){try{let doc=await db.get(rep_id);doc.stat=stat;doc.stat_reason=reason;try{db.put(doc)}catch(err){}}catch(err){}};const download_documents=async function(rep_doc){await write_stat(rep_doc._id,2);const remote_db=new PouchDB(remote_db_url,{fetch:function(url,opts){opts.headers.set("xu-prog_id",rep_doc.prog_id);if(_session.gtp_token){opts.headers.set("xu-gtp-token",_session.gtp_token)}if(_session.app_token)opts.headers.set("xu-app-token",_session.app_token);{opts.headers.set("xu-db",db_name)}return PouchDB.fetch(url,opts)}});const ret=await remote_db.find({selector:rep_doc.selector,fields:["_id"],limit:9999999999});if(ret?.code<0){return func.utils.debug_report(SESSION_ID,"download_documents",ret.data,"E")}try{var doc_ids=[];for await(let doc of ret.docs){doc_ids.push(doc._id)}db.replicate.from(remote_db_url,{doc_ids:doc_ids,retry:true,style:"main_only",fetch:function(url,opts){if(_session.gtp_token){opts.headers.set("xu-gtp-token",_session.gtp_token)}if(_session.app_token)opts.headers.set("xu-app-token",_session.app_token);{opts.headers.set("xu-db",db_name)}return PouchDB.fetch(url,opts)}}).on("paused",async function(err){if(err){return}const read_ret=await _db.pouch.dbs_read(SESSION_ID,rep_doc.e);await write_stat(rep_doc._id,3)})}catch(err){await write_stat(rep_doc._id,2,err.message);console.error("replication from error",err)}};let filter_tables=[];for(let doc of rep_docs){if(!filter_tables.includes(doc.table_id))filter_tables.push(doc.table_id);if(doc.stat<3)await download_documents(doc)}try{_this.db_changes_store=remote_db.changes({since:"now",live:true,timeout:3e5,style:"main_only",include_docs:false}).on("change",async function(change){if(change.id.substr(0,4)!=="dbs-")return;if(_this.db_replication_from_stat!==3){set_replication_stat(SESSION_ID,3)}try{const existing_doc=await db.get(change.id);db.replicate.from(remote_db_url,{doc_ids:[change.id],retry:true,style:"main_only",fetch:function(url,opts){if(_session.gtp_token){opts.headers.set("xu-gtp-token",_session.gtp_token)}if(_session.app_token)opts.headers.set("xu-app-token",_session.app_token);{opts.headers.set("xu-db",db_name)}return PouchDB.fetch(url,opts)}})}catch(err){try{const table_id=change.id.split("_")[0].substr(4);for(let doc of rep_docs){if(doc.table_id===table_id){download_documents(doc)}}}catch(err){console.warn(err)}}}).on("complete",function(info){}).on("error",function(err){console.error(err);set_replication_stat(SESSION_ID,2);_this.db_changes_store.cancel()})}catch(err){console.error(err)}return};_db.pouch.remove_db_replication_from_server=async function(SESSION_ID,rep_id){const db=await func.utils.connect_pouchdb(SESSION_ID);try{const doc=await db.get(rep_id);db.remove(doc)}catch(error){}};_db.pouch.get_replications=async function(SESSION_ID=Object.keys(SESSION_OBJ)[0]){const db=await func.utils.connect_pouchdb(SESSION_ID);let ret=await db.find({selector:{docType:"rep_request"}});return ret.docs};_db.pouch.get_replication_stat=async function(SESSION_ID){const _session=_this.SESSION_OBJ[SESSION_ID];return _session?.DS_GLB?.[0]?.data_system?.SYS_GLOBAL_BOL_REPLICATION_STAT};const set_replication_stat=async function(SESSION_ID,from_stat,to_stat){var _session=_this.SESSION_OBJ[SESSION_ID];if(!_session?.DS_GLB?.[0]){return setTimeout(function(){set_replication_stat(SESSION_ID,from_stat,to_stat)},1e3)}if(from_stat)_this.db_replication_from_stat=from_stat;if(to_stat)_this.db_replication_to_stat=to_stat;var data={};if(_this.db_replication_from_stat===3&&_this.db_replication_to_stat===3){data.SYS_GLOBAL_BOL_REPLICATION_STAT=1;console.info("Replication On")}else{data.SYS_GLOBAL_BOL_REPLICATION_STAT=0;console.info("Replication Off")}var datasource_changes={[0]:{["data_system"]:data}};await func.datasource.update(SESSION_ID,datasource_changes)};const refresh_document_changes_for_realtime_update=function(SESSION_ID,doc_change){var _session=_this.SESSION_OBJ[SESSION_ID];if(glb.IS_WORKER){return func.utils.post_back_to_client(SESSION_ID,"refresh_document_changes_for_realtime_update",_session.worker_id,{doc_change:doc_change})}func.runtime.ui.refresh_document_changes_for_realtime_update(SESSION_ID,doc_change)};
|
|
1
|
+
const _this={};export const init_module=async e=>{_this.func=e.func;_this.glb=e.glb;_this.SESSION_OBJ=e.SESSION_OBJ;_this.APP_OBJ=e.APP_OBJ;_this.IS_DOCKER=e.IS_DOCKER;_this.IS_API_SERVER=e.IS_API_SERVER;_this.IS_PROCESS_SERVER=e.IS_PROCESS_SERVER;if(!_this.xuda_dbs_plugin&&typeof _this.IS_DOCKER==="undefined"&&typeof _this.IS_PROCESS_SERVER==="undefined"&&typeof _this.IS_API_SERVER==="undefined"){await init_xuda_dbs_plugin(e.SESSION_ID)}_this.db_replication_store;_this.db_changes_store;_this.db_replication_from_stat=3;_this.db_replication_to_stat=3};export let _db={};_db.save_data=async function(SESSION_ID,dsSessionP,keyP){var db_driver=await this.get_db_driver(SESSION_ID,dsSessionP);if(db_driver==="pouchdb"&&_this.glb.IS_WORKER){var callback_id=_this.func.utils.set_callback_queue(SESSION_ID,callbackP);var obj=_this.func.utils.clean_returned_datasource(SESSION_ID,dsSessionP);return _this.func.utils.post_back_to_client(SESSION_ID,"execute_local_sava_data",_this.SESSION_OBJ[SESSION_ID].worker_id,{ds_obj:obj,dsSessionP:dsSessionP,keyP:keyP,callback_id:callback_id})}_db.save_indicator(SESSION_ID,true);var _ds=_this.SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP];let _view_obj=await _this.func.utils.VIEWS_OBJ.get(SESSION_ID,_ds.prog_id);var dataSourceTableId=_view_obj?.progDataSource?.dataSourceTableId;if(!dataSourceTableId){_db.save_indicator(SESSION_ID,false);_this.func.utils.alerts.invoke(SESSION_ID,"system_msg","SYS_MSG_0105");return}var db_driver=await _db.get_db_driver(SESSION_ID,dsSessionP);let table_ret=await _this.func.utils.FILES_OBJ.get(SESSION_ID,dataSourceTableId);if(!table_ret.tableIndexes||xu_isEmpty(table_ret.tableIndexes)){_db.save_indicator(SESSION_ID,false);_this.func.utils.alerts.invoke(SESSION_ID,"system_msg","SYS_MSG_0104");return}if(!_ds.data_feed.rows){return console.error("data_feed rows is empty")}const clean_virtual_fields=async function(table_id,data){let table_obj=await func.utils.VIEWS_OBJ.get(SESSION_ID,table_id);var data_obj={};for(const[key,val]of Object.entries(data)){const _tableFieldsObj=func.common.find_item_by_key(table_obj.tableFields,"field_id",key);if(_tableFieldsObj){data_obj[key]=val}}return data_obj};let save_ret;if(_view_obj.properties.menuType==="component"){if(_view_obj?.properties?.rwMode!=="U"){return _this.func.utils.alerts.invoke(SESSION_ID,"system_msg","SYS_MSG_0126")}let data={prog_id:_ds.prog_id};if(_ds.data_feed.rows_added?.length){if(!_view_obj?.properties?.allowCreate){_this.func.utils.alerts.invoke(SESSION_ID,"system_msg","SYS_MSG_0120")}for(const[key,val]of Object.entries(_ds.data_feed.rows_added)){data[key]=val}delete _ds.data_feed.rows_added["newRecord"];save_ret=await _this.func.common.db(SESSION_ID,"dbs_create",data,{},dsSessionP);refresh_document_changes_for_realtime_update(SESSION_ID,{row_id:save_ret.data.id,table_id:dataSourceTableId});return save_ret}if(_ds.data_feed.rows_deleted?.length){data.table_id=_ds._dataSourceTableId;data.ids=[];for await(const[key,val]of Object.entries(_ds.data_feed.rows_deleted)){data.ids.push(val);try{const row_idx=func.common.find_ROWID_idx(_ds,val);delete _ds.data_feed.rows[row_idx]}catch(error){}}_ds.data_feed.rows_deleted=[];save_ret=await _this.func.common.db(SESSION_ID,"dbs_delete",data,{},dsSessionP);refresh_document_changes_for_realtime_update(SESSION_ID,{row_id:save_ret.data?.id?.[0],table_id:dataSourceTableId});return save_ret}if(_ds.data_feed.rows_changed?.length){for await(const[key,row_id]of Object.entries(_ds.data_feed.rows_changed)){if(row_id==="datasource_main")continue;let data={prog_id:_ds.prog_id};try{const row_idx=func.common.find_ROWID_idx(_ds,row_id);data.table_data=await clean_virtual_fields(_ds._dataSourceTableId,_ds.data_feed.rows[row_idx])}catch(err){console.error(err)}data.table_id=_ds._dataSourceTableId;data.row_id=row_id;save_ret=await _this.func.common.db(SESSION_ID,"dbs_update",data,{},dsSessionP);refresh_document_changes_for_realtime_update(SESSION_ID,{row_id:save_ret.data?.id?.[0],table_id:dataSourceTableId})}return save_ret}return}if(_view_obj.properties.menuType!=="set_data"){return _this.func.utils.alerts.invoke(SESSION_ID,"system_msg","SYS_MSG_0126")}var mode=_ds.set_mode;if(!mode||mode==="U"){let data={prog_id:_ds.prog_id};data.table_id=_ds._dataSourceTableId;data.row_id=_ds.currentRecordId;data.table_data={};try{const row_idx=func.common.find_ROWID_idx(_ds,_ds.currentRecordId);data.table_data=await clean_virtual_fields(_ds._dataSourceTableId,_ds.data_feed.rows[row_idx])}catch(err){console.error(err)}save_ret=await _this.func.common.db(SESSION_ID,"dbs_update",data,{},dsSessionP);refresh_document_changes_for_realtime_update(SESSION_ID,{row_id:save_ret.data?.id?.[0],table_id:dataSourceTableId})}if(mode==="D"){let data={prog_id:_ds.prog_id};data.table_id=_ds._dataSourceTableId;data.ids=[_ds.currentRecordId];save_ret=await _this.func.common.db(SESSION_ID,"dbs_delete",data,{},dsSessionP);refresh_document_changes_for_realtime_update(SESSION_ID,{row_id:save_ret.data?.id?.[0],table_id:dataSourceTableId});return save_ret}if(mode==="C"){if(_view_obj.properties.crudMode!=="C"&&_view_obj.properties.crudMode==="U"&&!_view_obj.properties.allowCreate){return _this.func.utils.alerts.invoke(SESSION_ID,"system_msg","SYS_MSG_0120")}let data={prog_id:_ds.prog_id};data.table_id=_ds._dataSourceTableId;try{const row_idx=func.common.find_ROWID_idx(_ds,_ds.currentRecordId);data.table_data=_ds.data_feed.rows[row_idx];save_ret=await _this.func.common.db(SESSION_ID,"dbs_create",data,{},dsSessionP);refresh_document_changes_for_realtime_update(SESSION_ID,{row_id:save_ret.data.id,table_id:dataSourceTableId});return save_ret}catch(err){console.error(err)}}};_db.get_db_driver=async function(SESSION_ID,dsSessionP){var db_driver;if(dsSessionP){var _ds=_this.SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP];let _view_obj=await _this.func.utils.VIEWS_OBJ.get(SESSION_ID,_ds.prog_id);var dataSourceTableId=_view_obj?.progDataSource?.dataSourceTableId;if(!dataSourceTableId){_this.func.utils.alerts.invoke(SESSION_ID,"system_msg","SYS_MSG_0105");return}let file_ret=await _this.func.utils.FILES_OBJ.get(SESSION_ID,dataSourceTableId);db_driver=file_ret.properties.db_driver||"xuda"}if(_this.SESSION_OBJ[SESSION_ID].engine_mode==="live_preview"&&!db_driver&&_this.SESSION_OBJ[SESSION_ID].app_id==="temp"){db_driver="pouchdb"}return db_driver};_db.get_query=async function(SESSION_ID,table_id,queryP,dsSessionP,viewSourceDescP,sourceP,reduceP,skipP,limitP,countP,idsP,sortModel,sort_dir,filterModel={filterModelNative:filterModelNative,filterModelMongo:filterModelMongo,filterModelSql:filterModelSql,filterModelUserMongo:filterModelUserMongo,filterModelUserSql:filterModelUserSql},dataSourceFilterModelType="index",total_fields_info){const get_fields=async function(_ds){var fields=[];const _view_obj=await _this.func.utils.VIEWS_OBJ.get(SESSION_ID,_ds.prog_id);if(_view_obj.progFields){for(let val of _view_obj.progFields){if(val.data.type==="table"){fields.push(val.data.field_id)}}}return fields};const run_local=async function(){if(!_this.SESSION_OBJ[SESSION_ID])return;if(!_this.SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP])return;var ds=_this.SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP];var v=ds.v;var query_string;if(queryP.indexId){if(countP&&queryP.desc){query_string=`startkey=${JSON.stringify(queryP.endkey)}&endkey=${JSON.stringify(queryP.startkey)}`}else{query_string=`startkey=${JSON.stringify(queryP.startkey)}&endkey=${JSON.stringify(queryP.endkey)}&desc=${queryP.desc}`}}else{query_string="key="+queryP.table_id}var db_driver=await _db.get_db_driver(SESSION_ID,dsSessionP);var fields_arr=await get_fields(ds);const response={success:async function(json){if(dsSessionP&&!_this.SESSION_OBJ[SESSION_ID]?.DS_GLB?.[dsSessionP]){return}if(json.code<0){response.error(json.data);return}var data=json.data;if(dsSessionP)_this.func.utils.debug.log(SESSION_ID,ds._dataSourceTableId,{module:ds.viewModule,action:"read",prop:sourceP,details:query_string,result:data.rows?data.rows.length:0,error:null,source:viewSourceDescP,json:data,fields:Object.assign({},ds.locate_from,ds.locate_to),type:"file",dsSession:dsSessionP});return data},error:async function(err){if(dsSessionP&&!ds)return;if(dsSessionP){var err_msg=err&&err.data?err.data:err;_this.func.utils.debug.log(SESSION_ID,_this.SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP]._dataSourceTableId,{module:ds.viewModule,action:"read",prop:sourceP,details:query_string,result:null,error:err_msg,source:viewSourceDescP,json:null,fields:Object.assign({},ds.locate_from,ds.locate_to),type:"file",dsSession:dsSessionP})}_this.func.utils.debug_report(SESSION_ID,"datasource couchDB query "+sourceP,err_msg,"E");return{rows:[],error:true}}};var data={desc:queryP.desc,indexId:queryP.indexId,key:queryP.table_id,reduce:reduceP,viewSourceDesc:viewSourceDescP,limit:limitP,skip:skipP,count:countP,ids:idsP,table_id:queryP.table_id,prog_id:ds.prog_id};data.filter_from=JSON.stringify(queryP.filter_from);data.filter_to=JSON.stringify(queryP.filter_to);data.sortOrder=queryP.sortOrder;data.table_id=queryP.table_id;data.startkey=JSON.stringify(queryP.startkey);data.endkey=JSON.stringify(queryP.endkey);if(countP&&queryP.desc){data.sortOrder="asc";data.startkey=JSON.stringify(queryP.endkey);data.endkey=JSON.stringify(queryP.startkey)}data.dataSourceFilterModelType=dataSourceFilterModelType;if(sortModel){data.sortModel=JSON.stringify(sortModel);data.sort_dir=sort_dir}if(!xu_isEmpty(filterModel?.filterModelNative)){data.filterModelNative=JSON.stringify(filterModel.filterModelNative)}if(!xu_isEmpty(filterModel?.filterModelMongo)){data.filterModelMongo=JSON.stringify(filterModel.filterModelMongo)}if(filterModel?.filterModelSql){data.filterModelSql=JSON.stringify(filterModel.filterModelSql)}if(!xu_isEmpty(filterModel?.filterModelUserMongo)){data.filterModelUserMongo=JSON.stringify(filterModel.filterModelUserMongo)}if(filterModel?.filterModelUserSql){data.filterModelUserSql=JSON.stringify(filterModel.filterModelUserSql)}if(total_fields_info){data.total_fields_info=JSON.stringify(total_fields_info)}if(!reduceP&&!countP){data.fields=fields_arr}try{const json=await _this.func.common.db(SESSION_ID,"dbs_read",data,{node:true},dsSessionP);return await response.success(json)}catch(e){return await response.error(e?.message||e?.data||e)}};var db_driver=await this.get_db_driver(SESSION_ID,dsSessionP);if(db_driver==="pouchdb"&&_this.glb.IS_WORKER&&!_this.SESSION_OBJ[SESSION_ID].engine_mode==="live_preview"){var callback_id=_this.func.utils.set_callback_queue(SESSION_ID,callbackP);var obj=_this.func.utils.clean_returned_datasource(SESSION_ID,dsSessionP);return _this.func.utils.post_back_to_client(SESSION_ID,"execute_local_db_query",_this.SESSION_OBJ[SESSION_ID].worker_id,{ds_obj:obj,dsSessionP:dsSessionP,table_id:table_id,queryP:queryP,dsSessionP:dsSessionP,viewSourceDescP:viewSourceDescP,sourceP:sourceP,reduceP:reduceP,skipP:skipP,limitP:limitP,countP:countP,idsP:idsP,callback_id:callback_id})}return await run_local()};_db.utils={};_db.save_indicator=function(SESSION_ID,stateP){if(!_this.glb.IS_WORKER){_this.func.UI.utils.save(SESSION_ID,stateP)}};const init_xuda_dbs_plugin=async function(SESSION_ID){var _session=_this.SESSION_OBJ[SESSION_ID];const plugin_name="@xuda.io/xuda-dbs-plugin-xuda";const get_path=function(plugin_name,resource){var path=`https://${_session.domain}/plugins/${plugin_name}${resource?"/"+resource:""}?app_id=${_session.app_id}`;return path};try{_this.xuda_dbs_plugin=await import(get_path(plugin_name,"studio.mjs"));const db=await func.utils.connect_pouchdb(SESSION_ID);await _db.call_pouch_xuda_dbs_plugin(SESSION_ID,"create_design",{db:db})}catch(err){return console.error(err.message)}};_db.call_pouch_xuda_dbs_plugin=async function(SESSION_ID,method,params){return new Promise(async(resolve,reject)=>{try{if(params.e){params.table_obj=await func.utils.DOCS_OBJ.get(SESSION_ID,params.e.table_id)}await _this.xuda_dbs_plugin[method](params,resolve,reject)}catch(err){reject()}})};_db.pouch={};_db.pouch.dbs_read=async function(SESSION_ID,e){const db=await func.utils.connect_pouchdb(SESSION_ID);return await _db.call_pouch_xuda_dbs_plugin(SESSION_ID,"read",{db:db,e:e})};_db.pouch.dbs_create=async function(SESSION_ID,e){const db=await func.utils.connect_pouchdb(SESSION_ID);return await _db.call_pouch_xuda_dbs_plugin(SESSION_ID,"create",{db:db,e:e})};_db.pouch.dbs_delete=async function(SESSION_ID,e){const db=await func.utils.connect_pouchdb(SESSION_ID);return await _db.call_pouch_xuda_dbs_plugin(SESSION_ID,"del",{db:db,e:e})};_db.pouch.dbs_update=async function(SESSION_ID,e){const db=await func.utils.connect_pouchdb(SESSION_ID);return await _db.call_pouch_xuda_dbs_plugin(SESSION_ID,"update",{db:db,e:e})};_db.pouch.init_db_replication=async function(SESSION_ID){const db=await func.utils.connect_pouchdb(SESSION_ID);var _session=_this.SESSION_OBJ[SESSION_ID];if(_session.url_params.avoid_local||_session.engine_mode==="miniapp"||_session.engine_mode!=="live_preview"&&!_session.opt.enable_offline){return}const changes=db.changes({live:true,include_docs:true}).on("change",function(change){if(!change.doc.udfData)return;func.runtime.ui.refresh_document_changes_for_realtime_update(SESSION_ID,{row_id:change.id,table_id:change.doc.udfData.udffileid})}).on("complete",function(info){console.log("complete",info)}).on("error",function(err){console.error(err)});set_replication_stat(SESSION_ID,null,3);const db_name=APP_OBJ[_session.app_id].app_db_name;const rep=db.replicate.to(`https://${_session.domain}/db/${db_name}`,{selector:{docType:"database"},live:true,retry:true,fetch:function(url,opts){if(_session.gtp_token){opts.headers.set("xu-gtp-token",_session.gtp_token)}if(_session.app_token)opts.headers.set("xu-app-token",_session.app_token);{opts.headers.set("xu-db",db_name)}return PouchDB.fetch(url,opts)}}).on("change",function(info){}).on("paused",function(err){if(err){return set_replication_stat(SESSION_ID,null,2)}set_replication_stat(SESSION_ID,null,3)}).on("active",function(){}).on("denied",function(err){set_replication_stat(SESSION_ID,null,2)}).on("complete",function(info){}).on("error",function(err){set_replication_stat(SESSION_ID,null,2);IS_ONLINE=false});_db.pouch.set_db_replication_from_server(SESSION_ID);func.runtime.platform.on("set_db_replication_from_server",()=>{_db.pouch.set_db_replication_from_server(SESSION_ID)})};_db.pouch.set_db_replication_from_server=async function(SESSION_ID){if(!IS_ONLINE)return;const db=await func.utils.connect_pouchdb(SESSION_ID);const rep_docs=await _db.pouch.get_replications(SESSION_ID);const _session=_this.SESSION_OBJ[SESSION_ID];const db_name=APP_OBJ[_session.app_id].app_db_name;const remote_db_url=`https://${_session.domain}/db/${db_name}`;const remote_db=new PouchDB(remote_db_url,{fetch:function(url,opts){if(_session.gtp_token){opts.headers.set("xu-gtp-token",_session.gtp_token)}if(_session.app_token)opts.headers.set("xu-app-token",_session.app_token);{opts.headers.set("xu-db",db_name)}return PouchDB.fetch(url,opts)}});if(_this.db_changes_store){_this.db_changes_store.cancel()}const write_stat=async function(rep_id,stat,reason){try{let doc=await db.get(rep_id);doc.stat=stat;doc.stat_reason=reason;try{db.put(doc)}catch(err){}}catch(err){}};const download_documents=async function(rep_doc){await write_stat(rep_doc._id,2);const remote_db=new PouchDB(remote_db_url,{fetch:function(url,opts){opts.headers.set("xu-prog_id",rep_doc.prog_id);if(_session.gtp_token){opts.headers.set("xu-gtp-token",_session.gtp_token)}if(_session.app_token)opts.headers.set("xu-app-token",_session.app_token);{opts.headers.set("xu-db",db_name)}return PouchDB.fetch(url,opts)}});const ret=await remote_db.find({selector:rep_doc.selector,fields:["_id"],limit:9999999999});if(ret?.code<0){return func.utils.debug_report(SESSION_ID,"download_documents",ret.data,"E")}try{var doc_ids=[];for await(let doc of ret.docs){doc_ids.push(doc._id)}db.replicate.from(remote_db_url,{doc_ids:doc_ids,retry:true,style:"main_only",fetch:function(url,opts){if(_session.gtp_token){opts.headers.set("xu-gtp-token",_session.gtp_token)}if(_session.app_token)opts.headers.set("xu-app-token",_session.app_token);{opts.headers.set("xu-db",db_name)}return PouchDB.fetch(url,opts)}}).on("paused",async function(err){if(err){return}const read_ret=await _db.pouch.dbs_read(SESSION_ID,rep_doc.e);await write_stat(rep_doc._id,3)})}catch(err){await write_stat(rep_doc._id,2,err.message);console.error("replication from error",err)}};let filter_tables=[];for(let doc of rep_docs){if(!filter_tables.includes(doc.table_id))filter_tables.push(doc.table_id);if(doc.stat<3)await download_documents(doc)}try{_this.db_changes_store=remote_db.changes({since:"now",live:true,timeout:3e5,style:"main_only",include_docs:false}).on("change",async function(change){if(change.id.substr(0,4)!=="dbs-")return;if(_this.db_replication_from_stat!==3){set_replication_stat(SESSION_ID,3)}try{const existing_doc=await db.get(change.id);db.replicate.from(remote_db_url,{doc_ids:[change.id],retry:true,style:"main_only",fetch:function(url,opts){if(_session.gtp_token){opts.headers.set("xu-gtp-token",_session.gtp_token)}if(_session.app_token)opts.headers.set("xu-app-token",_session.app_token);{opts.headers.set("xu-db",db_name)}return PouchDB.fetch(url,opts)}})}catch(err){try{const table_id=change.id.split("_")[0].substr(4);for(let doc of rep_docs){if(doc.table_id===table_id){download_documents(doc)}}}catch(err){console.warn(err)}}}).on("complete",function(info){}).on("error",function(err){console.error(err);set_replication_stat(SESSION_ID,2);_this.db_changes_store.cancel()})}catch(err){console.error(err)}return};_db.pouch.remove_db_replication_from_server=async function(SESSION_ID,rep_id){const db=await func.utils.connect_pouchdb(SESSION_ID);try{const doc=await db.get(rep_id);db.remove(doc)}catch(error){}};_db.pouch.get_replications=async function(SESSION_ID=Object.keys(SESSION_OBJ)[0]){const db=await func.utils.connect_pouchdb(SESSION_ID);let ret=await db.find({selector:{docType:"rep_request"}});return ret.docs};_db.pouch.get_replication_stat=async function(SESSION_ID){const _session=_this.SESSION_OBJ[SESSION_ID];return _session?.DS_GLB?.[0]?.data_system?.SYS_GLOBAL_BOL_REPLICATION_STAT};const set_replication_stat=async function(SESSION_ID,from_stat,to_stat){var _session=_this.SESSION_OBJ[SESSION_ID];if(!_session?.DS_GLB?.[0]){return setTimeout(function(){set_replication_stat(SESSION_ID,from_stat,to_stat)},1e3)}if(from_stat)_this.db_replication_from_stat=from_stat;if(to_stat)_this.db_replication_to_stat=to_stat;var data={};if(_this.db_replication_from_stat===3&&_this.db_replication_to_stat===3){data.SYS_GLOBAL_BOL_REPLICATION_STAT=1;console.info("Replication On")}else{data.SYS_GLOBAL_BOL_REPLICATION_STAT=0;console.info("Replication Off")}var datasource_changes={[0]:{["data_system"]:data}};await func.datasource.update(SESSION_ID,datasource_changes)};const refresh_document_changes_for_realtime_update=function(SESSION_ID,doc_change){var _session=_this.SESSION_OBJ[SESSION_ID];if(glb.IS_WORKER){return func.utils.post_back_to_client(SESSION_ID,"refresh_document_changes_for_realtime_update",_session.worker_id,{doc_change:doc_change})}func.runtime.ui.refresh_document_changes_for_realtime_update(SESSION_ID,doc_change)};
|
|
@@ -52,7 +52,7 @@ _db.save_data = async function (SESSION_ID, dsSessionP, keyP) {
|
|
|
52
52
|
|
|
53
53
|
let table_ret = await _this.func.utils.FILES_OBJ.get(SESSION_ID, dataSourceTableId);
|
|
54
54
|
|
|
55
|
-
if (!table_ret.tableIndexes ||
|
|
55
|
+
if (!table_ret.tableIndexes || xu_isEmpty(table_ret.tableIndexes)) {
|
|
56
56
|
_db.save_indicator(SESSION_ID, false);
|
|
57
57
|
_this.func.utils.alerts.invoke(SESSION_ID, 'system_msg', 'SYS_MSG_0104'); //index missing
|
|
58
58
|
return;
|
|
@@ -90,9 +90,9 @@ _db.save_data = async function (SESSION_ID, dsSessionP, keyP) {
|
|
|
90
90
|
_this.func.utils.alerts.invoke(SESSION_ID, 'system_msg', 'SYS_MSG_0120'); //Create Mode Denied
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
|
|
93
|
+
for (const [key, val] of Object.entries(_ds.data_feed.rows_added)) {
|
|
94
94
|
data[key] = val;
|
|
95
|
-
}
|
|
95
|
+
}
|
|
96
96
|
|
|
97
97
|
delete _ds.data_feed.rows_added['newRecord'];
|
|
98
98
|
save_ret = await _this.func.common.db(SESSION_ID, 'dbs_create', data, {}, dsSessionP);
|
|
@@ -342,7 +342,7 @@ _db.get_query = async function (
|
|
|
342
342
|
error: null,
|
|
343
343
|
source: viewSourceDescP,
|
|
344
344
|
json: data,
|
|
345
|
-
fields:
|
|
345
|
+
fields: Object.assign({}, ds.locate_from, ds.locate_to),
|
|
346
346
|
type: 'file',
|
|
347
347
|
dsSession: dsSessionP,
|
|
348
348
|
});
|
|
@@ -362,7 +362,7 @@ _db.get_query = async function (
|
|
|
362
362
|
error: err_msg,
|
|
363
363
|
source: viewSourceDescP,
|
|
364
364
|
json: null,
|
|
365
|
-
fields:
|
|
365
|
+
fields: Object.assign({}, ds.locate_from, ds.locate_to),
|
|
366
366
|
type: 'file',
|
|
367
367
|
dsSession: dsSessionP,
|
|
368
368
|
});
|
|
@@ -411,17 +411,17 @@ _db.get_query = async function (
|
|
|
411
411
|
data.sort_dir = sort_dir;
|
|
412
412
|
}
|
|
413
413
|
|
|
414
|
-
if (!
|
|
414
|
+
if (!xu_isEmpty(filterModel?.filterModelNative)) {
|
|
415
415
|
data.filterModelNative = JSON.stringify(filterModel.filterModelNative);
|
|
416
416
|
}
|
|
417
|
-
if (!
|
|
417
|
+
if (!xu_isEmpty(filterModel?.filterModelMongo)) {
|
|
418
418
|
data.filterModelMongo = JSON.stringify(filterModel.filterModelMongo);
|
|
419
419
|
}
|
|
420
420
|
|
|
421
421
|
if (filterModel?.filterModelSql) {
|
|
422
422
|
data.filterModelSql = JSON.stringify(filterModel.filterModelSql);
|
|
423
423
|
}
|
|
424
|
-
if (!
|
|
424
|
+
if (!xu_isEmpty(filterModel?.filterModelUserMongo)) {
|
|
425
425
|
data.filterModelUserMongo = JSON.stringify(filterModel.filterModelUserMongo);
|
|
426
426
|
}
|
|
427
427
|
if (filterModel?.filterModelUserSql) {
|
|
@@ -656,7 +656,7 @@ _db.pouch.init_db_replication = async function (SESSION_ID) {
|
|
|
656
656
|
});
|
|
657
657
|
|
|
658
658
|
_db.pouch.set_db_replication_from_server(SESSION_ID);
|
|
659
|
-
|
|
659
|
+
func.runtime.platform.on('set_db_replication_from_server', () => {
|
|
660
660
|
_db.pouch.set_db_replication_from_server(SESSION_ID);
|
|
661
661
|
});
|
|
662
662
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const watch=function(SESSION_ID,key,type,info,result,condition,not_executed){if(!glb.DEBUG_MODE)return;var _session=SESSION_OBJ[SESSION_ID];if(!glb?.DEBUG_INFO_OBJ?.command?.watch?.[key])return;var obj=glb.DEBUG_INFO_OBJ.command.watch[key];if(!obj)return;if(obj.type===type){var result_str="";if(typeof result!=="object"){result_str=" -> "+result}var cond_label="";if(condition)cond_label="Condition:";else condition="";if(!not_executed){console.info("%c Watch: "+obj.name+result_str,"color: dark-gray; font-weight: bold;",info,typeof result==="object"?result:"",cond_label,condition)}else{console.info("%c Watch: "+obj.name+result_str,"color: gray; font-weight: normal;",info,typeof result==="object"?result:"",cond_label,condition,"- NOT EXECUTED !!")}const watch_obj={service:"watch_log",data:{name:obj.name,type:type,info:info,result:result,condition:condition,not_executed:not_executed},id:STUDIO_WEBSOCKET_CONNECTION_ID,uid:_session.USR_OBJ._id,source:"runtime",app_id:_session.app_id,gtp_token:_session.gtp_token,app_token:_session.app_token};if(typeof IS_DOCKER==="undefined"&&typeof IS_PROCESS_SERVER==="undefined"&&!glb.IS_WORKER){STUDIO_PEER_CONN_SEND_METHOD(watch_obj)}else{func.utils.post_back_to_client(SESSION_ID,"send_watch_to_studio_websocket",_session.worker_id,watch_obj)}}};export const log=function(SESSION_ID,node_idP,jsonP){if(typeof IS_PROCESS_SERVER!=="undefined")return;var _session=SESSION_OBJ[SESSION_ID];if(glb.DEBUG_MODE){if(jsonP.error||jsonP.warning){var desc=jsonP.action+(typeof jsonP.prop!=="undefined"?"Prop: "+jsonP.prop.toString():"")+(typeof jsonP.details!=="undefined"&&jsonP.details!==jsonP.prop.toString()?" Result: "+jsonP.details.toString():"");if(jsonP.error){if(!glb.IS_WORKER)func.utils.alerts.toast(SESSION_ID,typeof jsonP.error!=="boolean"?jsonP.error:"Error",desc,"error");if(typeof jsonP.error!=="boolean")desc=jsonP.error+": "+desc;console.info("%c Error: "+desc,"color: red; font-weight: bold;",jsonP)}if(jsonP.warning){if(!glb.IS_WORKER)func.utils.alerts.toast(SESSION_ID,typeof jsonP.warning!=="boolean"?jsonP.warning:"Warning",desc,"warning");if(typeof jsonP.warning!=="boolean")desc=jsonP.warning+": "+desc;console.info("%c Warring: "+desc,"color: orange; font-weight: bold;",jsonP)}}}if(jsonP.error||glb.TRACE_ON){var d=new Date;var ms=d.getMilliseconds();var t=
|
|
1
|
+
export const watch=function(SESSION_ID,key,type,info,result,condition,not_executed){if(!glb.DEBUG_MODE)return;var _session=SESSION_OBJ[SESSION_ID];if(!glb?.DEBUG_INFO_OBJ?.command?.watch?.[key])return;var obj=glb.DEBUG_INFO_OBJ.command.watch[key];if(!obj)return;if(obj.type===type){var result_str="";if(typeof result!=="object"){result_str=" -> "+result}var cond_label="";if(condition)cond_label="Condition:";else condition="";if(!not_executed){console.info("%c Watch: "+obj.name+result_str,"color: dark-gray; font-weight: bold;",info,typeof result==="object"?result:"",cond_label,condition)}else{console.info("%c Watch: "+obj.name+result_str,"color: gray; font-weight: normal;",info,typeof result==="object"?result:"",cond_label,condition,"- NOT EXECUTED !!")}const watch_obj={service:"watch_log",data:{name:obj.name,type:type,info:info,result:result,condition:condition,not_executed:not_executed},id:STUDIO_WEBSOCKET_CONNECTION_ID,uid:_session.USR_OBJ._id,source:"runtime",app_id:_session.app_id,gtp_token:_session.gtp_token,app_token:_session.app_token};if(typeof IS_DOCKER==="undefined"&&typeof IS_PROCESS_SERVER==="undefined"&&!glb.IS_WORKER){STUDIO_PEER_CONN_SEND_METHOD(watch_obj)}else{func.utils.post_back_to_client(SESSION_ID,"send_watch_to_studio_websocket",_session.worker_id,watch_obj)}}};export const log=function(SESSION_ID,node_idP,jsonP){if(typeof IS_PROCESS_SERVER!=="undefined")return;var _session=SESSION_OBJ[SESSION_ID];if(glb.DEBUG_MODE){if(jsonP.error||jsonP.warning){var desc=jsonP.action+(typeof jsonP.prop!=="undefined"?"Prop: "+jsonP.prop.toString():"")+(typeof jsonP.details!=="undefined"&&jsonP.details!==jsonP.prop.toString()?" Result: "+jsonP.details.toString():"");if(jsonP.error){if(!glb.IS_WORKER)func.utils.alerts.toast(SESSION_ID,typeof jsonP.error!=="boolean"?jsonP.error:"Error",desc,"error");if(typeof jsonP.error!=="boolean")desc=jsonP.error+": "+desc;console.info("%c Error: "+desc,"color: red; font-weight: bold;",jsonP)}if(jsonP.warning){if(!glb.IS_WORKER)func.utils.alerts.toast(SESSION_ID,typeof jsonP.warning!=="boolean"?jsonP.warning:"Warning",desc,"warning");if(typeof jsonP.warning!=="boolean")desc=jsonP.warning+": "+desc;console.info("%c Warring: "+desc,"color: orange; font-weight: bold;",jsonP)}}}if(jsonP.error||glb.TRACE_ON){var d=new Date;var ms=d.getMilliseconds();var t=String((d.getHours()+1).toString()).padStart(2)+":"+String((d.getMinutes()+1).toString()).padStart(2)+":"+String(d.getSeconds().toString()).padStart(2)+":"+String(ms.toString()).padStart(3);var json_new=Object.assign({node_id:node_idP,time:t},jsonP);if(glb.DEBUG_MODE){write(SESSION_ID,json_new)}if(glb.TRACE_ON){let obj={source:"runtime",service:"trace",client_id_from:_session.SYS_GLOBAL_OBJ_CLIENT_INFO.fingerprint,client_id_to:glb.TRACE_CLIENT_ID,data:json_new}}}};export const write=function(SESSION_ID,logP){var _session=SESSION_OBJ[SESSION_ID];const obj={service:"debug_log",data:{data:logP},id:STUDIO_WEBSOCKET_CONNECTION_ID,session_id:SESSION_ID,uid:_session.USR_OBJ._id,source:"runtime",app_id:_session.app_id,gtp_token:_session.gtp_token,app_token:_session.app_token,ts:Date.now()};if(_session.engine_mode==="live_preview"){if(typeof IS_DOCKER==="undefined"&&typeof IS_PROCESS_SERVER==="undefined"&&!glb.IS_WORKER){if(STUDIO_PEER_CONN_SEND_METHOD)STUDIO_PEER_CONN_SEND_METHOD(obj)}else if(glb.IS_WORKER){func.utils.post_back_to_client(SESSION_ID,"write_debug_log",_session.worker_id,obj)}}else{console.log(logP)}};export const read_command=async function(data){glb.DEBUG_INFO_OBJ.command=data;if(!glb.DEBUG_INFO_OBJ.command)return;if(glb.DEBUG_INFO_OBJ.command.log==="stop"){const module=await func.common.get_module(SESSION_ID,"xuda-live-preview-module.esm.js");module.send_STUDIO_WEBSOCKET(SESSION_ID,"close");window.close();return}Object.entries(WEB_WORKER[SESSION_ID]||{}).forEach(function([key,val]){if(RUNTIME_SERVER_WEBSOCKET&&RUNTIME_SERVER_WEBSOCKET_CONNECTED&&(!_session.opt.app_computing_mode||_session.opt.app_computing_mode==="server")){var obj1={service:"update_debug_info",data:glb.DEBUG_INFO_OBJ,id:key};WEB_WORKER[SESSION_ID][key].worker.emit("message",obj1)}else{WEB_WORKER[SESSION_ID][key].worker.postMessage({service:"update_debug_info",data:glb.DEBUG_INFO_OBJ,id:key})}})};
|
|
@@ -136,15 +136,15 @@ export const log = function (SESSION_ID, node_idP, jsonP) {
|
|
|
136
136
|
var d = new Date(); //.valueOf();
|
|
137
137
|
var ms = d.getMilliseconds();
|
|
138
138
|
var t =
|
|
139
|
-
|
|
139
|
+
String((d.getHours() + 1).toString()).padStart(2) +
|
|
140
140
|
":" +
|
|
141
|
-
|
|
141
|
+
String((d.getMinutes() + 1).toString()).padStart(2) +
|
|
142
142
|
":" +
|
|
143
|
-
|
|
143
|
+
String(d.getSeconds().toString()).padStart(2) +
|
|
144
144
|
":" +
|
|
145
|
-
|
|
145
|
+
String(ms.toString()).padStart(3);
|
|
146
146
|
|
|
147
|
-
var json_new =
|
|
147
|
+
var json_new = Object.assign(
|
|
148
148
|
{
|
|
149
149
|
node_id: node_idP,
|
|
150
150
|
time: t,
|
|
@@ -219,7 +219,7 @@ export const read_command = async function (data) {
|
|
|
219
219
|
return;
|
|
220
220
|
}
|
|
221
221
|
|
|
222
|
-
|
|
222
|
+
Object.entries(WEB_WORKER[SESSION_ID] || {}).forEach(function ([key, val]) {
|
|
223
223
|
if (
|
|
224
224
|
RUNTIME_SERVER_WEBSOCKET &&
|
|
225
225
|
RUNTIME_SERVER_WEBSOCKET_CONNECTED &&
|
|
@@ -18,19 +18,19 @@ const get_ui_ids = function (SESSION_ID, event_prop) {
|
|
|
18
18
|
if (event_prop.selector === '@_THIS') event_prop.selector = elementP;
|
|
19
19
|
// var ui_ids = [];
|
|
20
20
|
if (event_prop.selector_type == 'tree_id') {
|
|
21
|
-
let $elm = func.UI.utils.find_in_element_data('xuData',
|
|
21
|
+
let $elm = func.UI.utils.find_in_element_data('xuData', func.runtime.ui.as_jquery(SESSION_OBJ[SESSION_ID].root_element), 'ui_id', event_prop.selector);
|
|
22
22
|
return [
|
|
23
23
|
{
|
|
24
24
|
ui_id: event_prop.selector,
|
|
25
|
-
tagName: $elm
|
|
25
|
+
tagName: func.runtime.ui.get_data($elm)?.xuData?.node.tagName,
|
|
26
26
|
},
|
|
27
27
|
];
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
return
|
|
30
|
+
return Array.from(SESSION_OBJ[SESSION_ID].root_element.querySelectorAll(event_prop.selector)).map(function (val, key) {
|
|
31
31
|
return {
|
|
32
|
-
ui_id:
|
|
33
|
-
tagName:
|
|
32
|
+
ui_id: func.runtime.ui.get_data(val, 'xuData')?.ui_id,
|
|
33
|
+
tagName: func.runtime.ui.get_data(val, 'xuData')?.node.tagName,
|
|
34
34
|
};
|
|
35
35
|
});
|
|
36
36
|
};
|
|
@@ -95,7 +95,7 @@ const set_info_value = async function (SESSION_ID, value, source, event_prop, re
|
|
|
95
95
|
|
|
96
96
|
const element_not_found = function (SESSION_ID, dsP, jobNoP, alter_attr, ui_id) {
|
|
97
97
|
var _session = SESSION_OBJ[SESSION_ID];
|
|
98
|
-
if (
|
|
98
|
+
if (xu_isEmpty(SCREEN_BLOCKER_OBJ)) {
|
|
99
99
|
// still busy not require alert
|
|
100
100
|
if (_session.DS_GLB[dsP]) {
|
|
101
101
|
log_error(SESSION_ID, 'UI element not found', alter_attr + ' > ' + ui_id, null, _session.DS_GLB[dsP].prog_id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const log_error=function(SESSION_ID,action,descP,detailsP,warning,prog_id){func.utils.debug.log(SESSION_ID,log_nodeId,{module:"event",action:action,source:"",prop:descP,details:detailsP,result:null,error:!warning,warning:warning,fields:null,type:"event",prog_id:prog_id})};const get_ui_ids=function(SESSION_ID,event_prop){if(event_prop.selector==="@_THIS")event_prop.selector=elementP;if(event_prop.selector_type=="tree_id"){let $elm=func.UI.utils.find_in_element_data("xuData"
|
|
1
|
+
const log_error=function(SESSION_ID,action,descP,detailsP,warning,prog_id){func.utils.debug.log(SESSION_ID,log_nodeId,{module:"event",action:action,source:"",prop:descP,details:detailsP,result:null,error:!warning,warning:warning,fields:null,type:"event",prog_id:prog_id})};const get_ui_ids=function(SESSION_ID,event_prop){if(event_prop.selector==="@_THIS")event_prop.selector=elementP;if(event_prop.selector_type=="tree_id"){let $elm=func.UI.utils.find_in_element_data("xuData",func.runtime.ui.as_jquery(SESSION_OBJ[SESSION_ID].root_element),"ui_id",event_prop.selector);return[{ui_id:event_prop.selector,tagName:func.runtime.ui.get_data($elm)?.xuData?.node.tagName}]}return Array.from(SESSION_OBJ[SESSION_ID].root_element.querySelectorAll(event_prop.selector)).map(function(val,key){return{ui_id:func.runtime.ui.get_data(val,"xuData")?.ui_id,tagName:func.runtime.ui.get_data(val,"xuData")?.node.tagName}})};const get_ui_id=async function(SESSION_ID,dsSession,event_prop,rowP){if(event_prop.selector==="@_THIS")event_prop.selector=elementP;return await func.expression.get(SESSION_ID,event_prop.selector,dsSession,"ui_id",rowP)};const set_info_value=async function(SESSION_ID,value,source,event_prop,resolve){var _session=SESSION_OBJ[SESSION_ID];if(!event_prop.field_return_value){log_error(SESSION_ID,source," Field cannot be empty");return}var fieldId=event_prop.field_return_value.substr(1);if(event_prop.field_return_value.substr(0,1)!=="@"){log_error(SESSION_ID,source,fieldId+" Field not valid");return}var fieldsChanged_arr=[];var rows_changed_arr=[];var returned_ds;const update_ds=async function(dsP,rowIdP){if(!dsP||!_session.DS_GLB[dsP])return;var _ds=_session.DS_GLB[dsP];try{const row_idx=func.common.find_ROWID_idx(_ds,rowIdP);if(_ds.data_feed?.rows?.[row_idx]?.[fieldId])_ds.data_feed.rows[row_idx][fieldId]=value}catch(err){console.error(err)}if(!fieldsChanged_arr.includes(fieldId))fieldsChanged_arr.push(fieldId);if(!rows_changed_arr.includes(rowIdP))rows_changed_arr.push(rowIdP);returned_ds=dsP;const _view_obj=await func.utils.VIEWS_OBJ.get(SESSION_ID,_ds.prog_id);var field_row_id=func.common.find_item_by_key(_view_obj.progFields,"field_id",fieldId)?.id;func.utils.debug.watch(SESSION_ID,_ds.prog_id+"%"+field_row_id,"view_field","Source: "+source,value)};const ret=await func.datasource.get_value(SESSION_ID,fieldId,dsSession,_session.DS_GLB[dsSession].currentRecordId);await update_ds(ret.dsSessionP,ret.currentRecordId);if(returned_ds){var obj={sessionChanged:returned_ds,viewType_target:_session.DS_GLB[returned_ds].viewType,rows_changed:rows_changed_arr,fieldsChanged:fieldsChanged_arr};await func.datasource.update(SESSION_ID,obj);resolve()}};const element_not_found=function(SESSION_ID,dsP,jobNoP,alter_attr,ui_id){var _session=SESSION_OBJ[SESSION_ID];if(xu_isEmpty(SCREEN_BLOCKER_OBJ)){if(_session.DS_GLB[dsP]){log_error(SESSION_ID,"UI element not found",alter_attr+" > "+ui_id,null,_session.DS_GLB[dsP].prog_id)}}if(jobNoP){func.events.delete_job(SESSION_ID,jobNoP)}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const cast=function(typeP,valP,report_conversion_error_callback,report_conversion_warn_callback){
|
|
1
|
+
export const cast=function(typeP,valP,report_conversion_error_callback,report_conversion_warn_callback){var ret=valP;const report_conversion_error=function(res){if(report_conversion_error_callback){report_conversion_error_callback(res,typeP,valP)}};const report_conversion_warn=function(res){if(report_conversion_warn_callback){report_conversion_warn_callback(res,typeP,valP)}};switch(typeP){case"boolean":case"bool":const true_bool_opt=["Y",1,true,"TRUE","ON","YES","1"];const false_bool_opt=["N",0,false,"FALSE","OFF","NO","0"];if(true_bool_opt.includes(String(valP).toUpperCase())){ret=true;break}if(false_bool_opt.includes(String(valP).toUpperCase())||!valP){ret=false}break;case"number":if(typeof valP==="undefined"||typeof valP==="NaN"||valP===null){ret=0}else{if(typeof valP!=="number"){try{if(typeof valP==="boolean"){ret=valP?1:0}else{ret=Number(valP)}}catch(e){ret=0;report_conversion_error(0)}}}break;case"string":if(typeof valP==="undefined"||typeof valP==="NaN"||valP===null){ret=""}else{if(typeof valP!=="string"){try{ret=String(valP);report_conversion_warn()}catch(e){ret="";report_conversion_error("blanc")}}}break;case"object":if(typeof valP==="undefined"||typeof valP==="NaN"||valP===null){ret={}}else{if(typeof valP!=="object"){try{if(valP){ret=JSON5.parse(valP)}else{ret={}}}catch(e){try{ret=JSON5.parse(valP)}catch(error){ret={};report_conversion_error("{}")}}}}break;case"array":if(typeof valP==="undefined"||typeof valP==="NaN"||valP===null||valP===""){ret=[]}else{if(!Array.isArray(valP)){try{ret=Array.from(eval(valP))}catch(e){ret=[];report_conversion_error("[]")}}}break;default:if(typeof valP==="undefined"||typeof valP==="NaN"||valP===null){ret=""}else{if(typeof valP!=="string"){try{ret=valP.toString();report_conversion_warn()}catch(e){ret="";report_conversion_error("blanc")}}}break}return ret};
|
|
@@ -4,11 +4,6 @@ export const cast = function (
|
|
|
4
4
|
report_conversion_error_callback,
|
|
5
5
|
report_conversion_warn_callback
|
|
6
6
|
) {
|
|
7
|
-
if (typeof _ === "undefined") {
|
|
8
|
-
console.error("error: _ library not defined in cast");
|
|
9
|
-
return valP;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
7
|
var ret = valP;
|
|
13
8
|
|
|
14
9
|
const report_conversion_error = function (res) {
|
|
@@ -26,12 +21,12 @@ export const cast = function (
|
|
|
26
21
|
case "bool":
|
|
27
22
|
const true_bool_opt = ["Y", 1, true, "TRUE", "ON", "YES", "1"];
|
|
28
23
|
const false_bool_opt = ["N", 0, false, "FALSE", "OFF", "NO", "0"];
|
|
29
|
-
if (true_bool_opt.includes(
|
|
24
|
+
if (true_bool_opt.includes(String(valP).toUpperCase())) {
|
|
30
25
|
ret = true;
|
|
31
26
|
break;
|
|
32
27
|
}
|
|
33
28
|
|
|
34
|
-
if (false_bool_opt.includes(
|
|
29
|
+
if (false_bool_opt.includes(String(valP).toUpperCase()) || !valP) {
|
|
35
30
|
ret = false;
|
|
36
31
|
}
|
|
37
32
|
|
|
@@ -50,7 +45,7 @@ export const cast = function (
|
|
|
50
45
|
if (typeof valP === "boolean") {
|
|
51
46
|
ret = valP ? 1 : 0;
|
|
52
47
|
} else {
|
|
53
|
-
ret =
|
|
48
|
+
ret = Number(valP);
|
|
54
49
|
}
|
|
55
50
|
// normal behavior studio always store values as string
|
|
56
51
|
// report_conversion_warn();
|
|
@@ -71,7 +66,7 @@ export const cast = function (
|
|
|
71
66
|
} else {
|
|
72
67
|
if (typeof valP !== "string") {
|
|
73
68
|
try {
|
|
74
|
-
ret =
|
|
69
|
+
ret = String(valP);
|
|
75
70
|
report_conversion_warn();
|
|
76
71
|
} catch (e) {
|
|
77
72
|
ret = "";
|
|
@@ -117,7 +112,7 @@ export const cast = function (
|
|
|
117
112
|
} else {
|
|
118
113
|
if (!Array.isArray(valP)) {
|
|
119
114
|
try {
|
|
120
|
-
ret =
|
|
115
|
+
ret = Array.from(eval(valP));
|
|
121
116
|
} catch (e) {
|
|
122
117
|
ret = [];
|
|
123
118
|
report_conversion_error("[]");
|