@xuda.io/xuda-worker-bundle 1.3.2589 → 1.3.2590

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 +28 -931
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -10,15 +10,6 @@ var func = {};
10
10
  func.UI = {};
11
11
  func.GLB = {};
12
12
  func.mobile = {};
13
- func.runtime = {};
14
- func.runtime.bind = {};
15
- func.runtime.program = {};
16
- func.runtime.resources = {};
17
- func.runtime.render = {};
18
- func.runtime.session = {};
19
- func.runtime.workers = {};
20
- func.runtime.ui = {};
21
- func.runtime.widgets = {};
22
13
  glb.IS_STUDIO = null;
23
14
 
24
15
  var PROJECT_OBJ = {};
@@ -32,855 +23,6 @@ glb.PROTECTED_VARS = ['_NULL', '_THIS', '_FOR_KEY', '_FOR_VAL', '_ROWNO', '_ROWI
32
23
  // glb.newRecord = 999999;
33
24
 
34
25
  func.common = {};
35
- func.runtime.platform = {
36
- has_window: function () {
37
- return typeof window !== 'undefined';
38
- },
39
- has_document: function () {
40
- return typeof document !== 'undefined';
41
- },
42
- get_window: function () {
43
- if (func.runtime.platform.has_window()) {
44
- return window;
45
- }
46
- return null;
47
- },
48
- get_document: function () {
49
- if (func.runtime.platform.has_document()) {
50
- return document;
51
- }
52
- return null;
53
- },
54
- get_location: function () {
55
- const win = func.runtime.platform.get_window();
56
- return win?.location || null;
57
- },
58
- get_navigator: function () {
59
- const win = func.runtime.platform.get_window();
60
- if (win?.navigator) {
61
- return win.navigator;
62
- }
63
- if (typeof navigator !== 'undefined') {
64
- return navigator;
65
- }
66
- return null;
67
- },
68
- is_html_element: function (value) {
69
- if (typeof HTMLElement === 'undefined') {
70
- return false;
71
- }
72
- return value instanceof HTMLElement;
73
- },
74
- get_storage: function (type) {
75
- const win = func.runtime.platform.get_window();
76
- try {
77
- if (!win) {
78
- return null;
79
- }
80
- if (type === 'session') {
81
- return win.sessionStorage || null;
82
- }
83
- return win.localStorage || null;
84
- } catch (error) {
85
- return null;
86
- }
87
- },
88
- get_storage_item: function (key, type) {
89
- const storage = func.runtime.platform.get_storage(type);
90
- if (!storage) {
91
- return null;
92
- }
93
- try {
94
- return storage.getItem(key);
95
- } catch (error) {
96
- return null;
97
- }
98
- },
99
- set_storage_item: function (key, value, type) {
100
- const storage = func.runtime.platform.get_storage(type);
101
- if (!storage) {
102
- return false;
103
- }
104
- try {
105
- storage.setItem(key, value);
106
- return true;
107
- } catch (error) {
108
- return false;
109
- }
110
- },
111
- get_url_href: function () {
112
- return func.runtime.platform.get_location()?.href || '';
113
- },
114
- get_url_search: function () {
115
- return func.runtime.platform.get_location()?.search || '';
116
- },
117
- get_url_hash: function () {
118
- return func.runtime.platform.get_location()?.hash || '';
119
- },
120
- get_host: function () {
121
- return func.runtime.platform.get_location()?.host || '';
122
- },
123
- get_hostname: function () {
124
- return func.runtime.platform.get_location()?.hostname || '';
125
- },
126
- get_device_uuid: function () {
127
- const win = func.runtime.platform.get_window();
128
- return win?.device?.uuid || null;
129
- },
130
- get_device_name: function () {
131
- const win = func.runtime.platform.get_window();
132
- return win?.device?.name || null;
133
- },
134
- get_inner_size: function () {
135
- const win = func.runtime.platform.get_window();
136
- return {
137
- width: win?.innerWidth || 0,
138
- height: win?.innerHeight || 0,
139
- };
140
- },
141
- add_window_listener: function (name, handler) {
142
- const win = func.runtime.platform.get_window();
143
- if (!win?.addEventListener) {
144
- return false;
145
- }
146
- win.addEventListener(name, handler);
147
- return true;
148
- },
149
- dispatch_body_event: function (event) {
150
- const doc = func.runtime.platform.get_document();
151
- if (!doc?.body?.dispatchEvent) {
152
- return false;
153
- }
154
- doc.body.dispatchEvent(event);
155
- return true;
156
- },
157
- reload_top_window: function () {
158
- const win = func.runtime.platform.get_window();
159
- if (!win?.top?.location?.reload) {
160
- return false;
161
- }
162
- win.top.location.reload();
163
- return true;
164
- },
165
- get_service_worker: function () {
166
- const nav = func.runtime.platform.get_navigator();
167
- return nav?.serviceWorker || null;
168
- },
169
- has_service_worker: function () {
170
- return !!func.runtime.platform.get_service_worker();
171
- },
172
- register_service_worker: function (script_url) {
173
- const service_worker = func.runtime.platform.get_service_worker();
174
- if (!service_worker?.register) {
175
- return Promise.reject(new Error('serviceWorker is not available'));
176
- }
177
- return service_worker.register(script_url);
178
- },
179
- add_service_worker_listener: function (name, handler) {
180
- const service_worker = func.runtime.platform.get_service_worker();
181
- if (!service_worker?.addEventListener) {
182
- return false;
183
- }
184
- service_worker.addEventListener(name, handler);
185
- return true;
186
- },
187
- };
188
- func.runtime.env = {
189
- get_url_params: function () {
190
- const search = func.runtime.platform.get_url_search();
191
- return new URLSearchParams(search);
192
- },
193
- get_url_parameters_object: function () {
194
- const search_params = func.runtime.env.get_url_params();
195
- const parameters = {};
196
- for (const [key, value] of search_params.entries()) {
197
- parameters[key] = value;
198
- }
199
- return parameters;
200
- },
201
- get_default_session_value: function (key) {
202
- switch (key) {
203
- case 'domain':
204
- return func.runtime.platform.get_host();
205
- case 'engine_mode':
206
- return 'miniapp';
207
- case 'app_id':
208
- return 'unknown';
209
- default:
210
- return null;
211
- }
212
- },
213
- };
214
- func.runtime.session.create_tab_id = function () {
215
- const session_storage = func.runtime.platform.get_storage('session');
216
- const local_storage = func.runtime.platform.get_storage('local');
217
- var page_tab_id = session_storage?.getItem('tabID');
218
- if (page_tab_id == null) {
219
- var local_tab_id = local_storage?.getItem('tabID');
220
- page_tab_id = local_tab_id == null ? 1 : Number(local_tab_id) + 1;
221
- func.runtime.platform.set_storage_item('tabID', page_tab_id, 'local');
222
- func.runtime.platform.set_storage_item('tabID', page_tab_id, 'session');
223
- }
224
- return page_tab_id;
225
- };
226
- func.runtime.session.get_fingerprint = function (components, instance_id) {
227
- const device_uuid = func.runtime.platform.get_device_uuid();
228
- if (func.utils.get_device() && device_uuid) {
229
- if (instance_id) {
230
- return instance_id + device_uuid;
231
- }
232
- return device_uuid;
233
- }
234
- const fingerprint_id = Fingerprint2.x64hash128(
235
- components
236
- .map(function (pair) {
237
- return pair.value;
238
- })
239
- .join(),
240
- 31,
241
- );
242
-
243
- if (instance_id) {
244
- return instance_id + fingerprint_id + func.runtime.session.create_tab_id();
245
- }
246
- return fingerprint_id;
247
- };
248
- func.runtime.session.create_state = function (SESSION_ID, options) {
249
- const runtime_host = func.runtime.platform.get_host();
250
- SESSION_OBJ[SESSION_ID] = {
251
- JOB_NO: 1000,
252
- opt: options.opt,
253
- root_element: options.root_element,
254
- worker_type: options.worker_type,
255
- api_callback: options.api_callback,
256
- CODE_BUNDLE: options.code_bundle,
257
- SLIM_BUNDLE: options.slim_bundle,
258
- WORKER_OBJ: {
259
- jobs: [],
260
- num: 1000,
261
- stat: null,
262
- },
263
- DS_GLB: {},
264
- SYS_GLOBAL_OBJ_FIREBASE_AUTH_INFO: {
265
- token: '',
266
- first_name: '',
267
- last_name: '',
268
- email: '',
269
- user_id: '',
270
- picture: '',
271
- verified_email: '',
272
- locale: '',
273
- error_code: '',
274
- error_msg: '',
275
- },
276
- SYS_GLOBAL_OBJ_CLIENT_INFO: {
277
- fingerprint: '',
278
- device: '',
279
- user_agent: '',
280
- browser_version: '',
281
- browser_name: '',
282
- engine_version: '',
283
- client_ip: '',
284
- engine_name: '',
285
- os_name: '',
286
- os_version: '',
287
- device_model: '',
288
- device_vendor: '',
289
- device_type: '',
290
- screen_current_resolution_x: '',
291
- screen_current_resolution_y: '',
292
- screen_available_resolution_x: '',
293
- screen_available_resolution_y: '',
294
- language: '',
295
- time_zone: '',
296
- cpu_architecture: '',
297
- uuid: '',
298
- },
299
- PUSH_NOTIFICATION_GRANTED: null,
300
- FIREBASE_TOKEN_ID: null,
301
- USR_OBJ: {},
302
- debug_js: null,
303
- DS_UI_EVENTS_GLB: {},
304
- host: runtime_host,
305
- req_id: 0,
306
- build_info: {},
307
- CACHE_REQ: {},
308
- url_params: {
309
- ...func.common.getParametersFromUrl(),
310
- ...options.url_params,
311
- },
312
- };
313
- func.runtime.workers.ensure_registry(SESSION_ID);
314
- return SESSION_OBJ[SESSION_ID];
315
- };
316
- func.runtime.session.set_default_value = function (_session, key, value) {
317
- _session[key] = value || func.runtime.env.get_default_session_value(key);
318
- return _session[key];
319
- };
320
- func.runtime.session.populate_client_info = function (_session, components) {
321
- const _client_info = _session.SYS_GLOBAL_OBJ_CLIENT_INFO;
322
- const platform = func.runtime.platform;
323
- const { engine_mode } = _session;
324
-
325
- _client_info.fingerprint = func.runtime.session.get_fingerprint(components);
326
-
327
- if (engine_mode === 'live_preview') {
328
- const inner_size = platform.get_inner_size();
329
- _client_info.screen_current_resolution_x = inner_size.width;
330
- _client_info.screen_current_resolution_y = inner_size.height;
331
- _client_info.screen_available_resolution_x = inner_size.width;
332
- _client_info.screen_available_resolution_y = inner_size.height;
333
- } else {
334
- _client_info.screen_current_resolution_x = components[6].value[0];
335
- _client_info.screen_current_resolution_y = components[6].value[1];
336
- _client_info.screen_available_resolution_x = components[7].value[0];
337
- _client_info.screen_available_resolution_y = components[7].value[1];
338
- }
339
-
340
- const client = new ClientJS();
341
- _client_info.device = func.utils.get_device();
342
-
343
- const browser_data = client.getBrowserData();
344
- _client_info.user_agent = browser_data.ua;
345
- _client_info.browser_version = browser_data.browser.name;
346
- _client_info.browser_name = browser_data.browser.version;
347
- _client_info.engine_version = browser_data.engine.name;
348
- _client_info.engine_name = browser_data.engine.version;
349
- _client_info.os_name = browser_data.os.name;
350
- _client_info.os_version = browser_data.os.version;
351
- _client_info.device_model = browser_data.device.name;
352
- _client_info.device_vendor = browser_data.device.name;
353
- _client_info.device_type = browser_data.device.name;
354
- _client_info.language = client.getLanguage();
355
- _client_info.time_zone = client.getTimeZone();
356
- _client_info.cpu_architecture = browser_data.cpu.architecture;
357
-
358
- if (['android', 'ios', 'windows', 'macos', 'linux', 'live_preview'].includes(engine_mode) && func.utils.get_device()) {
359
- _client_info.uuid = platform.get_device_uuid();
360
- const device_name = platform.get_device_name();
361
- if (device_name) {
362
- _client_info.device_name = device_name;
363
- }
364
- }
365
- return _client_info;
366
- };
367
- func.runtime.workers.ensure_registry = function (SESSION_ID) {
368
- if (!WEB_WORKER[SESSION_ID]) {
369
- WEB_WORKER[SESSION_ID] = {};
370
- }
371
- return WEB_WORKER[SESSION_ID];
372
- };
373
- func.runtime.workers.get_registry_entry = function (SESSION_ID, worker_id) {
374
- return func.runtime.workers.ensure_registry(SESSION_ID)?.[worker_id] || null;
375
- };
376
- func.runtime.workers.set_registry_entry = function (SESSION_ID, worker_id, entry) {
377
- const worker_registry = func.runtime.workers.ensure_registry(SESSION_ID);
378
- worker_registry[worker_id] = entry;
379
- return worker_registry[worker_id];
380
- };
381
- func.runtime.workers.build_worker_name = function (glb_worker_type, session, prog_obj, worker_id, build_id) {
382
- return (
383
- `${typeof session.SLIM_BUNDLE === 'undefined' || !session.SLIM_BUNDLE ? '' : 'Slim '}${prog_obj.menuName} worker` +
384
- ' ' +
385
- glb_worker_type +
386
- ': #' +
387
- worker_id.toString() +
388
- ' ' +
389
- (build_id || '') +
390
- ' ' +
391
- session.domain
392
- );
393
- };
394
- func.runtime.workers.is_server_transport = function (session) {
395
- return !!(RUNTIME_SERVER_WEBSOCKET && RUNTIME_SERVER_WEBSOCKET_CONNECTED && (!session.opt.app_computing_mode || session.opt.app_computing_mode === 'server'));
396
- };
397
- func.runtime.workers.send_message = function (SESSION_ID, worker_id, session, msg, process_pid) {
398
- const registry_entry = func.runtime.workers.get_registry_entry(SESSION_ID, worker_id);
399
- if (!registry_entry?.worker) {
400
- return false;
401
- }
402
-
403
- if (func.runtime.workers.is_server_transport(session)) {
404
- if (process_pid) {
405
- msg.process_pid = process_pid;
406
- }
407
- registry_entry.worker.emit('message', msg);
408
- return true;
409
- }
410
-
411
- registry_entry.worker.postMessage(msg);
412
- return true;
413
- };
414
- func.runtime.workers.set_promise = function (SESSION_ID, worker_id, promise_queue_id, value) {
415
- const registry_entry = func.runtime.workers.get_registry_entry(SESSION_ID, worker_id);
416
- if (!registry_entry) {
417
- return null;
418
- }
419
- registry_entry.promise_queue[promise_queue_id] = value;
420
- return registry_entry.promise_queue[promise_queue_id];
421
- };
422
- func.runtime.workers.get_promise = function (SESSION_ID, worker_id, promise_queue_id) {
423
- const registry_entry = func.runtime.workers.get_registry_entry(SESSION_ID, worker_id);
424
- if (!registry_entry) {
425
- return null;
426
- }
427
- return registry_entry.promise_queue[promise_queue_id];
428
- };
429
- func.runtime.workers.delete_promise = function (SESSION_ID, worker_id, promise_queue_id) {
430
- const registry_entry = func.runtime.workers.get_registry_entry(SESSION_ID, worker_id);
431
- if (!registry_entry?.promise_queue) {
432
- return false;
433
- }
434
- delete registry_entry.promise_queue[promise_queue_id];
435
- return true;
436
- };
437
- func.runtime.render.get_root_data_system = function (SESSION_ID) {
438
- return SESSION_OBJ[SESSION_ID]?.DS_GLB?.[0]?.data_system || null;
439
- };
440
- func.runtime.render.resolve_xu_for_source = async function (SESSION_ID, dsSessionP, value) {
441
- let arr = value;
442
- let reference_source_obj;
443
- const _progFields = await func.datasource.get_progFields(SESSION_ID, dsSessionP);
444
- let view_field_obj = func.common.find_item_by_key(_progFields, 'field_id', value);
445
-
446
- if (view_field_obj) {
447
- reference_source_obj = await func.datasource.get_value(SESSION_ID, value, dsSessionP);
448
- arr = reference_source_obj?.ret?.value;
449
- } else {
450
- if (typeof value === 'string') {
451
- arr = eval(value.replaceAll('\\', ''));
452
- }
453
- if (typeof arr === 'number') {
454
- arr = Array.from(Array(arr).keys());
455
- }
456
- }
457
-
458
- return {
459
- arr,
460
- reference_source_obj,
461
- };
462
- };
463
- func.runtime.render.apply_iterate_value_to_ds = function (SESSION_ID, dsSessionP, currentRecordId, progFields, field_id, value, is_dynamic_field) {
464
- if (is_dynamic_field) {
465
- func.datasource.add_dynamic_field_to_ds(SESSION_ID, dsSessionP, field_id, value);
466
- return true;
467
- }
468
-
469
- let view_field_obj = func.common.find_item_by_key(progFields || [], 'field_id', field_id);
470
- if (!view_field_obj) {
471
- console.error('field not exist in dataset for xu-for method');
472
- return false;
473
- }
474
-
475
- let _ds = SESSION_OBJ[SESSION_ID].DS_GLB[dsSessionP];
476
- try {
477
- const row_idx = func.common.find_ROWID_idx(_ds, currentRecordId);
478
- _ds.data_feed.rows[row_idx][field_id] = value;
479
- return true;
480
- } catch (err) {
481
- console.error(err);
482
- return false;
483
- }
484
- };
485
- func.runtime.render.build_iterate_info = function (options) {
486
- return {
487
- _val: options._val,
488
- _key: options._key,
489
- iterator_key: options.iterator_key,
490
- iterator_val: options.iterator_val,
491
- is_key_dynamic_field: options.is_key_dynamic_field,
492
- is_val_dynamic_field: options.is_val_dynamic_field,
493
- reference_source_obj: options.reference_source_obj,
494
- };
495
- };
496
- func.runtime.render.apply_iterate_info_to_current_record = function (SESSION_ID, dsSessionP, currentRecordId, progFields, iterate_info) {
497
- if (!iterate_info) {
498
- return false;
499
- }
500
- func.runtime.render.apply_iterate_value_to_ds(SESSION_ID, dsSessionP, currentRecordId, progFields, iterate_info.iterator_key, iterate_info._key, iterate_info.is_key_dynamic_field);
501
- func.runtime.render.apply_iterate_value_to_ds(SESSION_ID, dsSessionP, currentRecordId, progFields, iterate_info.iterator_val, iterate_info._val, iterate_info.is_val_dynamic_field);
502
- return true;
503
- };
504
- func.runtime.render.sync_iterate_info_to_dataset = function (_ds, iterate_info) {
505
- if (!iterate_info) {
506
- return false;
507
- }
508
-
509
- const sync_field = function (field_id, value, is_dynamic_field) {
510
- if (is_dynamic_field) {
511
- _ds.dynamic_fields[field_id].value = value;
512
- return true;
513
- }
514
- try {
515
- const row_idx = func.common.find_ROWID_idx(_ds, _ds.currentRecordId);
516
- _ds.data_feed.rows[row_idx][field_id] = value;
517
- return true;
518
- } catch (err) {
519
- console.error(err);
520
- return false;
521
- }
522
- };
523
-
524
- sync_field(iterate_info.iterator_key, iterate_info._key, iterate_info.is_key_dynamic_field);
525
- sync_field(iterate_info.iterator_val, iterate_info._val, iterate_info.is_val_dynamic_field);
526
- return true;
527
- };
528
- func.runtime.program.get_params_obj = async function (SESSION_ID, prog_id, nodeP, dsSession) {
529
- const _prog = await func.utils.VIEWS_OBJ.get(SESSION_ID, prog_id);
530
- if (!_prog) return;
531
-
532
- let params_res = {},
533
- params_raw = {};
534
- if (_prog?.properties?.progParams) {
535
- for await (const [key, val] of Object.entries(_prog.properties.progParams)) {
536
- if (!['in', 'out'].includes(val.data.dir)) continue;
537
-
538
- if (nodeP.attributes) {
539
- if (nodeP.attributes[val.data.parameter]) {
540
- params_res[val.data.parameter] = nodeP.attributes[val.data.parameter];
541
- } else if (nodeP.attributes[`xu-exp:${val.data.parameter}`]) {
542
- if (val.data.dir == 'out') {
543
- params_res[val.data.parameter] = nodeP.attributes[`xu-exp:${val.data.parameter}`].replaceAll('@', '');
544
- } else {
545
- let ret = await func.expression.get(SESSION_ID, nodeP.attributes[`xu-exp:${val.data.parameter}`], dsSession, 'parameters');
546
- params_res[val.data.parameter] = ret.result;
547
- params_raw[val.data.parameter] = nodeP.attributes[`xu-exp:${val.data.parameter}`];
548
- }
549
- }
550
- continue;
551
- }
552
- console.warn(`Warning: Program ${_prog.properties.menuName} expected In parameter: ${val.data.parameter} but received null instead`);
553
- }
554
- }
555
- return { params_res, params_raw };
556
- };
557
- func.runtime.bind.build_datasource_changes = function (dsSessionP, currentRecordId, field_id, value) {
558
- return {
559
- [dsSessionP]: {
560
- [currentRecordId]: {
561
- [field_id]: value,
562
- },
563
- },
564
- };
565
- };
566
- func.runtime.bind.resolve_field = async function (SESSION_ID, prog_id, dsSessionP, field_id) {
567
- let _prog_id = prog_id;
568
- let _dsP = dsSessionP;
569
- let is_dynamic_field = false;
570
- let field_prop;
571
-
572
- const find_in_view = async function (field_id, prog_id) {
573
- const view_ret = await func.utils.VIEWS_OBJ.get(SESSION_ID, prog_id);
574
- if (!view_ret) {
575
- return null;
576
- }
577
- return func.common.find_item_by_key(view_ret.progFields, 'field_id', field_id);
578
- };
579
-
580
- if (['_FOR_VAL', '_FOR_KEY'].includes(field_id)) {
581
- is_dynamic_field = true;
582
- field_prop = SESSION_OBJ[SESSION_ID]?.DS_GLB?.[_dsP]?.dynamic_fields?.[field_id];
583
- } else {
584
- field_prop = await find_in_view(field_id, _prog_id);
585
- if (!field_prop) {
586
- const ret_get_value = await func.datasource.get_value(SESSION_ID, field_id, _dsP);
587
- if (ret_get_value.found) {
588
- _dsP = ret_get_value.dsSessionP;
589
- let _ds = SESSION_OBJ[SESSION_ID].DS_GLB[_dsP];
590
- _prog_id = _ds.prog_id;
591
- field_prop = await find_in_view(field_id, _prog_id);
592
- }
593
- }
594
- }
595
-
596
- if (!field_prop) {
597
- throw `field ${field_id} not found in the program scope`;
598
- }
599
-
600
- return {
601
- bind_field_id: field_id,
602
- field_prop,
603
- is_dynamic_field,
604
- dsSessionP: _dsP,
605
- prog_id: _prog_id,
606
- };
607
- };
608
- func.runtime.bind.get_field_type = function (field_prop) {
609
- return field_prop?.props?.fieldType;
610
- };
611
- func.runtime.bind.toggle_array_value = function (arr_value_before_cast, value_from_getter) {
612
- if (arr_value_before_cast.includes(value_from_getter)) {
613
- return arr_value_before_cast.filter((item) => !_.isEqual(item, value_from_getter));
614
- }
615
- arr_value_before_cast.push(value_from_getter);
616
- return arr_value_before_cast;
617
- };
618
- func.runtime.bind.get_cast_value = async function (SESSION_ID, field_prop, input_field_type, raw_value) {
619
- const field_type = func.runtime.bind.get_field_type(field_prop);
620
- var value = await func.common.get_cast_val(SESSION_ID, 'xu-bind', 'value', field_type, raw_value);
621
- if (field_type === 'object') {
622
- value = await func.common.get_cast_val(SESSION_ID, 'xu-bind', 'value', input_field_type, raw_value);
623
- }
624
- return value;
625
- };
626
- func.runtime.bind.get_source_value = function (_ds, bind_field_id, is_dynamic_field) {
627
- if (is_dynamic_field) {
628
- return _ds.dynamic_fields[bind_field_id].value;
629
- }
630
- const row_idx = func.common.find_ROWID_idx(_ds, _ds.currentRecordId);
631
- return _ds.data_feed.rows?.[row_idx]?.[bind_field_id];
632
- };
633
- func.runtime.bind.format_display_value = function ($elm, field_prop, bind_field_id, expression_value, value, input_field_type) {
634
- const field_type = func.runtime.bind.get_field_type(field_prop);
635
- const elm_value = $elm.attr('value');
636
-
637
- if (field_type === 'array' && input_field_type === 'checkbox' && elm_value) {
638
- return value.includes(elm_value);
639
- }
640
- if (field_type === 'array' && input_field_type === 'radio' && elm_value) {
641
- if (value.includes(elm_value)) {
642
- return elm_value;
643
- }
644
- return false;
645
- }
646
- if (field_type === 'object' && expression_value.split('.').length > 1) {
647
- let str = expression_value.replace(bind_field_id, '(' + JSON.stringify(value) + ')');
648
- return eval(str);
649
- }
650
- return value;
651
- };
652
- func.runtime.bind.update_reference_source_array = async function (options) {
653
- const field_type = func.runtime.bind.get_field_type(options.field_prop);
654
- const reference_source_obj = options.iterate_info?.reference_source_obj;
655
- if (!reference_source_obj || reference_source_obj.ret.type !== 'array' || options.iterate_info?.iterator_val !== options.bind_field_id) {
656
- return false;
657
- }
658
-
659
- const arr_idx = Number(options.iterate_info._key);
660
- const dataset_arr = await func.datasource.get_value(options.SESSION_ID, reference_source_obj.fieldIdP, options.dsSessionP, reference_source_obj.currentRecordId);
661
- let new_arr = _.cloneDeep(dataset_arr.ret.value);
662
-
663
- if (field_type === 'object' && options.val_is_reference_field) {
664
- let obj_item = new_arr[arr_idx];
665
- let e_exp = options.expression_value.replace(options.bind_field_id, 'obj_item');
666
- eval(e_exp + (options.input_field_type === 'string' ? `="${options.value}"` : `=${options.value}`));
667
- new_arr[arr_idx] = obj_item;
668
- } else {
669
- new_arr[arr_idx] = options.value;
670
- }
671
-
672
- let datasource_changes = func.runtime.bind.build_datasource_changes(options.dsSessionP, options.currentRecordId, reference_source_obj.fieldIdP, new_arr);
673
- await func.datasource.update(options.SESSION_ID, datasource_changes, null, true);
674
- return true;
675
- };
676
- func.runtime.resources.load_cdn = async function (SESSION_ID, resource) {
677
- let normalized_resource = resource;
678
- if (!_.isObject(normalized_resource) && _.isString(normalized_resource)) {
679
- normalized_resource = { src: normalized_resource, type: 'js' };
680
- }
681
- if (!_.isObject(normalized_resource)) {
682
- throw new Error('cdn resource in wrong format');
683
- }
684
-
685
- return new Promise(async (resolve) => {
686
- try {
687
- switch (normalized_resource.type) {
688
- case 'js':
689
- await func.utils.load_js_on_demand(normalized_resource.src);
690
- break;
691
- case 'css':
692
- await func.utils.load_js_on_demand(normalized_resource.src);
693
- break;
694
- case 'module':
695
- func.utils.load_js_on_demand(normalized_resource.src, 'module');
696
- break;
697
- default:
698
- await func.utils.load_js_on_demand(normalized_resource.src);
699
- break;
700
- }
701
- resolve();
702
- } catch (error) {
703
- func.utils.debug_report(SESSION_ID, 'xu-cdn', 'Fail to load: ' + normalized_resource, 'W');
704
- resolve();
705
- }
706
- });
707
- };
708
- func.runtime.resources.get_plugin_manifest_entry = function (_session, plugin_name) {
709
- return APP_OBJ[_session.app_id]?.app_plugins_purchased?.[plugin_name] || null;
710
- };
711
- func.runtime.resources.get_plugin_module_path = function (plugin, resource) {
712
- const manifest_entry = plugin?.manifest?.[resource];
713
- return `${manifest_entry?.dist ? 'dist/' : ''}${resource}`;
714
- };
715
- func.runtime.resources.get_plugin_module_url = async function (SESSION_ID, plugin_name, plugin, resource) {
716
- return await func.utils.get_plugin_npm_cdn(SESSION_ID, plugin_name, func.runtime.resources.get_plugin_module_path(plugin, resource));
717
- };
718
- func.runtime.resources.load_plugin_runtime_css = async function (SESSION_ID, plugin_name, plugin) {
719
- if (!plugin?.manifest?.['runtime.mjs']?.dist || !plugin?.manifest?.['runtime.mjs']?.css) {
720
- return false;
721
- }
722
- const plugin_runtime_css_url = await func.utils.get_plugin_npm_cdn(SESSION_ID, plugin_name, 'dist/runtime.css');
723
- func.utils.load_css_on_demand(plugin_runtime_css_url);
724
- return true;
725
- };
726
- func.runtime.resources.resolve_plugin_properties = async function (SESSION_ID, dsSessionP, attributes, properties) {
727
- let resolved_properties = _.cloneDeep(properties);
728
- for await (let [prop_name, prop_val] of Object.entries(resolved_properties || {})) {
729
- prop_val.value = attributes?.[prop_name];
730
- if (attributes?.[`xu-exp:${prop_name}`]) {
731
- const res = await func.expression.get(SESSION_ID, attributes[`xu-exp:${prop_name}`], dsSessionP, 'UI Attr EXP');
732
- prop_val.value = res.result;
733
- }
734
- }
735
- return resolved_properties;
736
- };
737
- func.runtime.resources.run_ui_plugin = async function (SESSION_ID, paramsP, $elm, plugin_name, value) {
738
- var _session = SESSION_OBJ[SESSION_ID];
739
- const plugin = func.runtime.resources.get_plugin_manifest_entry(_session, plugin_name);
740
- if (!plugin?.installed || !plugin?.manifest?.['runtime.mjs']?.exist || !plugin?.manifest?.['index.mjs']?.exist || !value?.enabled) {
741
- return false;
742
- }
743
-
744
- await func.runtime.resources.load_plugin_runtime_css(SESSION_ID, plugin_name, plugin);
745
-
746
- const plugin_index_src = await func.runtime.resources.get_plugin_module_url(SESSION_ID, plugin_name, plugin, 'index.mjs');
747
- const plugin_index_resources = await import(plugin_index_src);
748
- const properties = await func.runtime.resources.resolve_plugin_properties(SESSION_ID, paramsP.dsSessionP, value?.attributes, plugin_index_resources.properties);
749
-
750
- const plugin_runtime_src = await func.runtime.resources.get_plugin_module_url(SESSION_ID, plugin_name, plugin, 'runtime.mjs');
751
- const plugin_runtime_resources = await import(plugin_runtime_src);
752
-
753
- if (plugin_runtime_resources.cdn && _.isArray(plugin_runtime_resources.cdn)) {
754
- for await (const resource of plugin_runtime_resources.cdn) {
755
- await func.runtime.resources.load_cdn(SESSION_ID, resource);
756
- }
757
- }
758
-
759
- if (plugin_runtime_resources.fn) {
760
- await plugin_runtime_resources.fn(plugin_name, $elm?.[0], properties);
761
- }
762
- return true;
763
- };
764
- func.runtime.widgets.create_context = function (SESSION_ID, paramsP, prop) {
765
- const _session = SESSION_OBJ[SESSION_ID];
766
- const plugin_name = prop['xu-widget'];
767
- return {
768
- SESSION_ID,
769
- _session,
770
- plugin_name,
771
- method: prop['xu-method'] || '_default',
772
- dsP: paramsP.dsSessionP,
773
- propsP: prop,
774
- sourceP: 'widgets',
775
- plugin: APP_OBJ[_session.app_id]?.app_plugins_purchased?.[plugin_name] || null,
776
- };
777
- };
778
- func.runtime.widgets.report_error = function (context, descP, warn) {
779
- const program = context?._session?.DS_GLB?.[context.dsP];
780
- if (!program) {
781
- return null;
782
- }
783
- func.utils.debug.log(context.SESSION_ID, program.prog_id + '_' + program.callingMenuId, {
784
- module: 'widgets',
785
- action: 'Init',
786
- source: context.sourceP,
787
- prop: descP,
788
- details: descP,
789
- result: null,
790
- error: warn ? false : true,
791
- fields: null,
792
- type: 'widgets',
793
- prog_id: program.prog_id,
794
- });
795
- return null;
796
- };
797
- func.runtime.widgets.get_property_value = async function (context, fieldIdP, val, props) {
798
- if (!val) return;
799
- var value = fieldIdP in props ? props[fieldIdP] : typeof val.defaultValue === 'function' ? val?.defaultValue?.() : val?.defaultValue;
800
- if (val.render === 'eventId') {
801
- value = props?.[fieldIdP]?.event;
802
- }
803
-
804
- if (props[`xu-exp:${fieldIdP}`]) {
805
- value = (await func.expression.get(context.SESSION_ID, props[`xu-exp:${fieldIdP}`], context.dsP, 'widget property')).result;
806
- }
807
-
808
- return func.common.get_cast_val(
809
- context.SESSION_ID,
810
- 'widgets',
811
- fieldIdP,
812
- val.type,
813
- value,
814
- null,
815
- );
816
- };
817
- func.runtime.widgets.get_fields_data = async function (context, fields, props) {
818
- var data_obj = {};
819
- var return_code = 1;
820
- for await (const [key, val] of Object.entries(fields || {})) {
821
- data_obj[key] = await func.runtime.widgets.get_property_value(context, key, val, props);
822
- if (!data_obj[key] && val.mandatory) {
823
- return_code = -1;
824
- func.runtime.widgets.report_error(context, `${key} is a mandatory field.`);
825
- break;
826
- }
827
- }
828
- for await (const key of ['xu-bind']) {
829
- data_obj[key] = await func.runtime.widgets.get_property_value(context, key, props?.[key], props);
830
- }
831
-
832
- return { code: return_code, data: data_obj };
833
- };
834
- func.runtime.widgets.get_resource_path = function (context, resource) {
835
- if (context._session.worker_type === 'Dev') {
836
- return `../../plugins/${context.plugin_name}/${resource}`;
837
- }
838
- const manifest_entry = context.plugin?.manifest?.[resource];
839
- const dist_prefix = manifest_entry?.dist ? 'dist/' : '';
840
- return `https://${context._session.domain}/plugins/${context.plugin_name}/${dist_prefix}${resource}?gtp_token=${context._session.gtp_token}&app_id=${context._session.app_id}`;
841
- };
842
- func.runtime.widgets.load_css_style = function (context) {
843
- func.utils.load_css_on_demand(func.runtime.widgets.get_resource_path(context, 'style.css'));
844
- return true;
845
- };
846
- func.runtime.widgets.get_resource = async function (context, resource) {
847
- const manifest_entry = context.plugin?.manifest?.[resource];
848
- const path = `${manifest_entry?.dist ? 'dist/' : ''}${resource}`;
849
- return await func.utils.get_plugin_resource(context.SESSION_ID, context.plugin_name, path);
850
- };
851
- func.runtime.widgets.get_methods = async function (context) {
852
- const index = await func.runtime.widgets.get_resource(context, 'index.mjs');
853
- return index?.methods || {};
854
- };
855
- func.runtime.widgets.load_runtime_css = async function (context) {
856
- if (!context.plugin?.manifest?.['runtime.mjs']?.dist || !context.plugin?.manifest?.['runtime.mjs']?.css) {
857
- return false;
858
- }
859
- const plugin_runtime_css_url = await func.utils.get_plugin_npm_cdn(context.SESSION_ID, context.plugin_name, 'dist/runtime.css');
860
- func.utils.load_css_on_demand(plugin_runtime_css_url);
861
- return true;
862
- };
863
- func.runtime.widgets.build_params = function (context, $containerP, plugin_setup, api_utils, extra = {}) {
864
- return {
865
- SESSION_ID: context.SESSION_ID,
866
- method: context.method,
867
- _session: context._session,
868
- dsP: context.dsP,
869
- sourceP: context.sourceP,
870
- propsP: context.propsP,
871
- plugin_name: context.plugin_name,
872
- $containerP,
873
- plugin_setup,
874
- report_error: function (descP, warn) {
875
- return func.runtime.widgets.report_error(context, descP, warn);
876
- },
877
- call_plugin_api: async function (plugin_nameP, dataP) {
878
- return await func.utils.call_plugin_api(context.SESSION_ID, plugin_nameP, dataP);
879
- },
880
- api_utils,
881
- ...extra,
882
- };
883
- };
884
26
  func.common.find_item_by_key = function (arr, key, val) {
885
27
  return _.find(arr, function (e) {
886
28
  return e.data[key] === val;
@@ -1269,10 +411,19 @@ func.common.db = async function (SESSION_ID, serviceP, dataP, opt = {}, dsSessio
1269
411
  };
1270
412
 
1271
413
  func.common.getJsonFromUrl = function () {
1272
- return func.runtime.env.get_url_params();
414
+ const queryString = window.location.search;
415
+ const urlParams = new URLSearchParams(queryString);
416
+ return urlParams;
1273
417
  };
1274
418
  func.common.getParametersFromUrl = function () {
1275
- return func.runtime.env.get_url_parameters_object();
419
+ const searchParams = new URLSearchParams(window.location.search);
420
+ const parameters = {};
421
+
422
+ for (const [key, value] of searchParams.entries()) {
423
+ parameters[key] = value;
424
+ }
425
+
426
+ return parameters;
1276
427
  };
1277
428
 
1278
429
  func.common.getObjectFromUrl = function (url, element_attributes_obj, embed_params_obj) {
@@ -2657,23 +1808,6 @@ func.datasource.execute = async function (SESSION_ID, dataSourceSession, IS_DATA
2657
1808
  let prog_obj = await func.utils.VIEWS_OBJ.get(SESSION_ID, _ds.prog_id);
2658
1809
 
2659
1810
  const callback_datasource = async function () {
2660
- const run_on_load_events = async function () {
2661
- if (!(await func.datasource.get_view_events_count(SESSION_ID, dataSourceSession, 'on_load'))) {
2662
- return false;
2663
- }
2664
- await func.datasource.execute_view_events(SESSION_ID, dataSourceSession, 'on_load');
2665
- return true;
2666
- };
2667
- const schedule_panel_on_load_events = function () {
2668
- setTimeout(async function () {
2669
- try {
2670
- await run_on_load_events();
2671
- } catch (error) {
2672
- console.error(error);
2673
- }
2674
- }, 0);
2675
- };
2676
-
2677
1811
  if (typeof IS_WORKER === 'undefined' && typeof IS_DOCKER === 'undefined' && typeof IS_PROCESS_SERVER === 'undefined' && _ds.viewSourceProp === 'globals') {
2678
1812
  if (!['main'].includes(_session.opt.app_computing_mode)) {
2679
1813
  await func.index.call_worker(SESSION_ID, {
@@ -2683,13 +1817,10 @@ func.datasource.execute = async function (SESSION_ID, dataSourceSession, IS_DATA
2683
1817
  }
2684
1818
  }
2685
1819
 
2686
- if (args.is_panelP) {
2687
- const callback_ret = await func.datasource.callback(SESSION_ID, dataSourceSession, args.rowIdP, args.jobNoP, _ds.prog_id);
2688
- schedule_panel_on_load_events();
2689
- return callback_ret;
1820
+ if (await func.datasource.get_view_events_count(SESSION_ID, dataSourceSession, 'on_load')) {
1821
+ await func.datasource.execute_view_events(SESSION_ID, dataSourceSession, 'on_load');
2690
1822
  }
2691
-
2692
- await run_on_load_events();
1823
+ // }
2693
1824
  return await func.datasource.callback(SESSION_ID, dataSourceSession, args.rowIdP, args.jobNoP, _ds.prog_id);
2694
1825
  };
2695
1826
 
@@ -4104,13 +3235,13 @@ func.datasource.update = async function (SESSION_ID, datasource_changes, update_
4104
3235
  });
4105
3236
  }
4106
3237
 
4107
- await func.runtime.ui.refresh_screen({
3238
+ await func.UI.screen.refresh_screen(
4108
3239
  SESSION_ID,
4109
- fields_changed_arr: klona.klona(fields_changed),
4110
- datasource_changed: datasource_changed[0],
4111
- fields_changed_datasource: datasource_changed[0],
4112
- watcher: value,
4113
- });
3240
+ klona.klona(fields_changed), // _.cloneDeep(fields_changed),
3241
+ datasource_changed[0],
3242
+ datasource_changed[0], // refresh the current datasource only
3243
+ value,
3244
+ );
4114
3245
  }
4115
3246
 
4116
3247
  continue;
@@ -4219,23 +3350,14 @@ func.datasource.update = async function (SESSION_ID, datasource_changes, update_
4219
3350
  }
4220
3351
 
4221
3352
  // await func.UI.screen.refresh_xu_attributes(SESSION_ID, _.cloneDeep(fields_changed), null, null, findMin(datasource_changed), avoid_xu_for_refresh, trigger);
4222
- await func.runtime.ui.refresh_xu_attributes({
4223
- SESSION_ID,
4224
- fields_arr: klona.klona(fields_changed),
4225
- jobNoP: null,
4226
- $elm_to_search: null,
4227
- dsSession_changed: findMin(datasource_changed),
4228
- avoid_xu_for_refresh,
4229
- trigger,
4230
- ignore_screen_blocker: true,
4231
- });
3353
+ await func.UI.screen.refresh_xu_attributes(SESSION_ID, klona.klona(fields_changed), null, null, findMin(datasource_changed), avoid_xu_for_refresh, trigger);
4232
3354
  // await removed from the below function cause to dead lock Mar 3 25
4233
- await func.runtime.ui.refresh_screen({
3355
+ await func.UI.screen.refresh_screen(
4234
3356
  SESSION_ID,
4235
- fields_changed_arr: klona.klona(fields_changed),
4236
- datasource_changed: null,
4237
- fields_changed_datasource: datasource_changed[0],
4238
- });
3357
+ klona.klona(fields_changed), // _.cloneDeep(fields_changed),
3358
+ null,
3359
+ datasource_changed[0], // refresh the current datasource only
3360
+ );
4239
3361
  }
4240
3362
  // ///// REFRESH PARAMETERS IN
4241
3363
  // if (fields_changed.length) {
@@ -7663,20 +6785,7 @@ func.events.execute = async function (
7663
6785
  }
7664
6786
 
7665
6787
  const params_obj = await get_params_obj();
7666
- return await func.runtime.ui.init_screen({
7667
- SESSION_ID,
7668
- prog_id: await get_prog_id(),
7669
- sourceScreenP: $(containerP)?.data()?.xuData.screenId,
7670
- callingDataSource_objP: _session.DS_GLB[dsSession],
7671
- $callingContainerP: $calling_container,
7672
- triggerIdP: eventIdP,
7673
- rowIdP: rowP,
7674
- jobNoP,
7675
- is_panelP: is_panel,
7676
- parameters_obj_inP: params_obj,
7677
- source_functionP: functionP,
7678
- call_screen_propertiesP: args.call_screen_propertiesP,
7679
- });
6788
+ return await func.UI.screen.init(SESSION_ID, await get_prog_id(), $(containerP)?.data()?.xuData.screenId, _session.DS_GLB[dsSession], $calling_container, eventIdP, rowP, jobNoP, is_panel, params_obj, functionP, args.call_screen_propertiesP);
7680
6789
  },
7681
6790
  call_modal: async function () {
7682
6791
  return await fx.Call_window();
@@ -8374,19 +7483,7 @@ func.events.execute_PENDING_OPEN_URL_EVENTS = async function () {
8374
7483
  let screen_ret = await func.utils.get_screen_obj(SESSION_ID, params_obj.prog);
8375
7484
 
8376
7485
  if (screen_ret) {
8377
- await func.runtime.ui.init_screen({
8378
- SESSION_ID,
8379
- prog_id: params_obj.prog,
8380
- sourceScreenP: null,
8381
- callingDataSource_objP: null,
8382
- $callingContainerP: $('#embed_' + SESSION_ID),
8383
- triggerIdP: null,
8384
- rowIdP: null,
8385
- jobNoP: null,
8386
- is_panelP: null,
8387
- parameters_obj_inP: null,
8388
- source_functionP: 'pendingUrlEvent_embed',
8389
- });
7486
+ await func.UI.screen.init(SESSION_ID, params_obj.prog, null, null, $('#embed_' + SESSION_ID), null, null, null, null, null, 'pendingUrlEvent_embed');
8390
7487
  } else {
8391
7488
  console.error('Program not exist', params_obj.prog_id);
8392
7489
  func.UI.utils.progressScreen.show(SESSION_ID, 'Program not exist', null, true);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xuda.io/xuda-worker-bundle",
3
- "version": "1.3.2589",
3
+ "version": "1.3.2590",
4
4
  "description": "xuda framework",
5
5
  "main": "index.js",
6
6
  "scripts": {