@xuda.io/runtime-bundle
Version:
The Xuda Runtime Bundle refers to a collection of scripts and libraries packaged together to provide the necessary runtime environment for executing plugins or components in the Xuda platform.
520 lines (493 loc) • 14 kB
JavaScript
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; // get index id
v.dataSourceIndexIdExp = view_ret.progDataSource.dataSourceIndexIdExp; // get index exp
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) {
// issue alert expression returned empty value
_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"
);
}
// var index_keys = index_obj.data.keys;
if (!v.dataSourceIndexesObj?.[v.dataSourceIndexId]) {
_this.func.utils.debug_report(
SESSION_ID,
"BUILD FILTER QUERY",
"Index not found",
"W"
);
}
// v.viewIndex = {};
// _.forEach(index_keys, function (val, key) {
// var item = v.dataSourceIndexesObj[v.dataSourceIndexId][val];
// v.viewIndex[key] = {
// [val]: {
// from: item.from,
// to: item.to,
// locate_from: item.locate_from,
// locate_to: item.locate_to,
// },
// };
// });
}
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; // get ascending/descending
var sortOrderTypeExp = ret.progDataSource.dataSourceSortExp; // get ascending/descending
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) {
// index definition exist
_ds.filter_from = {};
_ds.filter_to = {};
_ds.locate_from = {};
_ds.locate_to = {};
var locate_exist;
var locate_error;
if (v.viewIndex) {
for await (const [keySegment, valSegment] of Object.entries(
v.viewIndex[v.dataSourceIndexId]
)) {
// run on segments rows
var fieldId = keySegment; // key segment
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; // key val or fieldID from
var fieldValTo = valSegment.to; // key val or fieldID 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 = '""'; // removed Aug 27 2024
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) {
// later use for refresh purpose
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") {
// locate
v.segLocateFrom[keySegment] = v.segFrom[keySegment]; // put defaults from range
v.segLocateTo[keySegment] = v.segTo[keySegment]; // put defaults from range
// linkTypeLocate = valSegment.data[6]; // value/field
v.fieldLocateValFrom = valSegment.locate_from; // key val or fieldID from
v.fieldLocateValTo = valSegment.locate_to; // key val or fieldID 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;
};
{
// regular filter
v.couchView = query_string_helper(
_ds._dataSourceTableId,
v.dataSourceIndexId,
v.segFrom,
v.segTo,
sortOrder,
filter_from,
filter_to
);
}
// locate
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 {
// index definition missing
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 skip;
var args = _ds.args;
const finish_dataset = async function () {
_ds.rows_found = rows_count;
// new condition "rows" added to prevent after record if no rows found 2021 09 17
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 () {
// _ds.currentRecordId = "dataset";
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();
}
// Alert record not found
_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;
}
// from DB
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;
_.forEach(v.viewIndex, function (val, key) {
if (val.data[0] === fieldId) {
ret = key;
return false;
}
});
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;
// var save_before_exit = async function () {
// if (
// v.screenInfo &&
// v.screenInfo.menuType === "set_data" &&
// _.size(v.jsonP.rows)
// ) {
// await _this.func.db.save_data(SESSION_ID, dataSourceSession, callback_dataset);
// } else {
// callback_dataset();
// }
// };
if (exit_event_count) {
await _this.func.datasource.execute_view_events(
SESSION_ID,
dataSourceSession,
"on_exit"
);
if (
v?.screenInfo?.properties?.menuType === "set_data" &&
_.size(v.jsonP.rows)
) {
return await _this.func.db.save_data(SESSION_ID, dataSourceSession);
}
}
return;
};