@xuda.io/runtime-bundle 1.0.505 → 1.0.507
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/xuda-runtime-bundle.js +233 -15
- package/js/xuda-runtime-bundle.min.js +1 -1
- package/js/xuda-runtime-slim.js +233 -15
- package/js/xuda-runtime-slim.min.es.js +233 -15
- package/js/xuda-runtime-slim.min.js +1 -1
- package/js/xuda-server-bundle.min.mjs +1 -1
- package/js/xuda-server-bundle.mjs +217 -15
- package/js/xuda-worker-bundle.js +217 -15
- package/js/xuda-worker-bundle.min.js +1 -1
- package/package.json +1 -1
|
@@ -1662,12 +1662,15 @@ func.datasource.create = async function (
|
|
|
1662
1662
|
};
|
|
1663
1663
|
|
|
1664
1664
|
var run_at = _prog_obj?.properties?.runAt;
|
|
1665
|
-
if (_session.opt.app_computing_mode === 'main') {
|
|
1666
|
-
run_at = 'client';
|
|
1667
|
-
}
|
|
1668
1665
|
|
|
1669
|
-
if (
|
|
1670
|
-
|
|
1666
|
+
if (_session.engine_mode !== 'live_preview') {
|
|
1667
|
+
if (_session.opt.app_computing_mode === 'main') {
|
|
1668
|
+
run_at = 'client';
|
|
1669
|
+
}
|
|
1670
|
+
|
|
1671
|
+
if (_prog_obj?.properties.menuType === 'globals') {
|
|
1672
|
+
run_at = 'client';
|
|
1673
|
+
}
|
|
1671
1674
|
}
|
|
1672
1675
|
|
|
1673
1676
|
if (!run_at && parentDataSourceNoP && _session.DS_GLB[parentDataSourceNoP]) {
|
|
@@ -1978,6 +1981,19 @@ func.datasource.prepare = async function (SESSION_ID, prog_id, dataSourceNoP, pa
|
|
|
1978
1981
|
|
|
1979
1982
|
_ds.stat = 'busy';
|
|
1980
1983
|
_ds._run_at = run_atP;
|
|
1984
|
+
|
|
1985
|
+
if (_ds.refreshed) {
|
|
1986
|
+
await func.datasource.update(SESSION_ID, {
|
|
1987
|
+
[_ds.dsSession]: {
|
|
1988
|
+
['datasource_main']: {
|
|
1989
|
+
stat: 'busy',
|
|
1990
|
+
stat_ts: Date.now(),
|
|
1991
|
+
is_worker: glb.IS_WORKER,
|
|
1992
|
+
},
|
|
1993
|
+
},
|
|
1994
|
+
});
|
|
1995
|
+
}
|
|
1996
|
+
|
|
1981
1997
|
// init_v();
|
|
1982
1998
|
|
|
1983
1999
|
if (IS_DATASOURCE_REFRESH) {
|
|
@@ -3406,7 +3422,7 @@ func.datasource.del = function (SESSION_ID, dsP) {
|
|
|
3406
3422
|
}
|
|
3407
3423
|
perform_delete();
|
|
3408
3424
|
};
|
|
3409
|
-
func.datasource.
|
|
3425
|
+
func.datasource.update_old = async function (SESSION_ID, datasource_changes, update_local_scope_only, avoid_refresh) {
|
|
3410
3426
|
return new Promise(async (resolve, reject) => {
|
|
3411
3427
|
var _session = SESSION_OBJ[SESSION_ID];
|
|
3412
3428
|
|
|
@@ -3509,7 +3525,202 @@ func.datasource.update = async function (SESSION_ID, datasource_changes, update_
|
|
|
3509
3525
|
if (typeof fields_data === 'object') {
|
|
3510
3526
|
if (glb.GLOBAL_VARS[field_id]) {
|
|
3511
3527
|
_ds.data_system[field_id] = value;
|
|
3528
|
+
continue;
|
|
3529
|
+
}
|
|
3530
|
+
|
|
3531
|
+
// try {
|
|
3532
|
+
const row_idx = func.common.find_ROWID_idx(_ds, record_id);
|
|
3533
|
+
if (_ds.data_feed.rows[row_idx][field_id] !== value) {
|
|
3534
|
+
_ds.data_feed.rows[row_idx][field_id] = value;
|
|
3535
|
+
await set_fieldComputed_dependencies(dataSource, field_id, null);
|
|
3536
|
+
|
|
3537
|
+
// search the field in refs
|
|
3538
|
+
update_xu_ref();
|
|
3539
|
+
|
|
3540
|
+
if (!update_local_scope_only) {
|
|
3541
|
+
let tree_ret = await func.utils.TREE_OBJ.get(SESSION_ID, _ds.prog_id);
|
|
3542
|
+
if (glb.IS_WORKER) {
|
|
3543
|
+
// RUN AT SERVER
|
|
3544
|
+
if (tree_ret.menuType === 'globals' || tree_ret.menuType === 'component') {
|
|
3545
|
+
const _progFields = await func.datasource.get_progFields(SESSION_ID, dataSource);
|
|
3546
|
+
let view_field_obj = func.common.find_item_by_key(_progFields, 'field_id', field_id);
|
|
3547
|
+
if (!view_field_obj?.data?.serverField && record_id !== 'data_system') {
|
|
3548
|
+
if (!client_datasource_changes[dataSource]) {
|
|
3549
|
+
client_datasource_changes[dataSource] = {};
|
|
3550
|
+
}
|
|
3551
|
+
if (!client_datasource_changes[dataSource][record_id]) {
|
|
3552
|
+
client_datasource_changes[dataSource][record_id] = {};
|
|
3553
|
+
}
|
|
3554
|
+
client_datasource_changes[dataSource][record_id][field_id] = value;
|
|
3555
|
+
}
|
|
3556
|
+
}
|
|
3557
|
+
} else {
|
|
3558
|
+
// RUN AT CLIENT
|
|
3559
|
+
if ((tree_ret.menuType === 'component' && _ds._run_at !== 'client') || tree_ret.menuType === 'globals') {
|
|
3560
|
+
if (!server_datasource_changes[dataSource]) {
|
|
3561
|
+
server_datasource_changes[dataSource] = {};
|
|
3562
|
+
}
|
|
3563
|
+
if (!server_datasource_changes[dataSource][record_id]) {
|
|
3564
|
+
server_datasource_changes[dataSource][record_id] = {};
|
|
3565
|
+
}
|
|
3566
|
+
server_datasource_changes[dataSource][record_id][field_id] = value;
|
|
3567
|
+
}
|
|
3568
|
+
}
|
|
3569
|
+
}
|
|
3570
|
+
|
|
3571
|
+
if (!fields_changed.includes(field_id)) {
|
|
3572
|
+
fields_changed.push(field_id);
|
|
3573
|
+
}
|
|
3574
|
+
if (!datasource_changed.includes(dataSource)) {
|
|
3575
|
+
datasource_changed.push(dataSource);
|
|
3576
|
+
}
|
|
3577
|
+
|
|
3578
|
+
if (!_ds.data_feed.rows_changed) {
|
|
3579
|
+
_ds.data_feed.rows_changed = [];
|
|
3580
|
+
}
|
|
3581
|
+
if (!_ds.data_feed.rows_changed.includes(record_id)) _ds.data_feed.rows_changed.push(record_id);
|
|
3582
|
+
}
|
|
3583
|
+
} else if (fields_data === 'set') {
|
|
3584
|
+
_ds.currentRecordId = record_id;
|
|
3585
|
+
}
|
|
3586
|
+
}
|
|
3587
|
+
}
|
|
3588
|
+
}
|
|
3589
|
+
|
|
3590
|
+
if (glb.IS_WORKER) {
|
|
3591
|
+
if (!update_local_scope_only && !_.isEmpty(client_datasource_changes)) {
|
|
3592
|
+
func.utils.post_back_to_client(SESSION_ID, 'update_client_eventChangesResults_from_worker', _session.worker_id, client_datasource_changes);
|
|
3593
|
+
}
|
|
3594
|
+
} else {
|
|
3595
|
+
if (!update_local_scope_only && !_.isEmpty(server_datasource_changes)) {
|
|
3596
|
+
const ret = await func.index.call_worker(SESSION_ID, {
|
|
3597
|
+
service: 'update_datasource_changes_from_client',
|
|
3598
|
+
data: {
|
|
3599
|
+
session_id: SESSION_ID,
|
|
3600
|
+
datasource_changes: server_datasource_changes,
|
|
3601
|
+
},
|
|
3602
|
+
id: _ds.worker_id,
|
|
3603
|
+
});
|
|
3604
|
+
}
|
|
3605
|
+
///// REFRESH SCREEN
|
|
3606
|
+
if (!avoid_refresh && fields_changed.length) {
|
|
3607
|
+
await func.UI.screen.refresh_xu_attributes(SESSION_ID, fields_changed);
|
|
3608
|
+
// await removed from the below function cause to dead lock Mar 3 25
|
|
3609
|
+
func.UI.screen.refresh_screen(
|
|
3610
|
+
SESSION_ID,
|
|
3611
|
+
fields_changed,
|
|
3612
|
+
null,
|
|
3613
|
+
datasource_changed[0], // refresh the current datasource only
|
|
3614
|
+
);
|
|
3615
|
+
}
|
|
3616
|
+
}
|
|
3617
|
+
resolve();
|
|
3618
|
+
});
|
|
3619
|
+
};
|
|
3512
3620
|
|
|
3621
|
+
func.datasource.update = async function (SESSION_ID, datasource_changes, update_local_scope_only, avoid_refresh) {
|
|
3622
|
+
return new Promise(async (resolve, reject) => {
|
|
3623
|
+
var _session = SESSION_OBJ[SESSION_ID];
|
|
3624
|
+
|
|
3625
|
+
if (_session.IS_API || typeof IS_MASTER_WEBSOCKET !== 'undefined' || typeof IS_PROCESS_SERVER !== 'undefined') {
|
|
3626
|
+
update_local_scope_only = true;
|
|
3627
|
+
}
|
|
3628
|
+
|
|
3629
|
+
if (typeof glb.GLOBAL_VARS === 'undefined') {
|
|
3630
|
+
glb.GLOBAL_VARS = (await func.common.get_module(SESSION_ID, 'xuda-system-globals-module.mjs')).system_globals;
|
|
3631
|
+
}
|
|
3632
|
+
|
|
3633
|
+
const set_fieldComputed_dependencies = async function (dsNo, field_id, parent_ds) {
|
|
3634
|
+
// iterate child ds
|
|
3635
|
+
for (const [dsSession, _ds] of Object.entries(_session.DS_GLB)) {
|
|
3636
|
+
if (parent_ds !== null) {
|
|
3637
|
+
if (_ds.parentDataSourceNo != parent_ds) continue;
|
|
3638
|
+
} else {
|
|
3639
|
+
if (dsSession != dsNo) continue;
|
|
3640
|
+
}
|
|
3641
|
+
let tree_ret = await func.utils.TREE_OBJ.get(SESSION_ID, _ds.prog_id);
|
|
3642
|
+
if (tree_ret.menuType === 'component' || tree_ret.menuType === 'globals') {
|
|
3643
|
+
// check if field has fieldComputed property
|
|
3644
|
+
const _progFields = await func.datasource.get_progFields(SESSION_ID, dsSession);
|
|
3645
|
+
// find if field is computed
|
|
3646
|
+
let fieldComputed_propExpressions, fieldComputed_id;
|
|
3647
|
+
for await (const val of _progFields) {
|
|
3648
|
+
const fieldId = val.data.field_id;
|
|
3649
|
+
|
|
3650
|
+
// if (fieldId !== field_id) continue
|
|
3651
|
+
if (val.data.type !== 'virtual' || !val.props.fieldComputed) continue;
|
|
3652
|
+
|
|
3653
|
+
const _propExpressions = val.props?.propExpressions?.fieldValue;
|
|
3654
|
+
if (_propExpressions && JSON.stringify(_propExpressions).includes(field_id)) {
|
|
3655
|
+
fieldComputed_propExpressions = _propExpressions;
|
|
3656
|
+
fieldComputed_id = fieldId;
|
|
3657
|
+
}
|
|
3658
|
+
}
|
|
3659
|
+
|
|
3660
|
+
if (!fieldComputed_id) return;
|
|
3661
|
+
|
|
3662
|
+
// iterate ds rows
|
|
3663
|
+
for (const row of _ds.data_feed?.rows || []) {
|
|
3664
|
+
// iterate row fields
|
|
3665
|
+
for (const [key, val] of Object.entries(row)) {
|
|
3666
|
+
if (key !== fieldComputed_id) continue;
|
|
3667
|
+
try {
|
|
3668
|
+
let ret = await func.expression.get(SESSION_ID, fieldComputed_propExpressions, dsNo, 'update', row._ROWID);
|
|
3669
|
+
|
|
3670
|
+
const row_idx = func.common.find_ROWID_idx(_ds, row._ROWID);
|
|
3671
|
+
if (_ds.data_feed.rows[row_idx][fieldComputed_id] !== ret.result) {
|
|
3672
|
+
_ds.data_feed.rows[row_idx][fieldComputed_id] = ret.result;
|
|
3673
|
+
if (!fields_changed.includes(fieldComputed_id)) {
|
|
3674
|
+
fields_changed.push(fieldComputed_id);
|
|
3675
|
+
}
|
|
3676
|
+
if (!datasource_changed.includes(dsSession)) {
|
|
3677
|
+
datasource_changed.push(dsSession);
|
|
3678
|
+
}
|
|
3679
|
+
}
|
|
3680
|
+
} catch (err) {
|
|
3681
|
+
console.error(err);
|
|
3682
|
+
}
|
|
3683
|
+
}
|
|
3684
|
+
}
|
|
3685
|
+
}
|
|
3686
|
+
await set_fieldComputed_dependencies(dsNo, field_id, dsSession);
|
|
3687
|
+
}
|
|
3688
|
+
};
|
|
3689
|
+
|
|
3690
|
+
var fields_changed = [];
|
|
3691
|
+
var datasource_changed = [];
|
|
3692
|
+
let client_datasource_changes = {};
|
|
3693
|
+
let server_datasource_changes = {};
|
|
3694
|
+
// iterate changes datasource
|
|
3695
|
+
for await (const [dataSource, row_data] of Object.entries(datasource_changes)) {
|
|
3696
|
+
var _ds = _session.DS_GLB[dataSource];
|
|
3697
|
+
if (!_ds) {
|
|
3698
|
+
continue;
|
|
3699
|
+
}
|
|
3700
|
+
|
|
3701
|
+
const update_xu_ref = async function () {
|
|
3702
|
+
let _ds_0 = _session.DS_GLB[0];
|
|
3703
|
+
for ([ref_name, val] of Object.entries(_ds_0.data_system['SYS_GLOBAL_OBJ_REFS'])) {
|
|
3704
|
+
if (val.ds.dsSession == dataSource) {
|
|
3705
|
+
func.UI.update_xu_ref(SESSION_ID, dataSource, ref_name);
|
|
3706
|
+
}
|
|
3707
|
+
}
|
|
3708
|
+
};
|
|
3709
|
+
|
|
3710
|
+
// iterate changes records
|
|
3711
|
+
for (const [record_id, fields_data] of Object.entries(row_data)) {
|
|
3712
|
+
// iterate changes fields
|
|
3713
|
+
for (const [field_id, value] of Object.entries(fields_data)) {
|
|
3714
|
+
// mechanism to make update directly on the datasource object
|
|
3715
|
+
if (record_id === 'datasource_main') {
|
|
3716
|
+
_.set(_ds, field_id, value);
|
|
3717
|
+
update_xu_ref();
|
|
3718
|
+
continue;
|
|
3719
|
+
}
|
|
3720
|
+
|
|
3721
|
+
if (typeof fields_data === 'object') {
|
|
3722
|
+
if (glb.GLOBAL_VARS[field_id]) {
|
|
3723
|
+
_ds.data_system[field_id] = value;
|
|
3513
3724
|
continue;
|
|
3514
3725
|
}
|
|
3515
3726
|
|
|
@@ -3521,15 +3732,6 @@ func.datasource.update = async function (SESSION_ID, datasource_changes, update_
|
|
|
3521
3732
|
|
|
3522
3733
|
// search the field in refs
|
|
3523
3734
|
update_xu_ref();
|
|
3524
|
-
// let _ds_0 = _session.DS_GLB[0];
|
|
3525
|
-
// for ([ref_name, val] of Object.entries(_ds_0.data_system['SYS_GLOBAL_OBJ_REFS'])) {
|
|
3526
|
-
// if (val.ds.dsSession == dataSource) {
|
|
3527
|
-
// func.UI.update_xu_ref(SESSION_ID, dataSource, ref_name);
|
|
3528
|
-
// // if (!fields_changed.includes(ref_name)) {
|
|
3529
|
-
// // fields_changed.push(ref_name);
|
|
3530
|
-
// // }
|
|
3531
|
-
// }
|
|
3532
|
-
// }
|
|
3533
3735
|
|
|
3534
3736
|
if (!update_local_scope_only) {
|
|
3535
3737
|
let tree_ret = await func.utils.TREE_OBJ.get(SESSION_ID, _ds.prog_id);
|
package/js/xuda-worker-bundle.js
CHANGED
|
@@ -1662,12 +1662,15 @@ func.datasource.create = async function (
|
|
|
1662
1662
|
};
|
|
1663
1663
|
|
|
1664
1664
|
var run_at = _prog_obj?.properties?.runAt;
|
|
1665
|
-
if (_session.opt.app_computing_mode === 'main') {
|
|
1666
|
-
run_at = 'client';
|
|
1667
|
-
}
|
|
1668
1665
|
|
|
1669
|
-
if (
|
|
1670
|
-
|
|
1666
|
+
if (_session.engine_mode !== 'live_preview') {
|
|
1667
|
+
if (_session.opt.app_computing_mode === 'main') {
|
|
1668
|
+
run_at = 'client';
|
|
1669
|
+
}
|
|
1670
|
+
|
|
1671
|
+
if (_prog_obj?.properties.menuType === 'globals') {
|
|
1672
|
+
run_at = 'client';
|
|
1673
|
+
}
|
|
1671
1674
|
}
|
|
1672
1675
|
|
|
1673
1676
|
if (!run_at && parentDataSourceNoP && _session.DS_GLB[parentDataSourceNoP]) {
|
|
@@ -1978,6 +1981,19 @@ func.datasource.prepare = async function (SESSION_ID, prog_id, dataSourceNoP, pa
|
|
|
1978
1981
|
|
|
1979
1982
|
_ds.stat = 'busy';
|
|
1980
1983
|
_ds._run_at = run_atP;
|
|
1984
|
+
|
|
1985
|
+
if (_ds.refreshed) {
|
|
1986
|
+
await func.datasource.update(SESSION_ID, {
|
|
1987
|
+
[_ds.dsSession]: {
|
|
1988
|
+
['datasource_main']: {
|
|
1989
|
+
stat: 'busy',
|
|
1990
|
+
stat_ts: Date.now(),
|
|
1991
|
+
is_worker: glb.IS_WORKER,
|
|
1992
|
+
},
|
|
1993
|
+
},
|
|
1994
|
+
});
|
|
1995
|
+
}
|
|
1996
|
+
|
|
1981
1997
|
// init_v();
|
|
1982
1998
|
|
|
1983
1999
|
if (IS_DATASOURCE_REFRESH) {
|
|
@@ -3406,7 +3422,7 @@ func.datasource.del = function (SESSION_ID, dsP) {
|
|
|
3406
3422
|
}
|
|
3407
3423
|
perform_delete();
|
|
3408
3424
|
};
|
|
3409
|
-
func.datasource.
|
|
3425
|
+
func.datasource.update_old = async function (SESSION_ID, datasource_changes, update_local_scope_only, avoid_refresh) {
|
|
3410
3426
|
return new Promise(async (resolve, reject) => {
|
|
3411
3427
|
var _session = SESSION_OBJ[SESSION_ID];
|
|
3412
3428
|
|
|
@@ -3509,7 +3525,202 @@ func.datasource.update = async function (SESSION_ID, datasource_changes, update_
|
|
|
3509
3525
|
if (typeof fields_data === 'object') {
|
|
3510
3526
|
if (glb.GLOBAL_VARS[field_id]) {
|
|
3511
3527
|
_ds.data_system[field_id] = value;
|
|
3528
|
+
continue;
|
|
3529
|
+
}
|
|
3530
|
+
|
|
3531
|
+
// try {
|
|
3532
|
+
const row_idx = func.common.find_ROWID_idx(_ds, record_id);
|
|
3533
|
+
if (_ds.data_feed.rows[row_idx][field_id] !== value) {
|
|
3534
|
+
_ds.data_feed.rows[row_idx][field_id] = value;
|
|
3535
|
+
await set_fieldComputed_dependencies(dataSource, field_id, null);
|
|
3536
|
+
|
|
3537
|
+
// search the field in refs
|
|
3538
|
+
update_xu_ref();
|
|
3539
|
+
|
|
3540
|
+
if (!update_local_scope_only) {
|
|
3541
|
+
let tree_ret = await func.utils.TREE_OBJ.get(SESSION_ID, _ds.prog_id);
|
|
3542
|
+
if (glb.IS_WORKER) {
|
|
3543
|
+
// RUN AT SERVER
|
|
3544
|
+
if (tree_ret.menuType === 'globals' || tree_ret.menuType === 'component') {
|
|
3545
|
+
const _progFields = await func.datasource.get_progFields(SESSION_ID, dataSource);
|
|
3546
|
+
let view_field_obj = func.common.find_item_by_key(_progFields, 'field_id', field_id);
|
|
3547
|
+
if (!view_field_obj?.data?.serverField && record_id !== 'data_system') {
|
|
3548
|
+
if (!client_datasource_changes[dataSource]) {
|
|
3549
|
+
client_datasource_changes[dataSource] = {};
|
|
3550
|
+
}
|
|
3551
|
+
if (!client_datasource_changes[dataSource][record_id]) {
|
|
3552
|
+
client_datasource_changes[dataSource][record_id] = {};
|
|
3553
|
+
}
|
|
3554
|
+
client_datasource_changes[dataSource][record_id][field_id] = value;
|
|
3555
|
+
}
|
|
3556
|
+
}
|
|
3557
|
+
} else {
|
|
3558
|
+
// RUN AT CLIENT
|
|
3559
|
+
if ((tree_ret.menuType === 'component' && _ds._run_at !== 'client') || tree_ret.menuType === 'globals') {
|
|
3560
|
+
if (!server_datasource_changes[dataSource]) {
|
|
3561
|
+
server_datasource_changes[dataSource] = {};
|
|
3562
|
+
}
|
|
3563
|
+
if (!server_datasource_changes[dataSource][record_id]) {
|
|
3564
|
+
server_datasource_changes[dataSource][record_id] = {};
|
|
3565
|
+
}
|
|
3566
|
+
server_datasource_changes[dataSource][record_id][field_id] = value;
|
|
3567
|
+
}
|
|
3568
|
+
}
|
|
3569
|
+
}
|
|
3570
|
+
|
|
3571
|
+
if (!fields_changed.includes(field_id)) {
|
|
3572
|
+
fields_changed.push(field_id);
|
|
3573
|
+
}
|
|
3574
|
+
if (!datasource_changed.includes(dataSource)) {
|
|
3575
|
+
datasource_changed.push(dataSource);
|
|
3576
|
+
}
|
|
3577
|
+
|
|
3578
|
+
if (!_ds.data_feed.rows_changed) {
|
|
3579
|
+
_ds.data_feed.rows_changed = [];
|
|
3580
|
+
}
|
|
3581
|
+
if (!_ds.data_feed.rows_changed.includes(record_id)) _ds.data_feed.rows_changed.push(record_id);
|
|
3582
|
+
}
|
|
3583
|
+
} else if (fields_data === 'set') {
|
|
3584
|
+
_ds.currentRecordId = record_id;
|
|
3585
|
+
}
|
|
3586
|
+
}
|
|
3587
|
+
}
|
|
3588
|
+
}
|
|
3589
|
+
|
|
3590
|
+
if (glb.IS_WORKER) {
|
|
3591
|
+
if (!update_local_scope_only && !_.isEmpty(client_datasource_changes)) {
|
|
3592
|
+
func.utils.post_back_to_client(SESSION_ID, 'update_client_eventChangesResults_from_worker', _session.worker_id, client_datasource_changes);
|
|
3593
|
+
}
|
|
3594
|
+
} else {
|
|
3595
|
+
if (!update_local_scope_only && !_.isEmpty(server_datasource_changes)) {
|
|
3596
|
+
const ret = await func.index.call_worker(SESSION_ID, {
|
|
3597
|
+
service: 'update_datasource_changes_from_client',
|
|
3598
|
+
data: {
|
|
3599
|
+
session_id: SESSION_ID,
|
|
3600
|
+
datasource_changes: server_datasource_changes,
|
|
3601
|
+
},
|
|
3602
|
+
id: _ds.worker_id,
|
|
3603
|
+
});
|
|
3604
|
+
}
|
|
3605
|
+
///// REFRESH SCREEN
|
|
3606
|
+
if (!avoid_refresh && fields_changed.length) {
|
|
3607
|
+
await func.UI.screen.refresh_xu_attributes(SESSION_ID, fields_changed);
|
|
3608
|
+
// await removed from the below function cause to dead lock Mar 3 25
|
|
3609
|
+
func.UI.screen.refresh_screen(
|
|
3610
|
+
SESSION_ID,
|
|
3611
|
+
fields_changed,
|
|
3612
|
+
null,
|
|
3613
|
+
datasource_changed[0], // refresh the current datasource only
|
|
3614
|
+
);
|
|
3615
|
+
}
|
|
3616
|
+
}
|
|
3617
|
+
resolve();
|
|
3618
|
+
});
|
|
3619
|
+
};
|
|
3512
3620
|
|
|
3621
|
+
func.datasource.update = async function (SESSION_ID, datasource_changes, update_local_scope_only, avoid_refresh) {
|
|
3622
|
+
return new Promise(async (resolve, reject) => {
|
|
3623
|
+
var _session = SESSION_OBJ[SESSION_ID];
|
|
3624
|
+
|
|
3625
|
+
if (_session.IS_API || typeof IS_MASTER_WEBSOCKET !== 'undefined' || typeof IS_PROCESS_SERVER !== 'undefined') {
|
|
3626
|
+
update_local_scope_only = true;
|
|
3627
|
+
}
|
|
3628
|
+
|
|
3629
|
+
if (typeof glb.GLOBAL_VARS === 'undefined') {
|
|
3630
|
+
glb.GLOBAL_VARS = (await func.common.get_module(SESSION_ID, 'xuda-system-globals-module.mjs')).system_globals;
|
|
3631
|
+
}
|
|
3632
|
+
|
|
3633
|
+
const set_fieldComputed_dependencies = async function (dsNo, field_id, parent_ds) {
|
|
3634
|
+
// iterate child ds
|
|
3635
|
+
for (const [dsSession, _ds] of Object.entries(_session.DS_GLB)) {
|
|
3636
|
+
if (parent_ds !== null) {
|
|
3637
|
+
if (_ds.parentDataSourceNo != parent_ds) continue;
|
|
3638
|
+
} else {
|
|
3639
|
+
if (dsSession != dsNo) continue;
|
|
3640
|
+
}
|
|
3641
|
+
let tree_ret = await func.utils.TREE_OBJ.get(SESSION_ID, _ds.prog_id);
|
|
3642
|
+
if (tree_ret.menuType === 'component' || tree_ret.menuType === 'globals') {
|
|
3643
|
+
// check if field has fieldComputed property
|
|
3644
|
+
const _progFields = await func.datasource.get_progFields(SESSION_ID, dsSession);
|
|
3645
|
+
// find if field is computed
|
|
3646
|
+
let fieldComputed_propExpressions, fieldComputed_id;
|
|
3647
|
+
for await (const val of _progFields) {
|
|
3648
|
+
const fieldId = val.data.field_id;
|
|
3649
|
+
|
|
3650
|
+
// if (fieldId !== field_id) continue
|
|
3651
|
+
if (val.data.type !== 'virtual' || !val.props.fieldComputed) continue;
|
|
3652
|
+
|
|
3653
|
+
const _propExpressions = val.props?.propExpressions?.fieldValue;
|
|
3654
|
+
if (_propExpressions && JSON.stringify(_propExpressions).includes(field_id)) {
|
|
3655
|
+
fieldComputed_propExpressions = _propExpressions;
|
|
3656
|
+
fieldComputed_id = fieldId;
|
|
3657
|
+
}
|
|
3658
|
+
}
|
|
3659
|
+
|
|
3660
|
+
if (!fieldComputed_id) return;
|
|
3661
|
+
|
|
3662
|
+
// iterate ds rows
|
|
3663
|
+
for (const row of _ds.data_feed?.rows || []) {
|
|
3664
|
+
// iterate row fields
|
|
3665
|
+
for (const [key, val] of Object.entries(row)) {
|
|
3666
|
+
if (key !== fieldComputed_id) continue;
|
|
3667
|
+
try {
|
|
3668
|
+
let ret = await func.expression.get(SESSION_ID, fieldComputed_propExpressions, dsNo, 'update', row._ROWID);
|
|
3669
|
+
|
|
3670
|
+
const row_idx = func.common.find_ROWID_idx(_ds, row._ROWID);
|
|
3671
|
+
if (_ds.data_feed.rows[row_idx][fieldComputed_id] !== ret.result) {
|
|
3672
|
+
_ds.data_feed.rows[row_idx][fieldComputed_id] = ret.result;
|
|
3673
|
+
if (!fields_changed.includes(fieldComputed_id)) {
|
|
3674
|
+
fields_changed.push(fieldComputed_id);
|
|
3675
|
+
}
|
|
3676
|
+
if (!datasource_changed.includes(dsSession)) {
|
|
3677
|
+
datasource_changed.push(dsSession);
|
|
3678
|
+
}
|
|
3679
|
+
}
|
|
3680
|
+
} catch (err) {
|
|
3681
|
+
console.error(err);
|
|
3682
|
+
}
|
|
3683
|
+
}
|
|
3684
|
+
}
|
|
3685
|
+
}
|
|
3686
|
+
await set_fieldComputed_dependencies(dsNo, field_id, dsSession);
|
|
3687
|
+
}
|
|
3688
|
+
};
|
|
3689
|
+
|
|
3690
|
+
var fields_changed = [];
|
|
3691
|
+
var datasource_changed = [];
|
|
3692
|
+
let client_datasource_changes = {};
|
|
3693
|
+
let server_datasource_changes = {};
|
|
3694
|
+
// iterate changes datasource
|
|
3695
|
+
for await (const [dataSource, row_data] of Object.entries(datasource_changes)) {
|
|
3696
|
+
var _ds = _session.DS_GLB[dataSource];
|
|
3697
|
+
if (!_ds) {
|
|
3698
|
+
continue;
|
|
3699
|
+
}
|
|
3700
|
+
|
|
3701
|
+
const update_xu_ref = async function () {
|
|
3702
|
+
let _ds_0 = _session.DS_GLB[0];
|
|
3703
|
+
for ([ref_name, val] of Object.entries(_ds_0.data_system['SYS_GLOBAL_OBJ_REFS'])) {
|
|
3704
|
+
if (val.ds.dsSession == dataSource) {
|
|
3705
|
+
func.UI.update_xu_ref(SESSION_ID, dataSource, ref_name);
|
|
3706
|
+
}
|
|
3707
|
+
}
|
|
3708
|
+
};
|
|
3709
|
+
|
|
3710
|
+
// iterate changes records
|
|
3711
|
+
for (const [record_id, fields_data] of Object.entries(row_data)) {
|
|
3712
|
+
// iterate changes fields
|
|
3713
|
+
for (const [field_id, value] of Object.entries(fields_data)) {
|
|
3714
|
+
// mechanism to make update directly on the datasource object
|
|
3715
|
+
if (record_id === 'datasource_main') {
|
|
3716
|
+
_.set(_ds, field_id, value);
|
|
3717
|
+
update_xu_ref();
|
|
3718
|
+
continue;
|
|
3719
|
+
}
|
|
3720
|
+
|
|
3721
|
+
if (typeof fields_data === 'object') {
|
|
3722
|
+
if (glb.GLOBAL_VARS[field_id]) {
|
|
3723
|
+
_ds.data_system[field_id] = value;
|
|
3513
3724
|
continue;
|
|
3514
3725
|
}
|
|
3515
3726
|
|
|
@@ -3521,15 +3732,6 @@ func.datasource.update = async function (SESSION_ID, datasource_changes, update_
|
|
|
3521
3732
|
|
|
3522
3733
|
// search the field in refs
|
|
3523
3734
|
update_xu_ref();
|
|
3524
|
-
// let _ds_0 = _session.DS_GLB[0];
|
|
3525
|
-
// for ([ref_name, val] of Object.entries(_ds_0.data_system['SYS_GLOBAL_OBJ_REFS'])) {
|
|
3526
|
-
// if (val.ds.dsSession == dataSource) {
|
|
3527
|
-
// func.UI.update_xu_ref(SESSION_ID, dataSource, ref_name);
|
|
3528
|
-
// // if (!fields_changed.includes(ref_name)) {
|
|
3529
|
-
// // fields_changed.push(ref_name);
|
|
3530
|
-
// // }
|
|
3531
|
-
// }
|
|
3532
|
-
// }
|
|
3533
3735
|
|
|
3534
3736
|
if (!update_local_scope_only) {
|
|
3535
3737
|
let tree_ret = await func.utils.TREE_OBJ.get(SESSION_ID, _ds.prog_id);
|