@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.
@@ -3286,12 +3286,15 @@ func.datasource.create = async function (
3286
3286
  };
3287
3287
 
3288
3288
  var run_at = _prog_obj?.properties?.runAt;
3289
- if (_session.opt.app_computing_mode === 'main') {
3290
- run_at = 'client';
3291
- }
3292
3289
 
3293
- if (_prog_obj?.properties.menuType === 'globals') {
3294
- run_at = 'client';
3290
+ if (_session.engine_mode !== 'live_preview') {
3291
+ if (_session.opt.app_computing_mode === 'main') {
3292
+ run_at = 'client';
3293
+ }
3294
+
3295
+ if (_prog_obj?.properties.menuType === 'globals') {
3296
+ run_at = 'client';
3297
+ }
3295
3298
  }
3296
3299
 
3297
3300
  if (!run_at && parentDataSourceNoP && _session.DS_GLB[parentDataSourceNoP]) {
@@ -3602,6 +3605,19 @@ func.datasource.prepare = async function (SESSION_ID, prog_id, dataSourceNoP, pa
3602
3605
 
3603
3606
  _ds.stat = 'busy';
3604
3607
  _ds._run_at = run_atP;
3608
+
3609
+ if (_ds.refreshed) {
3610
+ await func.datasource.update(SESSION_ID, {
3611
+ [_ds.dsSession]: {
3612
+ ['datasource_main']: {
3613
+ stat: 'busy',
3614
+ stat_ts: Date.now(),
3615
+ is_worker: glb.IS_WORKER,
3616
+ },
3617
+ },
3618
+ });
3619
+ }
3620
+
3605
3621
  // init_v();
3606
3622
 
3607
3623
  if (IS_DATASOURCE_REFRESH) {
@@ -5030,7 +5046,7 @@ func.datasource.del = function (SESSION_ID, dsP) {
5030
5046
  }
5031
5047
  perform_delete();
5032
5048
  };
5033
- func.datasource.update = async function (SESSION_ID, datasource_changes, update_local_scope_only, avoid_refresh) {
5049
+ func.datasource.update_old = async function (SESSION_ID, datasource_changes, update_local_scope_only, avoid_refresh) {
5034
5050
  return new Promise(async (resolve, reject) => {
5035
5051
  var _session = SESSION_OBJ[SESSION_ID];
5036
5052
 
@@ -5133,7 +5149,202 @@ func.datasource.update = async function (SESSION_ID, datasource_changes, update_
5133
5149
  if (typeof fields_data === 'object') {
5134
5150
  if (glb.GLOBAL_VARS[field_id]) {
5135
5151
  _ds.data_system[field_id] = value;
5152
+ continue;
5153
+ }
5154
+
5155
+ // try {
5156
+ const row_idx = func.common.find_ROWID_idx(_ds, record_id);
5157
+ if (_ds.data_feed.rows[row_idx][field_id] !== value) {
5158
+ _ds.data_feed.rows[row_idx][field_id] = value;
5159
+ await set_fieldComputed_dependencies(dataSource, field_id, null);
5160
+
5161
+ // search the field in refs
5162
+ update_xu_ref();
5163
+
5164
+ if (!update_local_scope_only) {
5165
+ let tree_ret = await func.utils.TREE_OBJ.get(SESSION_ID, _ds.prog_id);
5166
+ if (glb.IS_WORKER) {
5167
+ // RUN AT SERVER
5168
+ if (tree_ret.menuType === 'globals' || tree_ret.menuType === 'component') {
5169
+ const _progFields = await func.datasource.get_progFields(SESSION_ID, dataSource);
5170
+ let view_field_obj = func.common.find_item_by_key(_progFields, 'field_id', field_id);
5171
+ if (!view_field_obj?.data?.serverField && record_id !== 'data_system') {
5172
+ if (!client_datasource_changes[dataSource]) {
5173
+ client_datasource_changes[dataSource] = {};
5174
+ }
5175
+ if (!client_datasource_changes[dataSource][record_id]) {
5176
+ client_datasource_changes[dataSource][record_id] = {};
5177
+ }
5178
+ client_datasource_changes[dataSource][record_id][field_id] = value;
5179
+ }
5180
+ }
5181
+ } else {
5182
+ // RUN AT CLIENT
5183
+ if ((tree_ret.menuType === 'component' && _ds._run_at !== 'client') || tree_ret.menuType === 'globals') {
5184
+ if (!server_datasource_changes[dataSource]) {
5185
+ server_datasource_changes[dataSource] = {};
5186
+ }
5187
+ if (!server_datasource_changes[dataSource][record_id]) {
5188
+ server_datasource_changes[dataSource][record_id] = {};
5189
+ }
5190
+ server_datasource_changes[dataSource][record_id][field_id] = value;
5191
+ }
5192
+ }
5193
+ }
5194
+
5195
+ if (!fields_changed.includes(field_id)) {
5196
+ fields_changed.push(field_id);
5197
+ }
5198
+ if (!datasource_changed.includes(dataSource)) {
5199
+ datasource_changed.push(dataSource);
5200
+ }
5201
+
5202
+ if (!_ds.data_feed.rows_changed) {
5203
+ _ds.data_feed.rows_changed = [];
5204
+ }
5205
+ if (!_ds.data_feed.rows_changed.includes(record_id)) _ds.data_feed.rows_changed.push(record_id);
5206
+ }
5207
+ } else if (fields_data === 'set') {
5208
+ _ds.currentRecordId = record_id;
5209
+ }
5210
+ }
5211
+ }
5212
+ }
5213
+
5214
+ if (glb.IS_WORKER) {
5215
+ if (!update_local_scope_only && !_.isEmpty(client_datasource_changes)) {
5216
+ func.utils.post_back_to_client(SESSION_ID, 'update_client_eventChangesResults_from_worker', _session.worker_id, client_datasource_changes);
5217
+ }
5218
+ } else {
5219
+ if (!update_local_scope_only && !_.isEmpty(server_datasource_changes)) {
5220
+ const ret = await func.index.call_worker(SESSION_ID, {
5221
+ service: 'update_datasource_changes_from_client',
5222
+ data: {
5223
+ session_id: SESSION_ID,
5224
+ datasource_changes: server_datasource_changes,
5225
+ },
5226
+ id: _ds.worker_id,
5227
+ });
5228
+ }
5229
+ ///// REFRESH SCREEN
5230
+ if (!avoid_refresh && fields_changed.length) {
5231
+ await func.UI.screen.refresh_xu_attributes(SESSION_ID, fields_changed);
5232
+ // await removed from the below function cause to dead lock Mar 3 25
5233
+ func.UI.screen.refresh_screen(
5234
+ SESSION_ID,
5235
+ fields_changed,
5236
+ null,
5237
+ datasource_changed[0], // refresh the current datasource only
5238
+ );
5239
+ }
5240
+ }
5241
+ resolve();
5242
+ });
5243
+ };
5244
+
5245
+ func.datasource.update = async function (SESSION_ID, datasource_changes, update_local_scope_only, avoid_refresh) {
5246
+ return new Promise(async (resolve, reject) => {
5247
+ var _session = SESSION_OBJ[SESSION_ID];
5136
5248
 
5249
+ if (_session.IS_API || typeof IS_MASTER_WEBSOCKET !== 'undefined' || typeof IS_PROCESS_SERVER !== 'undefined') {
5250
+ update_local_scope_only = true;
5251
+ }
5252
+
5253
+ if (typeof glb.GLOBAL_VARS === 'undefined') {
5254
+ glb.GLOBAL_VARS = (await func.common.get_module(SESSION_ID, 'xuda-system-globals-module.mjs')).system_globals;
5255
+ }
5256
+
5257
+ const set_fieldComputed_dependencies = async function (dsNo, field_id, parent_ds) {
5258
+ // iterate child ds
5259
+ for (const [dsSession, _ds] of Object.entries(_session.DS_GLB)) {
5260
+ if (parent_ds !== null) {
5261
+ if (_ds.parentDataSourceNo != parent_ds) continue;
5262
+ } else {
5263
+ if (dsSession != dsNo) continue;
5264
+ }
5265
+ let tree_ret = await func.utils.TREE_OBJ.get(SESSION_ID, _ds.prog_id);
5266
+ if (tree_ret.menuType === 'component' || tree_ret.menuType === 'globals') {
5267
+ // check if field has fieldComputed property
5268
+ const _progFields = await func.datasource.get_progFields(SESSION_ID, dsSession);
5269
+ // find if field is computed
5270
+ let fieldComputed_propExpressions, fieldComputed_id;
5271
+ for await (const val of _progFields) {
5272
+ const fieldId = val.data.field_id;
5273
+
5274
+ // if (fieldId !== field_id) continue
5275
+ if (val.data.type !== 'virtual' || !val.props.fieldComputed) continue;
5276
+
5277
+ const _propExpressions = val.props?.propExpressions?.fieldValue;
5278
+ if (_propExpressions && JSON.stringify(_propExpressions).includes(field_id)) {
5279
+ fieldComputed_propExpressions = _propExpressions;
5280
+ fieldComputed_id = fieldId;
5281
+ }
5282
+ }
5283
+
5284
+ if (!fieldComputed_id) return;
5285
+
5286
+ // iterate ds rows
5287
+ for (const row of _ds.data_feed?.rows || []) {
5288
+ // iterate row fields
5289
+ for (const [key, val] of Object.entries(row)) {
5290
+ if (key !== fieldComputed_id) continue;
5291
+ try {
5292
+ let ret = await func.expression.get(SESSION_ID, fieldComputed_propExpressions, dsNo, 'update', row._ROWID);
5293
+
5294
+ const row_idx = func.common.find_ROWID_idx(_ds, row._ROWID);
5295
+ if (_ds.data_feed.rows[row_idx][fieldComputed_id] !== ret.result) {
5296
+ _ds.data_feed.rows[row_idx][fieldComputed_id] = ret.result;
5297
+ if (!fields_changed.includes(fieldComputed_id)) {
5298
+ fields_changed.push(fieldComputed_id);
5299
+ }
5300
+ if (!datasource_changed.includes(dsSession)) {
5301
+ datasource_changed.push(dsSession);
5302
+ }
5303
+ }
5304
+ } catch (err) {
5305
+ console.error(err);
5306
+ }
5307
+ }
5308
+ }
5309
+ }
5310
+ await set_fieldComputed_dependencies(dsNo, field_id, dsSession);
5311
+ }
5312
+ };
5313
+
5314
+ var fields_changed = [];
5315
+ var datasource_changed = [];
5316
+ let client_datasource_changes = {};
5317
+ let server_datasource_changes = {};
5318
+ // iterate changes datasource
5319
+ for await (const [dataSource, row_data] of Object.entries(datasource_changes)) {
5320
+ var _ds = _session.DS_GLB[dataSource];
5321
+ if (!_ds) {
5322
+ continue;
5323
+ }
5324
+
5325
+ const update_xu_ref = async function () {
5326
+ let _ds_0 = _session.DS_GLB[0];
5327
+ for ([ref_name, val] of Object.entries(_ds_0.data_system['SYS_GLOBAL_OBJ_REFS'])) {
5328
+ if (val.ds.dsSession == dataSource) {
5329
+ func.UI.update_xu_ref(SESSION_ID, dataSource, ref_name);
5330
+ }
5331
+ }
5332
+ };
5333
+
5334
+ // iterate changes records
5335
+ for (const [record_id, fields_data] of Object.entries(row_data)) {
5336
+ // iterate changes fields
5337
+ for (const [field_id, value] of Object.entries(fields_data)) {
5338
+ // mechanism to make update directly on the datasource object
5339
+ if (record_id === 'datasource_main') {
5340
+ _.set(_ds, field_id, value);
5341
+ update_xu_ref();
5342
+ continue;
5343
+ }
5344
+
5345
+ if (typeof fields_data === 'object') {
5346
+ if (glb.GLOBAL_VARS[field_id]) {
5347
+ _ds.data_system[field_id] = value;
5137
5348
  continue;
5138
5349
  }
5139
5350
 
@@ -5145,15 +5356,6 @@ func.datasource.update = async function (SESSION_ID, datasource_changes, update_
5145
5356
 
5146
5357
  // search the field in refs
5147
5358
  update_xu_ref();
5148
- // let _ds_0 = _session.DS_GLB[0];
5149
- // for ([ref_name, val] of Object.entries(_ds_0.data_system['SYS_GLOBAL_OBJ_REFS'])) {
5150
- // if (val.ds.dsSession == dataSource) {
5151
- // func.UI.update_xu_ref(SESSION_ID, dataSource, ref_name);
5152
- // // if (!fields_changed.includes(ref_name)) {
5153
- // // fields_changed.push(ref_name);
5154
- // // }
5155
- // }
5156
- // }
5157
5359
 
5158
5360
  if (!update_local_scope_only) {
5159
5361
  let tree_ret = await func.utils.TREE_OBJ.get(SESSION_ID, _ds.prog_id);
@@ -9113,6 +9315,22 @@ func.UI.update_xu_ref = function (SESSION_ID, dsSessionP, ref_field_id, $elm) {
9113
9315
  SYS_GLOBAL_OBJ_REFS[ref_field_id].attributes = attributes;
9114
9316
  SYS_GLOBAL_OBJ_REFS[ref_field_id].xu_ui_id = $elm.attr('xu-ui-id');
9115
9317
  }
9318
+
9319
+ // let obj = { ds: _ds, data: _ds?.data_feed?.rows?.[row_idx] || {}, props: _ds.in_parameters || {} };
9320
+
9321
+ // if ($elm) {
9322
+ // const attributes = $elm?.data()?.xuData?.xuPanelProps || $elm?.data()?.xuData?.debug_info?.attribute_stat || {};
9323
+ // obj.attributes = attributes;
9324
+ // obj.xu_ui_id = $elm.attr('xu-ui-id');
9325
+ // }
9326
+
9327
+ // func.datasource.update(SESSION_ID, {
9328
+ // [0]: {
9329
+ // ['datasource_main']: {
9330
+ // 'data_system.SYS_GLOBAL_OBJ_REFS': { [`${ref_field_id}`]: obj },
9331
+ // },
9332
+ // },
9333
+ // });
9116
9334
  };
9117
9335
 
9118
9336
  func.UI.find_field_in_progUi_attributes = function (progUi, field_id, prop, tag_name) {
@@ -3287,12 +3287,15 @@ func.datasource.create = async function (
3287
3287
  };
3288
3288
 
3289
3289
  var run_at = _prog_obj?.properties?.runAt;
3290
- if (_session.opt.app_computing_mode === 'main') {
3291
- run_at = 'client';
3292
- }
3293
3290
 
3294
- if (_prog_obj?.properties.menuType === 'globals') {
3295
- run_at = 'client';
3291
+ if (_session.engine_mode !== 'live_preview') {
3292
+ if (_session.opt.app_computing_mode === 'main') {
3293
+ run_at = 'client';
3294
+ }
3295
+
3296
+ if (_prog_obj?.properties.menuType === 'globals') {
3297
+ run_at = 'client';
3298
+ }
3296
3299
  }
3297
3300
 
3298
3301
  if (!run_at && parentDataSourceNoP && _session.DS_GLB[parentDataSourceNoP]) {
@@ -3603,6 +3606,19 @@ func.datasource.prepare = async function (SESSION_ID, prog_id, dataSourceNoP, pa
3603
3606
 
3604
3607
  _ds.stat = 'busy';
3605
3608
  _ds._run_at = run_atP;
3609
+
3610
+ if (_ds.refreshed) {
3611
+ await func.datasource.update(SESSION_ID, {
3612
+ [_ds.dsSession]: {
3613
+ ['datasource_main']: {
3614
+ stat: 'busy',
3615
+ stat_ts: Date.now(),
3616
+ is_worker: glb.IS_WORKER,
3617
+ },
3618
+ },
3619
+ });
3620
+ }
3621
+
3606
3622
  // init_v();
3607
3623
 
3608
3624
  if (IS_DATASOURCE_REFRESH) {
@@ -5031,7 +5047,7 @@ func.datasource.del = function (SESSION_ID, dsP) {
5031
5047
  }
5032
5048
  perform_delete();
5033
5049
  };
5034
- func.datasource.update = async function (SESSION_ID, datasource_changes, update_local_scope_only, avoid_refresh) {
5050
+ func.datasource.update_old = async function (SESSION_ID, datasource_changes, update_local_scope_only, avoid_refresh) {
5035
5051
  return new Promise(async (resolve, reject) => {
5036
5052
  var _session = SESSION_OBJ[SESSION_ID];
5037
5053
 
@@ -5134,7 +5150,202 @@ func.datasource.update = async function (SESSION_ID, datasource_changes, update_
5134
5150
  if (typeof fields_data === 'object') {
5135
5151
  if (glb.GLOBAL_VARS[field_id]) {
5136
5152
  _ds.data_system[field_id] = value;
5153
+ continue;
5154
+ }
5155
+
5156
+ // try {
5157
+ const row_idx = func.common.find_ROWID_idx(_ds, record_id);
5158
+ if (_ds.data_feed.rows[row_idx][field_id] !== value) {
5159
+ _ds.data_feed.rows[row_idx][field_id] = value;
5160
+ await set_fieldComputed_dependencies(dataSource, field_id, null);
5161
+
5162
+ // search the field in refs
5163
+ update_xu_ref();
5164
+
5165
+ if (!update_local_scope_only) {
5166
+ let tree_ret = await func.utils.TREE_OBJ.get(SESSION_ID, _ds.prog_id);
5167
+ if (glb.IS_WORKER) {
5168
+ // RUN AT SERVER
5169
+ if (tree_ret.menuType === 'globals' || tree_ret.menuType === 'component') {
5170
+ const _progFields = await func.datasource.get_progFields(SESSION_ID, dataSource);
5171
+ let view_field_obj = func.common.find_item_by_key(_progFields, 'field_id', field_id);
5172
+ if (!view_field_obj?.data?.serverField && record_id !== 'data_system') {
5173
+ if (!client_datasource_changes[dataSource]) {
5174
+ client_datasource_changes[dataSource] = {};
5175
+ }
5176
+ if (!client_datasource_changes[dataSource][record_id]) {
5177
+ client_datasource_changes[dataSource][record_id] = {};
5178
+ }
5179
+ client_datasource_changes[dataSource][record_id][field_id] = value;
5180
+ }
5181
+ }
5182
+ } else {
5183
+ // RUN AT CLIENT
5184
+ if ((tree_ret.menuType === 'component' && _ds._run_at !== 'client') || tree_ret.menuType === 'globals') {
5185
+ if (!server_datasource_changes[dataSource]) {
5186
+ server_datasource_changes[dataSource] = {};
5187
+ }
5188
+ if (!server_datasource_changes[dataSource][record_id]) {
5189
+ server_datasource_changes[dataSource][record_id] = {};
5190
+ }
5191
+ server_datasource_changes[dataSource][record_id][field_id] = value;
5192
+ }
5193
+ }
5194
+ }
5195
+
5196
+ if (!fields_changed.includes(field_id)) {
5197
+ fields_changed.push(field_id);
5198
+ }
5199
+ if (!datasource_changed.includes(dataSource)) {
5200
+ datasource_changed.push(dataSource);
5201
+ }
5202
+
5203
+ if (!_ds.data_feed.rows_changed) {
5204
+ _ds.data_feed.rows_changed = [];
5205
+ }
5206
+ if (!_ds.data_feed.rows_changed.includes(record_id)) _ds.data_feed.rows_changed.push(record_id);
5207
+ }
5208
+ } else if (fields_data === 'set') {
5209
+ _ds.currentRecordId = record_id;
5210
+ }
5211
+ }
5212
+ }
5213
+ }
5214
+
5215
+ if (glb.IS_WORKER) {
5216
+ if (!update_local_scope_only && !_.isEmpty(client_datasource_changes)) {
5217
+ func.utils.post_back_to_client(SESSION_ID, 'update_client_eventChangesResults_from_worker', _session.worker_id, client_datasource_changes);
5218
+ }
5219
+ } else {
5220
+ if (!update_local_scope_only && !_.isEmpty(server_datasource_changes)) {
5221
+ const ret = await func.index.call_worker(SESSION_ID, {
5222
+ service: 'update_datasource_changes_from_client',
5223
+ data: {
5224
+ session_id: SESSION_ID,
5225
+ datasource_changes: server_datasource_changes,
5226
+ },
5227
+ id: _ds.worker_id,
5228
+ });
5229
+ }
5230
+ ///// REFRESH SCREEN
5231
+ if (!avoid_refresh && fields_changed.length) {
5232
+ await func.UI.screen.refresh_xu_attributes(SESSION_ID, fields_changed);
5233
+ // await removed from the below function cause to dead lock Mar 3 25
5234
+ func.UI.screen.refresh_screen(
5235
+ SESSION_ID,
5236
+ fields_changed,
5237
+ null,
5238
+ datasource_changed[0], // refresh the current datasource only
5239
+ );
5240
+ }
5241
+ }
5242
+ resolve();
5243
+ });
5244
+ };
5245
+
5246
+ func.datasource.update = async function (SESSION_ID, datasource_changes, update_local_scope_only, avoid_refresh) {
5247
+ return new Promise(async (resolve, reject) => {
5248
+ var _session = SESSION_OBJ[SESSION_ID];
5137
5249
 
5250
+ if (_session.IS_API || typeof IS_MASTER_WEBSOCKET !== 'undefined' || typeof IS_PROCESS_SERVER !== 'undefined') {
5251
+ update_local_scope_only = true;
5252
+ }
5253
+
5254
+ if (typeof glb.GLOBAL_VARS === 'undefined') {
5255
+ glb.GLOBAL_VARS = (await func.common.get_module(SESSION_ID, 'xuda-system-globals-module.mjs')).system_globals;
5256
+ }
5257
+
5258
+ const set_fieldComputed_dependencies = async function (dsNo, field_id, parent_ds) {
5259
+ // iterate child ds
5260
+ for (const [dsSession, _ds] of Object.entries(_session.DS_GLB)) {
5261
+ if (parent_ds !== null) {
5262
+ if (_ds.parentDataSourceNo != parent_ds) continue;
5263
+ } else {
5264
+ if (dsSession != dsNo) continue;
5265
+ }
5266
+ let tree_ret = await func.utils.TREE_OBJ.get(SESSION_ID, _ds.prog_id);
5267
+ if (tree_ret.menuType === 'component' || tree_ret.menuType === 'globals') {
5268
+ // check if field has fieldComputed property
5269
+ const _progFields = await func.datasource.get_progFields(SESSION_ID, dsSession);
5270
+ // find if field is computed
5271
+ let fieldComputed_propExpressions, fieldComputed_id;
5272
+ for await (const val of _progFields) {
5273
+ const fieldId = val.data.field_id;
5274
+
5275
+ // if (fieldId !== field_id) continue
5276
+ if (val.data.type !== 'virtual' || !val.props.fieldComputed) continue;
5277
+
5278
+ const _propExpressions = val.props?.propExpressions?.fieldValue;
5279
+ if (_propExpressions && JSON.stringify(_propExpressions).includes(field_id)) {
5280
+ fieldComputed_propExpressions = _propExpressions;
5281
+ fieldComputed_id = fieldId;
5282
+ }
5283
+ }
5284
+
5285
+ if (!fieldComputed_id) return;
5286
+
5287
+ // iterate ds rows
5288
+ for (const row of _ds.data_feed?.rows || []) {
5289
+ // iterate row fields
5290
+ for (const [key, val] of Object.entries(row)) {
5291
+ if (key !== fieldComputed_id) continue;
5292
+ try {
5293
+ let ret = await func.expression.get(SESSION_ID, fieldComputed_propExpressions, dsNo, 'update', row._ROWID);
5294
+
5295
+ const row_idx = func.common.find_ROWID_idx(_ds, row._ROWID);
5296
+ if (_ds.data_feed.rows[row_idx][fieldComputed_id] !== ret.result) {
5297
+ _ds.data_feed.rows[row_idx][fieldComputed_id] = ret.result;
5298
+ if (!fields_changed.includes(fieldComputed_id)) {
5299
+ fields_changed.push(fieldComputed_id);
5300
+ }
5301
+ if (!datasource_changed.includes(dsSession)) {
5302
+ datasource_changed.push(dsSession);
5303
+ }
5304
+ }
5305
+ } catch (err) {
5306
+ console.error(err);
5307
+ }
5308
+ }
5309
+ }
5310
+ }
5311
+ await set_fieldComputed_dependencies(dsNo, field_id, dsSession);
5312
+ }
5313
+ };
5314
+
5315
+ var fields_changed = [];
5316
+ var datasource_changed = [];
5317
+ let client_datasource_changes = {};
5318
+ let server_datasource_changes = {};
5319
+ // iterate changes datasource
5320
+ for await (const [dataSource, row_data] of Object.entries(datasource_changes)) {
5321
+ var _ds = _session.DS_GLB[dataSource];
5322
+ if (!_ds) {
5323
+ continue;
5324
+ }
5325
+
5326
+ const update_xu_ref = async function () {
5327
+ let _ds_0 = _session.DS_GLB[0];
5328
+ for ([ref_name, val] of Object.entries(_ds_0.data_system['SYS_GLOBAL_OBJ_REFS'])) {
5329
+ if (val.ds.dsSession == dataSource) {
5330
+ func.UI.update_xu_ref(SESSION_ID, dataSource, ref_name);
5331
+ }
5332
+ }
5333
+ };
5334
+
5335
+ // iterate changes records
5336
+ for (const [record_id, fields_data] of Object.entries(row_data)) {
5337
+ // iterate changes fields
5338
+ for (const [field_id, value] of Object.entries(fields_data)) {
5339
+ // mechanism to make update directly on the datasource object
5340
+ if (record_id === 'datasource_main') {
5341
+ _.set(_ds, field_id, value);
5342
+ update_xu_ref();
5343
+ continue;
5344
+ }
5345
+
5346
+ if (typeof fields_data === 'object') {
5347
+ if (glb.GLOBAL_VARS[field_id]) {
5348
+ _ds.data_system[field_id] = value;
5138
5349
  continue;
5139
5350
  }
5140
5351
 
@@ -5146,15 +5357,6 @@ func.datasource.update = async function (SESSION_ID, datasource_changes, update_
5146
5357
 
5147
5358
  // search the field in refs
5148
5359
  update_xu_ref();
5149
- // let _ds_0 = _session.DS_GLB[0];
5150
- // for ([ref_name, val] of Object.entries(_ds_0.data_system['SYS_GLOBAL_OBJ_REFS'])) {
5151
- // if (val.ds.dsSession == dataSource) {
5152
- // func.UI.update_xu_ref(SESSION_ID, dataSource, ref_name);
5153
- // // if (!fields_changed.includes(ref_name)) {
5154
- // // fields_changed.push(ref_name);
5155
- // // }
5156
- // }
5157
- // }
5158
5360
 
5159
5361
  if (!update_local_scope_only) {
5160
5362
  let tree_ret = await func.utils.TREE_OBJ.get(SESSION_ID, _ds.prog_id);
@@ -9114,6 +9316,22 @@ func.UI.update_xu_ref = function (SESSION_ID, dsSessionP, ref_field_id, $elm) {
9114
9316
  SYS_GLOBAL_OBJ_REFS[ref_field_id].attributes = attributes;
9115
9317
  SYS_GLOBAL_OBJ_REFS[ref_field_id].xu_ui_id = $elm.attr('xu-ui-id');
9116
9318
  }
9319
+
9320
+ // let obj = { ds: _ds, data: _ds?.data_feed?.rows?.[row_idx] || {}, props: _ds.in_parameters || {} };
9321
+
9322
+ // if ($elm) {
9323
+ // const attributes = $elm?.data()?.xuData?.xuPanelProps || $elm?.data()?.xuData?.debug_info?.attribute_stat || {};
9324
+ // obj.attributes = attributes;
9325
+ // obj.xu_ui_id = $elm.attr('xu-ui-id');
9326
+ // }
9327
+
9328
+ // func.datasource.update(SESSION_ID, {
9329
+ // [0]: {
9330
+ // ['datasource_main']: {
9331
+ // 'data_system.SYS_GLOBAL_OBJ_REFS': { [`${ref_field_id}`]: obj },
9332
+ // },
9333
+ // },
9334
+ // });
9117
9335
  };
9118
9336
 
9119
9337
  func.UI.find_field_in_progUi_attributes = function (progUi, field_id, prop, tag_name) {