@xuda.io/xuda-worker-bundle 1.3.1222 → 1.3.1224

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.
Files changed (2) hide show
  1. package/index.js +1302 -5
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -3243,10 +3243,15 @@ func.datasource.run_events_functions = async function (
3243
3243
 
3244
3244
 
3245
3245
  }
3246
- // if (job_promises.length) {
3247
- // await Promise.all(job_promises)
3248
- // }
3249
- resolve()
3246
+ if (job_promises.length) {
3247
+ Promise.all(job_promises)
3248
+ .then((e) => {
3249
+ resolve()
3250
+ });
3251
+
3252
+ } else {
3253
+ resolve()
3254
+ }
3250
3255
 
3251
3256
  })
3252
3257
 
@@ -4012,7 +4017,1299 @@ func.datasource.del = function (SESSION_ID, dsP) {
4012
4017
  RUNTIME_SERVER_WEBSOCKET_CONNECTED &&
4013
4018
  (!_session.opt.app_computing_mode ||
4014
4019
  _session.opt.app_computing_mode === "server")
4015
- func.utils = {};
4020
+ ) {
4021
+ WEB_WORKER[SESSION_ID][_ds.worker_id].emit("message", {
4022
+ service: "close_websocket",
4023
+ });
4024
+ } else {
4025
+ WEB_WORKER[SESSION_ID][_ds.worker_id].worker.terminate();
4026
+ }
4027
+
4028
+ delete WEB_WORKER[SESSION_ID][_ds.worker_id];
4029
+ } else {
4030
+ const json = await func.index.call_worker(SESSION_ID, {
4031
+ service: "datasource_delete",
4032
+ data: data,
4033
+ id: _ds.worker_id,
4034
+ });
4035
+ response.success(json, true);
4036
+ }
4037
+ if (DS_UI_EVENTS_GLB) delete DS_UI_EVENTS_GLB[dsP];
4038
+ }
4039
+ delete SESSION_OBJ[SESSION_ID].DS_GLB[dsP];
4040
+ };
4041
+
4042
+ var delete_pending_jobs = function () {
4043
+ var arr = [];
4044
+ _.forEach(SESSION_OBJ[SESSION_ID].WORKER_OBJ.jobs, function (val, key) {
4045
+ if (val && val.dsSessionP == dsP) {
4046
+ arr.push(key);
4047
+ for (const [key, val] of Object.entries($(".screen_blocker"))) {
4048
+ $(val).remove();
4049
+ }
4050
+ }
4051
+ });
4052
+ for (let val of arr.reverse()) {
4053
+ SESSION_OBJ[SESSION_ID].WORKER_OBJ.jobs.splice(val, 1);
4054
+ }
4055
+ if (!SESSION_OBJ[SESSION_ID].WORKER_OBJ.jobs.length)
4056
+ SESSION_OBJ[SESSION_ID].WORKER_OBJ.stat = null;
4057
+ };
4058
+ if (!glb.IS_WORKER) {
4059
+ if (SESSION_OBJ[SESSION_ID].DS_GLB[dsP]) {
4060
+ delete SCREEN_BLOCKER_OBJ[
4061
+ SESSION_OBJ[SESSION_ID].DS_GLB[dsP].screenId +
4062
+ "_" +
4063
+ SESSION_OBJ[SESSION_ID].DS_GLB[dsP].callingScreenId
4064
+ ];
4065
+
4066
+ delete_pending_jobs();
4067
+ }
4068
+ if ($(SESSION_OBJ[SESSION_ID].root_element).find("xu-nav").length) {
4069
+ var ds_obj = $(SESSION_OBJ[SESSION_ID].root_element)
4070
+ .find("xu-nav")
4071
+ ?.data()?.xuData.nav_params;
4072
+ if (ds_obj) {
4073
+ delete ds_obj[dsP];
4074
+ }
4075
+ }
4076
+ }
4077
+ perform_delete();
4078
+ };
4079
+ func.datasource.update = async function (
4080
+ SESSION_ID,
4081
+ datasource_changes,
4082
+ from_worker
4083
+ ) {
4084
+ return new Promise(async (resolve, reject) => {
4085
+ var _session = SESSION_OBJ[SESSION_ID];
4086
+
4087
+ if (typeof glb.GLOBAL_VARS === "undefined") {
4088
+ glb.GLOBAL_VARS = (
4089
+ await func.common.get_module(
4090
+ SESSION_ID,
4091
+ "xuda-system-globals-module.mjs"
4092
+ )
4093
+ ).system_globals;
4094
+ }
4095
+ var fields_changes = [];
4096
+ var datasource_changed = [];
4097
+ for await (const [dataSource, row_data] of Object.entries(
4098
+ datasource_changes
4099
+ )) {
4100
+ var _ds = _session.DS_GLB[dataSource];
4101
+ if (!_ds) {
4102
+ continue;
4103
+ }
4104
+
4105
+ for (const [record_id, fields_data] of Object.entries(row_data)) {
4106
+ for (const [field_id, value] of Object.entries(fields_data)) {
4107
+ if (record_id === "datasource_main") {
4108
+ // _ds[field_id] = value;
4109
+ _.set(_ds, field_id, value);
4110
+ continue;
4111
+ }
4112
+
4113
+ if (typeof fields_data === "object") {
4114
+ if (glb.GLOBAL_VARS[field_id]) {
4115
+ _ds.data_system[field_id] = value;
4116
+
4117
+ continue;
4118
+ }
4119
+
4120
+ try {
4121
+ const row_idx = func.common.find_ROWID_idx(_ds, record_id);
4122
+ _ds.data_feed.rows[row_idx][field_id] = value;
4123
+ } catch (err) {
4124
+ console.error(err);
4125
+ }
4126
+
4127
+
4128
+
4129
+ if (!fields_changes.includes(field_id)) {
4130
+ fields_changes.push(field_id);
4131
+ }
4132
+ if (!datasource_changed.includes(dataSource)) {
4133
+ datasource_changed.push(dataSource);
4134
+ }
4135
+ } else if (fields_data === "set") {
4136
+ _ds.currentRecordId = record_id;
4137
+ }
4138
+
4139
+ if (!from_worker) {
4140
+ if (glb.IS_WORKER) {
4141
+ let tree_ret = await func.utils.TREE_OBJ.get(SESSION_ID, _ds.prog_id);
4142
+
4143
+ if (tree_ret.menuType === "globals") {
4144
+
4145
+ const _progFields = await func.datasource.get_progFields(
4146
+ SESSION_ID,
4147
+ dataSource
4148
+ );
4149
+ let view_field_obj = func.common.find_item_by_key(
4150
+ _progFields,
4151
+ "field_id",
4152
+ field_id
4153
+ );
4154
+ if (view_field_obj?.data?.serverField) {
4155
+ delete datasource_changed[dataSource][record_id][field_id]
4156
+ }
4157
+
4158
+ if (record_id === "data_system") {
4159
+ delete datasource_changed[dataSource][record_id]
4160
+ }
4161
+ }
4162
+ }
4163
+ }
4164
+ }
4165
+ if (!_ds.data_feed.rows_changed) {
4166
+ _ds.data_feed.rows_changed = [];
4167
+ }
4168
+ if (!_ds.data_feed.rows_changed.includes(record_id))
4169
+ _ds.data_feed.rows_changed.push(record_id);
4170
+
4171
+
4172
+
4173
+ }
4174
+
4175
+ if (!from_worker) {
4176
+ if (glb.IS_WORKER) {
4177
+ let tree_ret = await func.utils.TREE_OBJ.get(SESSION_ID, _ds.prog_id);
4178
+ let server_field = false
4179
+ // if (tree_ret.menuType === "globals") {
4180
+
4181
+ // const _progFields = await func.datasource.get_progFields(
4182
+ // SESSION_ID,
4183
+ // dataSource
4184
+ // );
4185
+ // let view_field_obj = func.common.find_item_by_key(
4186
+ // _progFields,
4187
+ // "field_id",
4188
+ // field_id
4189
+ // );
4190
+ // server_field = view_field_obj.serverField
4191
+ // }
4192
+
4193
+
4194
+ if (_session.IS_API || typeof IS_MASTER_WEBSOCKET !== "undefined" || typeof IS_PROCESS_SERVER !== "undefined") {
4195
+ continue;
4196
+ }
4197
+
4198
+ if (tree_ret.menuType !== "component" && tree_ret.menuType !== "globals") {
4199
+ // if (tree_ret.menuType !== "globals" || server_field) {
4200
+ continue;
4201
+ // }
4202
+ }
4203
+ // debugger;
4204
+ // update client
4205
+
4206
+ func.utils.post_back_to_client(
4207
+ SESSION_ID,
4208
+ "update_client_eventChangesResults_from_worker",
4209
+ _session.worker_id,
4210
+ datasource_changes
4211
+ );
4212
+ return resolve();
4213
+ }
4214
+
4215
+ if (!glb.IS_WORKER) {
4216
+ if (_ds._run_at !== "client" || _ds.tree_obj.menuType === "globals") {
4217
+ // no need to update worker
4218
+ // return resolve();
4219
+ // continue;
4220
+ // }
4221
+
4222
+ const ret = await func.index.call_worker(SESSION_ID, {
4223
+ service: "update_datasource_changes_from_client",
4224
+ data: {
4225
+ session_id: SESSION_ID,
4226
+ datasource_changes,
4227
+ },
4228
+ id: _ds.worker_id,
4229
+ });
4230
+ }
4231
+ }
4232
+ }
4233
+ }
4234
+ if (!glb.IS_WORKER) {
4235
+ ///// REFRESH SCREEN
4236
+ if (fields_changes.length) {
4237
+ await func.UI.screen.refresh_xu_attributes(SESSION_ID, fields_changes);
4238
+ await func.UI.screen.refresh_screen(
4239
+ SESSION_ID,
4240
+ fields_changes,
4241
+ null,
4242
+ datasource_changed[0] // refresh the current datasource only
4243
+ );
4244
+ }
4245
+ }
4246
+ return resolve();
4247
+ });
4248
+ };
4249
+
4250
+ func.datasource.callback = function (
4251
+ SESSION_ID,
4252
+ dsSessionP,
4253
+ na,
4254
+ rowIdP,
4255
+ jobNoP,
4256
+ NA_callingDataSourceP,
4257
+ NA_isInitP,
4258
+ nodeIdP
4259
+ ) {
4260
+ var _session = SESSION_OBJ[SESSION_ID];
4261
+ var _ds = _session.DS_GLB[dsSessionP];
4262
+
4263
+ try {
4264
+ const row_idx = func.common.find_ROWID_idx(_ds, "dataset");
4265
+
4266
+ if (_ds.PARAM_OUT_INFO) {
4267
+ // write log for out params
4268
+ for (const [key, val] of Object.entries(_ds.PARAM_OUT_INFO)) {
4269
+ if (
4270
+ typeof _ds?.data_feed?.rows?.[row_idx]?.[val.fieldId] === "undefined"
4271
+ ) {
4272
+ // func.utils.debug.log(SESSION_ID, key, val);
4273
+ func.utils.alerts.invoke(
4274
+ SESSION_ID,
4275
+ "system_msg",
4276
+ "SYS_MSG_0310",
4277
+ val.fieldId,
4278
+ dsSessionP
4279
+ );
4280
+ break;
4281
+ }
4282
+ val.result = _ds.data_feed.rows[row_idx][val.fieldId];
4283
+ }
4284
+ }
4285
+ } catch (err) {
4286
+ // console.error(err);
4287
+ }
4288
+
4289
+ func.utils.debug.log(SESSION_ID, nodeIdP, {
4290
+ module: _ds.viewModule,
4291
+ action: "close",
4292
+ source: _ds.viewSourceDesc,
4293
+ type: "adapter",
4294
+ prog_id: _ds.prog_id,
4295
+ dsSession: dsSessionP,
4296
+ prop: _ds.log_prop + " " + "adapter",
4297
+ });
4298
+ if (!glb.IS_WORKER) $(_session.root_element).css("cursor", "default");
4299
+
4300
+ if (_ds.prog_id) {
4301
+ let _ds = _session.DS_GLB[dsSessionP];
4302
+
4303
+ func.utils.debug.watch(
4304
+ SESSION_ID,
4305
+ _ds.prog_id,
4306
+ "program",
4307
+ {
4308
+ in_parameters: _ds.in_parameters,
4309
+ out_parameters: _ds.out_parameters,
4310
+ data_feed: _ds.data_feed,
4311
+ },
4312
+ _ds.tree_obj.menuType
4313
+ );
4314
+ }
4315
+ delete _ds.old_dataSource;
4316
+
4317
+
4318
+
4319
+ return {
4320
+ SESSION_ID,
4321
+ dsSessionP,
4322
+ rowIdP,
4323
+ jobNoP,
4324
+ callingLogId: _ds.callingLogId,
4325
+ calling_jobP: _ds.calling_jobP,
4326
+ };
4327
+ };
4328
+ func.datasource.validate_viewRange = async function (
4329
+ SESSION_ID,
4330
+ viewRangeExpP,
4331
+ dsSessionP,
4332
+ rowIdP,
4333
+ sourceP
4334
+ ) {
4335
+ var _ds = SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP];
4336
+ if (viewRangeExpP && _ds) {
4337
+ var ret = func.expression.remove_quotes(
4338
+ await func.expression.get(
4339
+ SESSION_ID,
4340
+ viewRangeExpP,
4341
+ dsSessionP,
4342
+ "range",
4343
+ rowIdP
4344
+ )
4345
+ );
4346
+ ret.result = func.expression.remove_quotes(ret.result);
4347
+ func.utils.debug.log(SESSION_ID, _ds.prog_id, {
4348
+ module: _ds.viewModule,
4349
+ action: "range Exp",
4350
+ prop: sourceP,
4351
+ details: viewRangeExpP,
4352
+ result: ret.result,
4353
+ error: ret.error,
4354
+ source: _ds.viewSourceDesc,
4355
+ json: ret.explain,
4356
+ fields: ret.fields,
4357
+ dsSession: dsSessionP,
4358
+ });
4359
+ _ds.viewRangeExpResults = ret.fields;
4360
+ if (glb.DEBUG_MODE) {
4361
+ if (!_ds.debug) {
4362
+ _ds.debug = {};
4363
+ }
4364
+ if (!_ds.debug.viewRangeExp) {
4365
+ _ds.debug.viewRangeExp = [];
4366
+ }
4367
+ _ds.debug.viewRangeExp.push(ret);
4368
+ }
4369
+ return ret.result;
4370
+ } else return false;
4371
+ };
4372
+ func.datasource.validate_viewLocate = async function (
4373
+ SESSION_ID,
4374
+ viewLocateExpP,
4375
+ dsSessionP,
4376
+ rowIdP,
4377
+ sourceP
4378
+ ) {
4379
+ if (viewLocateExpP && _ds) {
4380
+ var ret = func.expression.remove_quotes(
4381
+ await func.expression.get(
4382
+ SESSION_ID,
4383
+ viewLocateExpP,
4384
+ dsSessionP,
4385
+ "locate",
4386
+ rowIdP
4387
+ )
4388
+ );
4389
+ ret.result = func.expression.remove_quotes(ret.result);
4390
+ func.utils.debug.log(SESSION_ID, _ds.prog_id, {
4391
+ module: _ds.viewModule,
4392
+ action: "locate Exp",
4393
+ prop: sourceP,
4394
+ details: viewLocateExpP,
4395
+ result: ret.result,
4396
+ error: ret.error,
4397
+ source: _ds.viewSourceDesc,
4398
+ json: ret.explain,
4399
+ fields: ret.fields,
4400
+ dsSession: dsSessionP,
4401
+ });
4402
+ _ds.viewLocateExpResults = ret.fields;
4403
+ return ret.result;
4404
+ } else return false;
4405
+ };
4406
+
4407
+ func.datasource.get_viewFields_for_update_function = function (
4408
+ SESSION_ID,
4409
+ calling_trigger_prop,
4410
+ na,
4411
+ dsSessionP
4412
+ ) {
4413
+ var viewFields = [];
4414
+
4415
+ var exp = calling_trigger_prop?.data?.name?.value;
4416
+ if (!exp) {
4417
+ return viewFields;
4418
+ }
4419
+ try {
4420
+ // parse json
4421
+ var json = JSON5.parse(exp.replace(/\n/gi, ""));
4422
+ for (const [key, val] of Object.entries(json)) {
4423
+ let id = key.substr(1, key.length - 1);
4424
+ if (!id) continue;
4425
+ viewFields.push({
4426
+ val,
4427
+ id,
4428
+ });
4429
+ }
4430
+ return viewFields;
4431
+ } catch (e) {
4432
+ if (!exp) {
4433
+ return;
4434
+ }
4435
+ if (exp.substr(exp.length - 1, 1) === ";")
4436
+ exp = exp.substr(0, exp.length - 1); // remove closing if exist;
4437
+ var exp_arr = exp.split(/;\s*(?=(?:[^"]|"[^"]*")*$)/g); // split ; outside quotes
4438
+ if (exp_arr?.length) {
4439
+ for (let val of exp_arr) {
4440
+ // run view fields
4441
+ var pos = val.indexOf(":");
4442
+ var seg = [val.substring(0, pos), val.substring(pos + 1)];
4443
+ if (seg && seg.length === 2) {
4444
+ let id = seg[0].substr(1, seg[0].length);
4445
+ if (!id) continue;
4446
+ viewFields.push({
4447
+ id,
4448
+ val: seg[1],
4449
+ // , props: {},
4450
+ });
4451
+ } else {
4452
+ func.utils.debug.log(SESSION_ID, _ds.prog_id, {
4453
+ module: _ds.viewModule,
4454
+ action: "set",
4455
+ prop: "parse update exp",
4456
+ details: exp,
4457
+ result: "",
4458
+ error: "Invalid json; too many segments",
4459
+ source: _ds.viewSourceDesc,
4460
+ json: "",
4461
+ fields: "",
4462
+ dsSession: dsSessionP,
4463
+ });
4464
+ }
4465
+ }
4466
+ }
4467
+
4468
+ return viewFields;
4469
+ }
4470
+ };
4471
+ func.datasource.get_value = async function (
4472
+ SESSION_ID,
4473
+ fieldIdP,
4474
+ dsSessionP,
4475
+ rowIdP,
4476
+ org_dsSessionP
4477
+ ) {
4478
+ const return_value = async (field_id, value) => {
4479
+ const _progFields = await func.datasource.get_progFields(
4480
+ SESSION_ID,
4481
+ dsSessionP
4482
+ );
4483
+ let view_field_obj = func.common.find_item_by_key(
4484
+ _progFields,
4485
+ "field_id",
4486
+ field_id
4487
+ );
4488
+ var fieldType = view_field_obj?.props?.fieldType || "string";
4489
+ var fieldProp = view_field_obj?.props;
4490
+ let table_field_obj;
4491
+ if (view_field_obj?.data?.type === "table") {
4492
+ if (!_ds._dataSourceTableId) {
4493
+ return func.utils.debug_report(
4494
+ SESSION_ID,
4495
+ "Datasource",
4496
+ `Table type defined without dataSourceTableId deceleration`,
4497
+ "E"
4498
+ );
4499
+ }
4500
+
4501
+ let table_obj = await func.utils.FILES_OBJ.get(
4502
+ SESSION_ID,
4503
+ _ds._dataSourceTableId
4504
+ );
4505
+
4506
+ if (!table_obj) {
4507
+ return func.utils.debug_report(
4508
+ SESSION_ID,
4509
+ "Datasource",
4510
+ `dataSourceTableId reference error: ` + _ds._dataSourceTableId,
4511
+ "E"
4512
+ );
4513
+ }
4514
+ table_field_obj = func.common.find_item_by_key(
4515
+ table_obj.tableFields,
4516
+ "field_id",
4517
+ field_id
4518
+ );
4519
+ fieldType = table_field_obj.props?.fieldType;
4520
+ fieldProp = table_field_obj.props;
4521
+ }
4522
+
4523
+ let ret = {
4524
+ value: await func.common.get_cast_val(
4525
+ SESSION_ID,
4526
+ `datasource get value ${_ds.tree_obj.menuName}`,
4527
+ fieldIdP,
4528
+ fieldType,
4529
+ value,
4530
+ null
4531
+ ),
4532
+ type: fieldType,
4533
+ prop: fieldProp,
4534
+ };
4535
+
4536
+ if (ret.value && typeof ret.value === "string" && ret.type !== "exp") {
4537
+ if (/"/.test(ret.value) && ret.value.indexOf("\\") === -1)
4538
+ ret.value = ret.value.replace(/"/g, '"');
4539
+ }
4540
+
4541
+ return {
4542
+ ret,
4543
+ dsSessionP,
4544
+ fieldIdP: field_id,
4545
+ currentRecordId: _ds.currentRecordId,
4546
+ found: typeof value !== "undefined",
4547
+ };
4548
+ };
4549
+ const return_dynamic_value = async (field_id, value) => {
4550
+ let view_field_obj = _ds.dynamic_fields[field_id];
4551
+ var fieldType = view_field_obj?.props?.fieldType || "string";
4552
+ var fieldProp = view_field_obj?.props;
4553
+
4554
+ let ret = {
4555
+ value: view_field_obj.value,
4556
+ type: fieldType,
4557
+ prop: fieldProp,
4558
+ };
4559
+
4560
+ if (ret.value && typeof ret.value === "string" && ret.type !== "exp") {
4561
+ if (/"/.test(ret.value) && ret.value.indexOf("\\") === -1)
4562
+ ret.value = ret.value.replace(/"/g, '"');
4563
+ }
4564
+
4565
+ return {
4566
+ ret,
4567
+ dsSessionP,
4568
+ fieldIdP: field_id,
4569
+ currentRecordId: _ds.currentRecordId,
4570
+ found: typeof value !== "undefined",
4571
+ };
4572
+ };
4573
+ const return_value_parameters = async (field_id, value) => {
4574
+ let ret = {
4575
+ value: await func.common.get_cast_val(
4576
+ SESSION_ID,
4577
+ "datasource get value",
4578
+ fieldIdP,
4579
+ value.type,
4580
+ value.value,
4581
+ null
4582
+ ),
4583
+ type: value.type,
4584
+ prop: null,
4585
+ };
4586
+
4587
+ if (ret.value && typeof ret.value === "string" && ret.type !== "exp") {
4588
+ if (/"/.test(ret.value) && ret.value.indexOf("\\") === -1)
4589
+ ret.value = ret.value.replace(/"/g, '"');
4590
+ // if (/"/.test(ret.value) && ret.value.indexOf("\\") === -1)
4591
+ // ret.value = ret.value.replace(/"/g, '\\"');
4592
+ }
4593
+
4594
+ return {
4595
+ ret,
4596
+ dsSessionP,
4597
+ fieldIdP: field_id,
4598
+ currentRecordId: _ds.currentRecordId,
4599
+ found: typeof value !== "undefined",
4600
+ };
4601
+ };
4602
+ const return_value_system = async (field_id, value) => {
4603
+ let fieldType = glb.GLOBAL_VARS[field_id].type;
4604
+ let fieldProp = null;
4605
+
4606
+ let ret = {
4607
+ value: await func.common.get_cast_val(
4608
+ SESSION_ID,
4609
+ `datasource get value ${_ds.tree_obj.menuName}`,
4610
+ field_id,
4611
+ fieldType,
4612
+ value,
4613
+ null
4614
+ ),
4615
+ type: fieldType,
4616
+ prop: fieldProp,
4617
+ };
4618
+
4619
+ return {
4620
+ ret,
4621
+ dsSessionP,
4622
+ fieldIdP: field_id,
4623
+ currentRecordId: _ds.currentRecordId,
4624
+ found: typeof value !== "undefined",
4625
+ };
4626
+ };
4627
+ const search_in_parameters = async (field_id) => {
4628
+ if (typeof _ds?.in_parameters?.[field_id]?.value !== "undefined") {
4629
+ let ret = await return_value_parameters(
4630
+ field_id,
4631
+ _ds.in_parameters[field_id]
4632
+ );
4633
+ return ret;
4634
+ }
4635
+
4636
+ if (typeof _ds.parentDataSourceNo !== "undefined") {
4637
+ var org_dsSession = org_dsSessionP;
4638
+ if (!org_dsSessionP) org_dsSession = dsSessionP;
4639
+ if (recordId && recordId !== "newRecord") org_dsSession = null;
4640
+
4641
+ return await func.datasource.get_value(
4642
+ SESSION_ID,
4643
+ fieldIdP,
4644
+ _ds.parentDataSourceNo,
4645
+ recordId,
4646
+ org_dsSession
4647
+ );
4648
+ }
4649
+
4650
+ return await return_value(field_id);
4651
+ };
4652
+
4653
+ if (typeof glb.GLOBAL_VARS === "undefined") {
4654
+ glb.GLOBAL_VARS = (
4655
+ await func.common.get_module(SESSION_ID, "xuda-system-globals-module.mjs")
4656
+ ).system_globals;
4657
+ }
4658
+
4659
+ var _ds = SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP];
4660
+ if (!_ds) {
4661
+ if (dsSessionP > 0) {
4662
+ // let prev_ds = dsSessionP - 1;
4663
+ return await func.datasource.get_value(
4664
+ SESSION_ID,
4665
+ fieldIdP,
4666
+ dsSessionP - 1,
4667
+ rowIdP,
4668
+ org_dsSessionP
4669
+ );
4670
+ }
4671
+ return await return_value(fieldIdP);
4672
+ } //console.error("error: datasource not exist: " + dsSessionP);
4673
+
4674
+ let recordId = rowIdP;
4675
+ if (!recordId) {
4676
+ recordId = _ds.currentRecordId;
4677
+ }
4678
+
4679
+ if (glb.GLOBAL_VARS[fieldIdP]) {
4680
+ if (!_ds.data_system) {
4681
+ _ds.data_system = {};
4682
+ }
4683
+
4684
+ if (dsSessionP > 0) {
4685
+ _ds.data_system["SYS_STR_ACTIVE_ROW_ID"] = _ds.currentRecordId;
4686
+ _ds.data_system["SYS_STR_PROG_DS_SESSION"] = dsSessionP;
4687
+ }
4688
+
4689
+ // set system time
4690
+ if (glb.SYS_DATE_ARR.includes(fieldIdP)) {
4691
+ var _ds_0 = SESSION_OBJ[SESSION_ID].DS_GLB[0];
4692
+
4693
+ if (_ds_0) {
4694
+ if (!_ds_0.data_system) {
4695
+ _ds_0.data_system = {};
4696
+ }
4697
+ const ts = await func.utils.get_dateTime(SESSION_ID, "SYS_DATE_VALUE");
4698
+ for (const val of glb.SYS_DATE_ARR) {
4699
+ _ds_0.data_system[val] = await func.utils.get_dateTime(
4700
+ SESSION_ID,
4701
+ val,
4702
+ ts
4703
+ );
4704
+ }
4705
+ }
4706
+ }
4707
+
4708
+ // await func.datasource.set_system_vars(SESSION_ID, dsSessionP);
4709
+ if (typeof _ds?.data_system?.[fieldIdP] !== "undefined") {
4710
+ return await return_value_system(fieldIdP, _ds?.data_system?.[fieldIdP]);
4711
+ }
4712
+ return await search_in_parameters(fieldIdP);
4713
+ }
4714
+
4715
+ // if (glb.PROTECTED_VARS[fieldIdP]) {
4716
+ // switch (fieldIdP) {
4717
+ // case "_ROW_NO": {
4718
+ // let row_no = Object.keys(_ds?.data_feed?.rows).indexOf(recordId) || 0;
4719
+ // return await return_value(fieldIdP, row_no);
4720
+ // }
4721
+ // default:
4722
+ // break;
4723
+ // }
4724
+ // }
4725
+
4726
+ if (!_ds.data_feed) {
4727
+ return await search_in_parameters(fieldIdP);
4728
+ }
4729
+
4730
+ var _field_id = fieldIdP;
4731
+
4732
+ if (fieldIdP.substr(0, 1) === "_") {
4733
+ if (_ds.alias) _field_id = _ds.alias[fieldIdP];
4734
+ }
4735
+
4736
+ if (!org_dsSessionP && recordId) {
4737
+ try {
4738
+ const row_idx = func.common.find_ROWID_idx(_ds, recordId);
4739
+ if (typeof _ds.data_feed?.rows?.[row_idx]?.[_field_id] !== "undefined") {
4740
+ if (
4741
+ Object.keys(_ds.data_feed?.rows?.[row_idx] || {})?.includes(_field_id)
4742
+ ) {
4743
+ return await return_value(
4744
+ _field_id,
4745
+ _ds.data_feed.rows[row_idx][_field_id]
4746
+ );
4747
+ }
4748
+
4749
+ if (Object.keys(_ds?.dynamic_fields || {})?.includes(_field_id)) {
4750
+ return await return_dynamic_value(
4751
+ _field_id,
4752
+ _ds.dynamic_fields[_field_id]
4753
+ );
4754
+ }
4755
+ }
4756
+ } catch (err) {
4757
+ // console.error(err);
4758
+ }
4759
+ }
4760
+
4761
+ try {
4762
+ const row_idx = func.common.find_ROWID_idx(_ds, _ds.currentRecordId);
4763
+
4764
+ if (typeof _ds.data_feed?.rows?.[row_idx]?.[_field_id] !== "undefined") {
4765
+ return await return_value(
4766
+ _field_id,
4767
+ _ds.data_feed.rows[row_idx][_field_id]
4768
+ );
4769
+ }
4770
+ } catch (error) { }
4771
+
4772
+ if (typeof _ds?.dynamic_fields?.[_field_id] !== "undefined") {
4773
+ return await return_dynamic_value(_field_id, _ds.dynamic_fields[_field_id]);
4774
+ }
4775
+
4776
+ return await search_in_parameters(fieldIdP);
4777
+ };
4778
+
4779
+ func.datasource.find_event_dataSource = async function (
4780
+ SESSION_ID,
4781
+ eventIdP,
4782
+ dsSessionP
4783
+ ) {
4784
+ const _ds = SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP];
4785
+ var ret;
4786
+ //============================
4787
+ // Search in given datasource
4788
+ //============================
4789
+ if (_ds?.prog_id) {
4790
+ let view_ret = await func.utils.VIEWS_OBJ.get(SESSION_ID, _ds.prog_id);
4791
+ if (
4792
+ view_ret?.progEvents &&
4793
+ func.common.find_item_by_key(view_ret.progEvents, "event_name", eventIdP)
4794
+ ) {
4795
+ ret = dsSessionP;
4796
+ if (_ds.callingSource === "system") ret = 0;
4797
+ if (_ds.callingSource === "program" || !_ds.callingSource)
4798
+ ret = dsSessionP;
4799
+ // >>> found value
4800
+ return ret;
4801
+ }
4802
+ }
4803
+ if (!ret && dsSessionP !== 0) {
4804
+ //=======================================
4805
+ // continue Search in parent datasource
4806
+ //=======================================
4807
+ if (
4808
+ _ds &&
4809
+ _ds.parentDataSourceNo &&
4810
+ Number(_ds.parentDataSourceNo) > 0 &&
4811
+ Number(_ds.parentDataSourceNo) < dsSessionP
4812
+ ) {
4813
+ return await func.datasource.find_event_dataSource(
4814
+ SESSION_ID,
4815
+ eventIdP,
4816
+ _ds.parentDataSourceNo
4817
+ );
4818
+ } else {
4819
+ //========================================
4820
+ // continue Search in global system
4821
+ //=========================================
4822
+ if (!ret)
4823
+ return await func.datasource.find_event_dataSource(
4824
+ SESSION_ID,
4825
+ eventIdP,
4826
+ 0
4827
+ );
4828
+ }
4829
+ }
4830
+ };
4831
+ func.datasource.reset_jobs = function (SESSION_ID, dsSessionP, sourceP, errP) {
4832
+ for (const [key, val] of Object.entries(
4833
+ SESSION_OBJ[SESSION_ID].WORKER_OBJ.jobs
4834
+ )) {
4835
+ if (val.dsSessionP === dsSessionP) {
4836
+ func.events.delete_job(SESSION_ID, val.job_num);
4837
+ break;
4838
+ }
4839
+ }
4840
+ func.utils.debug_report(
4841
+ SESSION_ID,
4842
+ sourceP + "Missing datasource: " + dsSessionP,
4843
+ errP,
4844
+ "W",
4845
+ null
4846
+ );
4847
+ };
4848
+ // func.datasource.set_system_vars = async function (SESSION_ID, dsSessionP) {
4849
+ // var _ds = SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP];
4850
+ // if (!_ds) return;
4851
+
4852
+ // if (!_ds.data_system) {
4853
+ // _ds.data_system = {};
4854
+ // }
4855
+
4856
+ // if (dsSessionP > 0) {
4857
+ // _ds.data_system["SYS_STR_ACTIVE_ROW_ID"] = _ds.currentRecordId;
4858
+ // _ds.data_system["SYS_STR_PROG_DS_SESSION"] = dsSessionP;
4859
+ // }
4860
+
4861
+ // // _ds.data_system["SYS_OBJ_DS_INFO"] = {
4862
+ // // rows: _ds.rows_found,
4863
+ // // first_row_id: _ds.firstRecordId,
4864
+ // // last_row_id: _ds.lastRecordId,
4865
+ // // query_from_segments_json: _ds.filter_from,
4866
+ // // query_to_segments_json: _ds.filter_from,
4867
+ // // locate_query_from_segments_json: _ds.locate_from,
4868
+ // // locate_query_to_segments_json: _ds.locate_to,
4869
+ // // first_row_segments_json: _ds.firstRecordKey_object,
4870
+ // // last_row_segments_json: _ds.lastRecordKey_object,
4871
+ // // rowid: _ds.currentRecordId,
4872
+ // // };
4873
+
4874
+ // // if (!_ds.data_system["SYS_OBJ_DS_DATA"] && dsSessionP == 0) {
4875
+ // // _ds.data_system["SYS_OBJ_DS_DATA"] = {
4876
+ // // value: _.cloneDeep(_ds.data_system),
4877
+ // // };
4878
+ // // }
4879
+ // var _ds_0 = SESSION_OBJ[SESSION_ID].DS_GLB[0];
4880
+ // if (!_ds_0) return;
4881
+
4882
+ // if (!_ds_0.data_system) {
4883
+ // _ds_0.data_system = {};
4884
+ // }
4885
+ // const ts = await func.utils.get_dateTime(SESSION_ID, "SYS_DATE_VALUE");
4886
+ // for (const val of glb.SYS_DATE_ARR) {
4887
+ // _ds_0.data_system[val] = await func.utils.get_dateTime(SESSION_ID, val, ts);
4888
+ // }
4889
+ // };
4890
+ func.datasource.get_currentRecordId = function (
4891
+ SESSION_ID,
4892
+ dsSessionP,
4893
+ from_datasourceP
4894
+ ) {
4895
+ var _ds = SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP];
4896
+ if (_ds._dataSourceTableId !== "") {
4897
+ var firstRecordId = _ds.firstRecordId; // returns the value of the fist row
4898
+ var currentRecordId = _ds.currentRecordId; // record id that exist on ds after entering the form
4899
+ var locatedRecordId = _ds.locatedRecordId; // record id located by ds
4900
+ if (!currentRecordId || from_datasourceP) {
4901
+ // first time without locate
4902
+ if (!locatedRecordId) currentRecordId = firstRecordId;
4903
+ // set first row when no rec located
4904
+ else currentRecordId = locatedRecordId; // set with located row
4905
+ }
4906
+ } else currentRecordId = "newRecord"; // create mode
4907
+ return currentRecordId;
4908
+ };
4909
+ func.datasource.interval = function (session_id, dsSessionP, typeP) {
4910
+ var SESSION_ID = session_id;
4911
+ var interval = [];
4912
+ var _ds = SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP];
4913
+ // var ds = _ds;
4914
+ // var v = ds.v;
4915
+ // var arr = func.datasource.get_event_interval_arr(
4916
+ // SESSION_ID,
4917
+ // dsSessionP,
4918
+ // typeP
4919
+ // );
4920
+ var arr = _ds[typeP];
4921
+
4922
+ var fx = {
4923
+ init: async function () {
4924
+ if (arr?.length) {
4925
+ for (let val of arr) {
4926
+ var event_id = val[0];
4927
+ var interval_rate = val[1];
4928
+ var condition = val[2];
4929
+
4930
+ interval.push(
4931
+ setInterval(async function () {
4932
+ if (!SESSION_OBJ[SESSION_ID]) return;
4933
+ var event_count = await func.datasource.get_view_events_count(
4934
+ SESSION_ID,
4935
+ dsSessionP,
4936
+ typeP,
4937
+ event_id
4938
+ );
4939
+ if (!event_count) {
4940
+ fx.clear();
4941
+ return;
4942
+ }
4943
+ var event_condition = await func.expression.get(
4944
+ SESSION_ID,
4945
+ condition,
4946
+ dsSessionP,
4947
+ "condition"
4948
+ ); // execute condition;
4949
+ if (condition && !event_condition.result) return;
4950
+
4951
+ const e = await func.datasource.execute_view_events(
4952
+ SESSION_ID,
4953
+ dsSessionP,
4954
+ typeP,
4955
+ event_id
4956
+ );
4957
+ // for (const [key, val] of Object.entries(e)) {
4958
+ // val.done = false;
4959
+ // }
4960
+ }, Number(interval_rate) * 1000)
4961
+ );
4962
+ }
4963
+ } else {
4964
+ await fx.clear();
4965
+ return;
4966
+ }
4967
+ },
4968
+ clear: function () {
4969
+ if (DATASOURCE_INTERVALS[session_id])
4970
+ delete DATASOURCE_INTERVALS[session_id][dsSessionP];
4971
+ for (const [key, val] of Object.entries(interval)) {
4972
+ clearInterval(val);
4973
+ }
4974
+ },
4975
+ };
4976
+ return fx;
4977
+ };
4978
+ func.datasource.server_cron = function (session_id) {
4979
+ var SESSION_ID = session_id;
4980
+ var jobs = [];
4981
+ // var ds = SESSION_OBJ[SESSION_ID].DS_GLB[0];
4982
+ // var v = ds.v;
4983
+ var arr = func.datasource.get_event_interval_arr(
4984
+ SESSION_ID,
4985
+ 0,
4986
+ "server_cron"
4987
+ );
4988
+ const schedule = require("node-schedule");
4989
+
4990
+ if (!arr.length) {
4991
+ return jobs;
4992
+ }
4993
+ for (let val of arr) {
4994
+ var event_id = val[0];
4995
+ var cron_prop = val[1];
4996
+ var condition = val[2];
4997
+
4998
+ jobs.push(
4999
+ schedule.scheduleJob(cron_prop, async function () {
5000
+ if (!SESSION_OBJ[SESSION_ID]) return;
5001
+ var event_count = await func.datasource.get_view_events_count(
5002
+ SESSION_ID,
5003
+ 0,
5004
+ "server_cron",
5005
+ event_id
5006
+ );
5007
+ if (!event_count) {
5008
+ fx.clear();
5009
+ return;
5010
+ }
5011
+ var event_condition = await func.expression.get(
5012
+ SESSION_ID,
5013
+ condition,
5014
+ 0,
5015
+ "condition"
5016
+ ); // execute condition;
5017
+ if (condition && !event_condition.result) return;
5018
+ if (event_count) {
5019
+ const e = await func.datasource.execute_view_events(
5020
+ SESSION_ID,
5021
+ 0,
5022
+ "server_cron",
5023
+ event_id
5024
+ );
5025
+ // for (const [key, val] of Object.entries(e)) {
5026
+ // val.done = false;
5027
+ // }
5028
+ }
5029
+ })
5030
+ );
5031
+ }
5032
+
5033
+ return jobs;
5034
+ };
5035
+ func.datasource.get_viewLoops = async function (
5036
+ SESSION_ID,
5037
+ dataSourceSession,
5038
+ data,
5039
+ batch_source,
5040
+ default_limit
5041
+ ) {
5042
+ var _ds = SESSION_OBJ[SESSION_ID].DS_GLB[dataSourceSession];
5043
+ var args = _ds.args;
5044
+ // var v = _ds.v;
5045
+ var ret = default_limit;
5046
+
5047
+ if (batch_source === "db_data") ret = _.size(data.rows);
5048
+ if (batch_source === "array" || batch_source === "csv") ret = data.length;
5049
+ if (batch_source === "json") ret = Object.keys(data).length;
5050
+ if (_ds.progDataSource?.dataSourceLimit) {
5051
+ if (
5052
+ batch_source !== "no_data" &&
5053
+ Number(_ds.progDataSource?.dataSourceLimit) < ret
5054
+ ) {
5055
+ ret = Number(_ds.progDataSource.dataSourceLimit);
5056
+ }
5057
+ if (!batch_source) ret = Number(_ds.progDataSource.dataSourceLimit);
5058
+ }
5059
+ if (prog_obj.progDataSource?.dataSourceLoopExp) {
5060
+ var n = (
5061
+ await func.expression.get(
5062
+ SESSION_ID,
5063
+ _ds.v.viewLoopsExp,
5064
+ dataSourceSession,
5065
+ "view_loop",
5066
+ args.rowIdP
5067
+ )
5068
+ ).result;
5069
+ if (batch_source !== "no_data" && n < ret) ret = n;
5070
+ if (!batch_source) ret = n;
5071
+ }
5072
+ return ret;
5073
+ };
5074
+ func.datasource.set_VIEW_data = async function (SESSION_ID, args, _ds) {
5075
+ _ds.v = {
5076
+ viewFieldsProp: {},
5077
+ segFrom: [],
5078
+ segTo: [],
5079
+ segLocateFrom: [],
5080
+ segLocateTo: [],
5081
+ viewModule: "adapter",
5082
+ };
5083
+ _ds.viewEventExec_arr = {};
5084
+
5085
+ var view = _.cloneDeep(
5086
+ await func.utils.VIEWS_OBJ.get(SESSION_ID, args.prog_id)
5087
+ );
5088
+
5089
+ _ds.v.dataSourceSrcType = view.dataSourceSrcType;
5090
+
5091
+ if (view.progDataSource) _ds.progDataSource = view.progDataSource;
5092
+
5093
+ _ds.v.viewIndex = view?.progDataSource?.dataSourceIndexesObj;
5094
+
5095
+ let tree_ret = await func.utils.TREE_OBJ.get(SESSION_ID, args.prog_id);
5096
+ _ds.v.viewSourceDesc = tree_ret.menuName;
5097
+
5098
+ if (!_ds.v.viewSourceDesc && tree_ret) {
5099
+ _ds.v.viewSourceDesc = tree_ret.menuName;
5100
+ }
5101
+
5102
+ if (glb.FUNCTION_NODES_ARR.includes(tree_ret.menuType)) {
5103
+ _ds.v.viewModule = "function";
5104
+ }
5105
+ _ds.v.viewSourceProp = tree_ret.menuType;
5106
+ if (view.progEvents) _ds.v.progEvents = view.progEvents;
5107
+
5108
+ _ds._progDataSource_fields = [];
5109
+ if (_ds.progDataSource) {
5110
+ let ret = func.expression.parse(JSON.stringify(_ds.progDataSource));
5111
+ _ds._progDataSource_fields = ret.map((e) => {
5112
+ if (e.fieldId) return e.fieldId;
5113
+ });
5114
+ }
5115
+ };
5116
+
5117
+ func.datasource.get_cast_val = async function (
5118
+ SESSION_ID,
5119
+ source,
5120
+ dsSession,
5121
+ valP,
5122
+ typeP,
5123
+ req,
5124
+ error
5125
+ ) {
5126
+ var prog_id, prog_name;
5127
+ var _session = SESSION_OBJ[SESSION_ID];
5128
+ var _ds = _session.DS_GLB[dsSession];
5129
+
5130
+ prog_id = _ds.prog_id;
5131
+ prog_name = await func.utils.TREE_OBJ.get(SESSION_ID, _ds.prog_id).menuName;
5132
+
5133
+ const prog_info = prog_id ? ` (prog: ${prog_id} ${prog_name})` : "";
5134
+
5135
+ const report_conversion_error = function (res) {
5136
+ var msg = `error converting from ${valP} to ${typeP}`;
5137
+ if (error) {
5138
+ return func.utils.debug_report(SESSION_ID, msg, "", "W");
5139
+ }
5140
+ func.utils.debug_report(
5141
+ SESSION_ID,
5142
+ msg + " " + _.capitalize(source) + prog_info,
5143
+ "",
5144
+ "E"
5145
+ );
5146
+ };
5147
+ const report_conversion_warn = function (res) {
5148
+ var msg = `type mismatch auto conversion from value ${valP} to ${typeP}`;
5149
+ func.utils.debug_report(
5150
+ SESSION_ID,
5151
+ msg + " " + _.capitalize(source) + prog_info,
5152
+ "",
5153
+ "W"
5154
+ );
5155
+ };
5156
+ // var ret = valP;
5157
+ if (error) {
5158
+ return report_conversion_error();
5159
+ }
5160
+
5161
+ const module = await func.common.get_module(
5162
+ SESSION_ID,
5163
+ "xuda-get-cast-util-module.mjs"
5164
+ );
5165
+ return module.cast(
5166
+ typeP,
5167
+ valP,
5168
+ report_conversion_error,
5169
+ report_conversion_warn
5170
+ );
5171
+ };
5172
+ func.datasource.get_field_init_triggers_to_run = function (
5173
+ SESSION_ID,
5174
+ dataSourceSession,
5175
+ pre_init_fieldsP
5176
+ ) {
5177
+ var _ds = SESSION_OBJ[SESSION_ID].DS_GLB[dataSourceSession];
5178
+ if (!_ds) return;
5179
+
5180
+ return []; // inactive 021617
5181
+ }; // inactive temporary, design to execute init triggers when querying large datasets
5182
+ func.datasource.get_pre_init_fields = function (
5183
+ SESSION_ID,
5184
+ dsSessionP,
5185
+ viewRangeExpP,
5186
+ viewSortExpP,
5187
+ viewGroupByExpP,
5188
+ viewLocateExpP
5189
+ ) {
5190
+ var ret = [];
5191
+ return; // inactive 021617
5192
+ }; // temporary inactive, init preformed on the first round
5193
+
5194
+ func.datasource.add_dynamic_field_to_ds = function (
5195
+ SESSION_ID,
5196
+ dsSessionP,
5197
+ key,
5198
+ val
5199
+ ) {
5200
+ var _ds = SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP];
5201
+ if (!_ds.dynamic_fields) {
5202
+ _ds.dynamic_fields = {};
5203
+ }
5204
+
5205
+ const toType = function (obj) {
5206
+ return {}.toString
5207
+ .call(obj)
5208
+ .match(/\s([a-zA-Z]+)/)[1]
5209
+ .toLowerCase();
5210
+ };
5211
+
5212
+ _ds.dynamic_fields[key] = {
5213
+ id: crypto.randomUUID(),
5214
+ data: {
5215
+ type: "virtual",
5216
+ field_id: key,
5217
+ },
5218
+ props: {
5219
+ fieldType: val ? toType(val) : "string",
5220
+ },
5221
+ value: val,
5222
+ };
5223
+ };
5224
+
5225
+ func.datasource.get_progFields = async function (SESSION_ID, dsSessionP) {
5226
+ var _ds = SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP];
5227
+ const _view_obj = await func.utils.VIEWS_OBJ.get(SESSION_ID, _ds.prog_id);
5228
+ return _view_obj.progFields;
5229
+ };
5230
+ func.datasource.update_changes_for_out_parameter = async function (
5231
+ SESSION_ID,
5232
+ dsSessionP,
5233
+ calling_dsP
5234
+ ) {
5235
+ let _session = SESSION_OBJ[SESSION_ID];
5236
+ let _ds = _session.DS_GLB[dsSessionP];
5237
+ const _calling_ds = _session.DS_GLB[calling_dsP];
5238
+ //
5239
+ if (_ds.PARAM_OUT_INFO) {
5240
+ let data = {};
5241
+ for await (const [key, val] of Object.entries(_ds.PARAM_OUT_INFO)) {
5242
+ if (val.prop === "out") {
5243
+ try {
5244
+ const row_idx = func.common.find_ROWID_idx(_ds, _ds.currentRecordId);
5245
+ data[val.details] = _ds.data_feed.rows[row_idx][val.fieldId];
5246
+ } catch (err) {
5247
+ console.error(err);
5248
+ }
5249
+ }
5250
+ }
5251
+ if (!_.isEmpty(data)) {
5252
+ let datasource_changes = {
5253
+ [calling_dsP]: { [_calling_ds.currentRecordId]: data },
5254
+ };
5255
+ await func.datasource.update(SESSION_ID, datasource_changes);
5256
+ }
5257
+ }
5258
+ };
5259
+
5260
+ func.datasource.set_outputField = async function (SESSION_ID, dsSessionP, result, args) {
5261
+ var _session = SESSION_OBJ[SESSION_ID];
5262
+ // let _ds = _session.DS_GLB[dsSessionP];
5263
+
5264
+
5265
+ const output_field = await func.datasource.get_args_property_value(SESSION_ID, dsSessionP, args, "outputField")
5266
+
5267
+
5268
+ if (output_field) {
5269
+ let datasource_changes = {};
5270
+
5271
+ let ret_get_value = await func.datasource.get_value(
5272
+ SESSION_ID,
5273
+ output_field,
5274
+ dsSessionP
5275
+ );
5276
+ if (ret_get_value.found) {
5277
+ let _ds = _session.DS_GLB[ret_get_value.dsSessionP];
5278
+ if (!datasource_changes[_ds.dsSession]) {
5279
+ datasource_changes[_ds.dsSession] = {};
5280
+ }
5281
+ if (
5282
+ !datasource_changes[_ds.dsSession][ret_get_value.currentRecordId]
5283
+ ) {
5284
+ datasource_changes[_ds.dsSession][ret_get_value.currentRecordId] =
5285
+ {};
5286
+ }
5287
+ datasource_changes[_ds.dsSession][ret_get_value.currentRecordId][
5288
+ output_field
5289
+ ] = result;
5290
+ await func.datasource.update(SESSION_ID, datasource_changes);
5291
+ }
5292
+ }
5293
+
5294
+ }
5295
+
5296
+ func.datasource.get_args_property_value = async function (SESSION_ID, dsSession, args, prop_name) {
5297
+ let _prop = args?.calling_trigger_prop?.data?.name;
5298
+ let _value = _prop[prop_name];
5299
+ if (_prop?.[`xu-exp:${prop_name}`]) {
5300
+ _value = (
5301
+ await func.expression.get(
5302
+ SESSION_ID,
5303
+ _prop[`xu-exp:${prop_name}`],
5304
+ dsSession,
5305
+ `${prop_name} expression`
5306
+ )
5307
+ ).result;
5308
+ }
5309
+
5310
+ return _value;
5311
+ };
5312
+ func.utils = {};
4016
5313
 
4017
5314
  func.utils.debug = {};
4018
5315
  func.utils.debug.watch = async function (
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xuda.io/xuda-worker-bundle",
3
- "version": "1.3.1222",
3
+ "version": "1.3.1224",
4
4
  "description": "xuda framework",
5
5
  "main": "index.js",
6
6
  "scripts": {