@xuda.io/runtime-bundle 1.0.1422 → 1.0.1424

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.
@@ -1988,6 +1988,13 @@ func.runtime.session.create_state = function (SESSION_ID, options) {
1988
1988
  func.runtime.workers.ensure_registry(SESSION_ID);
1989
1989
  return SESSION_OBJ[SESSION_ID];
1990
1990
  };
1991
+ func.runtime.session.is_slim = function (SESSION_ID) {
1992
+ const session = typeof SESSION_ID === 'undefined' || SESSION_ID === null ? null : SESSION_OBJ?.[SESSION_ID];
1993
+ if (session && typeof session.SLIM_BUNDLE !== 'undefined') {
1994
+ return !!session.SLIM_BUNDLE;
1995
+ }
1996
+ return !!glb.SLIM_BUNDLE;
1997
+ };
1991
1998
  func.runtime.session.set_default_value = function (_session, key, value) {
1992
1999
  _session[key] = value || func.runtime.env.get_default_session_value(key);
1993
2000
  return _session[key];
@@ -2239,6 +2246,135 @@ func.runtime.bind.build_datasource_changes = function (dsSessionP, currentRecord
2239
2246
  },
2240
2247
  };
2241
2248
  };
2249
+ func.runtime.bind.get_native_adapter = function () {
2250
+ const has_explicit_value = function (elm) {
2251
+ return !!elm?.hasAttribute?.('value');
2252
+ };
2253
+ const get_listener_event = function (elm) {
2254
+ const tag_name = elm?.tagName?.toLowerCase?.();
2255
+ const type = (elm?.type || '').toLowerCase();
2256
+
2257
+ if (tag_name === 'select' || ['checkbox', 'radio'].includes(type)) {
2258
+ return 'change';
2259
+ }
2260
+ return 'input';
2261
+ };
2262
+
2263
+ return {
2264
+ getter: function (elm) {
2265
+ if (!elm) {
2266
+ return undefined;
2267
+ }
2268
+
2269
+ const tag_name = elm?.tagName?.toLowerCase?.();
2270
+ const type = (elm?.type || '').toLowerCase();
2271
+
2272
+ if (tag_name === 'select' && elm.multiple) {
2273
+ return Array.from(elm.options || [])
2274
+ .filter(function (option) {
2275
+ return option.selected;
2276
+ })
2277
+ .map(function (option) {
2278
+ return option.value;
2279
+ });
2280
+ }
2281
+
2282
+ if (type === 'checkbox') {
2283
+ return has_explicit_value(elm) ? elm.value : !!elm.checked;
2284
+ }
2285
+
2286
+ if (type === 'radio') {
2287
+ return elm.value;
2288
+ }
2289
+
2290
+ return typeof elm.value !== 'undefined' ? elm.value : undefined;
2291
+ },
2292
+ setter: function (elm, value) {
2293
+ if (!elm) {
2294
+ return false;
2295
+ }
2296
+
2297
+ const tag_name = elm?.tagName?.toLowerCase?.();
2298
+ const type = (elm?.type || '').toLowerCase();
2299
+
2300
+ if (tag_name === 'select' && elm.multiple) {
2301
+ const selected_values = Array.isArray(value)
2302
+ ? value.map(function (item) {
2303
+ return String(item);
2304
+ })
2305
+ : [String(value)];
2306
+ Array.from(elm.options || []).forEach(function (option) {
2307
+ option.selected = selected_values.includes(String(option.value));
2308
+ });
2309
+ return true;
2310
+ }
2311
+
2312
+ if (type === 'checkbox' || type === 'radio') {
2313
+ return true;
2314
+ }
2315
+
2316
+ if (typeof elm.value !== 'undefined') {
2317
+ elm.value = value === null || typeof value === 'undefined' ? '' : String(value);
2318
+ }
2319
+ return true;
2320
+ },
2321
+ listener: function (elm, handler) {
2322
+ if (!elm?.addEventListener || typeof handler !== 'function') {
2323
+ return false;
2324
+ }
2325
+
2326
+ const event_name = get_listener_event(elm);
2327
+ const listener_key = '__xuda_native_bind_listener_' + event_name;
2328
+ if (elm[listener_key]) {
2329
+ elm.removeEventListener(event_name, elm[listener_key]);
2330
+ }
2331
+ elm.addEventListener(event_name, handler);
2332
+ elm[listener_key] = handler;
2333
+ return true;
2334
+ },
2335
+ };
2336
+ };
2337
+ func.runtime.bind.is_valid_adapter = function (adapter) {
2338
+ return !!(
2339
+ adapter &&
2340
+ typeof adapter.getter === 'function' &&
2341
+ typeof adapter.setter === 'function' &&
2342
+ typeof adapter.listener === 'function'
2343
+ );
2344
+ };
2345
+ func.runtime.bind.get_adapter = function (SESSION_ID) {
2346
+ const native_adapter = func.runtime.bind.get_native_adapter();
2347
+ if (func.runtime.session.is_slim(SESSION_ID)) {
2348
+ return native_adapter;
2349
+ }
2350
+
2351
+ const plugin_bind = UI_FRAMEWORK_PLUGIN?.bind;
2352
+ if (!plugin_bind) {
2353
+ return native_adapter;
2354
+ }
2355
+
2356
+ if (func.runtime.bind.is_valid_adapter(plugin_bind)) {
2357
+ return plugin_bind;
2358
+ }
2359
+
2360
+ if (typeof plugin_bind === 'function') {
2361
+ try {
2362
+ const bind_instance = new plugin_bind();
2363
+ if (func.runtime.bind.is_valid_adapter(bind_instance)) {
2364
+ return bind_instance;
2365
+ }
2366
+ } catch (error) {}
2367
+
2368
+ try {
2369
+ const bind_factory = plugin_bind();
2370
+ if (func.runtime.bind.is_valid_adapter(bind_factory)) {
2371
+ return bind_factory;
2372
+ }
2373
+ } catch (error) {}
2374
+ }
2375
+
2376
+ return native_adapter;
2377
+ };
2242
2378
  func.runtime.bind.resolve_field = async function (SESSION_ID, prog_id, dsSessionP, field_id, iterate_info) {
2243
2379
  let _prog_id = prog_id;
2244
2380
  let _dsP = dsSessionP;
@@ -8908,7 +9044,10 @@ func.runtime.ui.find_in_root = function (SESSION_ID, selector) {
8908
9044
  };
8909
9045
  func.runtime.ui.get_root_tag_name = function () {
8910
9046
  let root_tag_name = 'div';
8911
- if (typeof glb.SLIM_BUNDLE === 'undefined' && !glb.SLIM_BUNDLE) {
9047
+ if (!func.runtime.session.is_slim()) {
9048
+ if (typeof UI_FRAMEWORK_PLUGIN?.core !== 'function') {
9049
+ return root_tag_name;
9050
+ }
8912
9051
  const ui_plugin_core = new UI_FRAMEWORK_PLUGIN.core();
8913
9052
  root_tag_name = ui_plugin_core?.rootTagName() || root_tag_name;
8914
9053
  }
@@ -12735,6 +12874,12 @@ func.runtime.ui.close_modal_session = async function (SESSION_ID, modal_id) {
12735
12874
  func.runtime.ui.render_screen_type = async function (options) {
12736
12875
  const $div_content = func.runtime.ui.get_children(options.$div);
12737
12876
  func.runtime.ui.sync_child_parent_container(options.$div);
12877
+ const assert_framework_screen_supported = function (screen_type) {
12878
+ if (!func.runtime.session.is_slim(options.SESSION_ID)) {
12879
+ return;
12880
+ }
12881
+ throw new Error('Slim mode does not support "' + screen_type + '" screens without a UI framework plugin');
12882
+ };
12738
12883
 
12739
12884
  let $ret = options.$div;
12740
12885
  let $nav = func.runtime.ui.get_nav(options.SESSION_ID);
@@ -12742,6 +12887,7 @@ func.runtime.ui.render_screen_type = async function (options) {
12742
12887
 
12743
12888
  switch (options.paramsP.screen_type) {
12744
12889
  case 'modal': {
12890
+ assert_framework_screen_supported('modal');
12745
12891
  params = func.runtime.ui.build_modal_params(options.paramsP, options.$div, options.$container, options.close_modal);
12746
12892
  const modal_id = params.modal_id;
12747
12893
  func.runtime.ui.set_modal_params(options.SESSION_ID, modal_id, params);
@@ -12758,6 +12904,7 @@ func.runtime.ui.render_screen_type = async function (options) {
12758
12904
  }
12759
12905
 
12760
12906
  case 'popover': {
12907
+ assert_framework_screen_supported('popover');
12761
12908
  const xu_popover_controller = func.UI.component.create_app_popover_component(options.SESSION_ID);
12762
12909
  params = func.runtime.ui.build_popover_params(options.paramsP, options.$div, options.$container);
12763
12910
 
@@ -12772,6 +12919,7 @@ func.runtime.ui.render_screen_type = async function (options) {
12772
12919
  }
12773
12920
 
12774
12921
  case 'page': {
12922
+ assert_framework_screen_supported('page');
12775
12923
  const nav = func.runtime.ui.get_first_node($nav);
12776
12924
 
12777
12925
  params = func.runtime.ui.build_page_params(options.SESSION_ID, options.paramsP, $div_content, options.$container, nav);
@@ -17375,7 +17523,7 @@ func.runtime.render.handle_xu_bind = async function (options) {
17375
17523
  return {};
17376
17524
  }
17377
17525
 
17378
- const bind = new UI_FRAMEWORK_PLUGIN.bind();
17526
+ const bind = func.runtime.bind.get_adapter(options.SESSION_ID);
17379
17527
  const field_changed = async function () {
17380
17528
  const _ds = SESSION_OBJ[options.SESSION_ID].DS_GLB[_dsP];
17381
17529
  const field_type = func.runtime.bind.get_field_type(field_prop);
@@ -20010,6 +20158,25 @@ func.expression.get = async function (SESSION_ID, valP, dsSessionP, sourceP, row
20010
20158
 
20011
20159
  // var split = [];
20012
20160
  var var_Arr = [];
20161
+ const get_iterate_value_ret = function (fieldIdP) {
20162
+ if (!iterate_info || (iterate_info.iterator_key !== fieldIdP && iterate_info.iterator_val !== fieldIdP)) {
20163
+ return null;
20164
+ }
20165
+
20166
+ const iter_value = iterate_info.iterator_key === fieldIdP ? iterate_info._key : iterate_info._val;
20167
+ const iter_type = typeof iter_value !== 'undefined' ? {}.toString.call(iter_value).match(/\s([a-zA-Z]+)/)[1].toLowerCase() : 'string';
20168
+
20169
+ return {
20170
+ ret: {
20171
+ value: iter_value,
20172
+ type: iter_type,
20173
+ prop: ['array', 'object'].includes(iter_type) ? iter_value : null,
20174
+ },
20175
+ fieldIdP,
20176
+ currentRecordId: rowIdP,
20177
+ found: typeof iter_value !== 'undefined',
20178
+ };
20179
+ };
20013
20180
  const split = func.expression.parse(ret) || [];
20014
20181
  // console.log(valP, split);
20015
20182
  const split_entries = Object.entries(split);
@@ -20106,7 +20273,7 @@ func.expression.get = async function (SESSION_ID, valP, dsSessionP, sourceP, row
20106
20273
  } // put default
20107
20274
  fields[val.fieldId] = var_Arr[key].value;
20108
20275
 
20109
- const ret = await func.datasource.get_value(SESSION_ID, val.fieldId, dsSessionP, rowIdP); // find field in dataSources
20276
+ const ret = get_iterate_value_ret(val.fieldId) || (await func.datasource.get_value(SESSION_ID, val.fieldId, dsSessionP, rowIdP)); // find field in dataSources
20110
20277
 
20111
20278
  await replace_value_in_string(ret.ret, ret.fieldIdP);
20112
20279
  }
@@ -22433,13 +22600,22 @@ func.index.call_worker = async function (SESSION_ID, obj, params, promiseP) {
22433
22600
  };
22434
22601
 
22435
22602
  func.index.init_SCREEN_BLOCKER = async function (SESSION_ID) {
22603
+ const get_loader = async function () {
22604
+ if (func.runtime.session.is_slim(SESSION_ID) || typeof UI_FRAMEWORK_PLUGIN?.loader !== 'function') {
22605
+ return {
22606
+ dismiss: function () {},
22607
+ };
22608
+ }
22609
+ return await UI_FRAMEWORK_PLUGIN.loader(LOADER_TEXT);
22610
+ };
22611
+
22436
22612
  setInterval(async function () {
22437
22613
  if (glb.CURRENT_APP_LOADING || (!LOADER_ACTIVE && xu_isEmpty(SCREEN_BLOCKER_OBJ))) {
22438
22614
  return;
22439
22615
  }
22440
22616
  glb.CURRENT_APP_LOADING = 1;
22441
22617
 
22442
- const loader = await UI_FRAMEWORK_PLUGIN.loader(LOADER_TEXT);
22618
+ const loader = await get_loader();
22443
22619
 
22444
22620
  glb.CURRENT_APP_LOADING = loader;
22445
22621
 
@@ -1914,6 +1914,13 @@ func.runtime.session.create_state = function (SESSION_ID, options) {
1914
1914
  func.runtime.workers.ensure_registry(SESSION_ID);
1915
1915
  return SESSION_OBJ[SESSION_ID];
1916
1916
  };
1917
+ func.runtime.session.is_slim = function (SESSION_ID) {
1918
+ const session = typeof SESSION_ID === 'undefined' || SESSION_ID === null ? null : SESSION_OBJ?.[SESSION_ID];
1919
+ if (session && typeof session.SLIM_BUNDLE !== 'undefined') {
1920
+ return !!session.SLIM_BUNDLE;
1921
+ }
1922
+ return !!glb.SLIM_BUNDLE;
1923
+ };
1917
1924
  func.runtime.session.set_default_value = function (_session, key, value) {
1918
1925
  _session[key] = value || func.runtime.env.get_default_session_value(key);
1919
1926
  return _session[key];
@@ -2165,6 +2172,135 @@ func.runtime.bind.build_datasource_changes = function (dsSessionP, currentRecord
2165
2172
  },
2166
2173
  };
2167
2174
  };
2175
+ func.runtime.bind.get_native_adapter = function () {
2176
+ const has_explicit_value = function (elm) {
2177
+ return !!elm?.hasAttribute?.('value');
2178
+ };
2179
+ const get_listener_event = function (elm) {
2180
+ const tag_name = elm?.tagName?.toLowerCase?.();
2181
+ const type = (elm?.type || '').toLowerCase();
2182
+
2183
+ if (tag_name === 'select' || ['checkbox', 'radio'].includes(type)) {
2184
+ return 'change';
2185
+ }
2186
+ return 'input';
2187
+ };
2188
+
2189
+ return {
2190
+ getter: function (elm) {
2191
+ if (!elm) {
2192
+ return undefined;
2193
+ }
2194
+
2195
+ const tag_name = elm?.tagName?.toLowerCase?.();
2196
+ const type = (elm?.type || '').toLowerCase();
2197
+
2198
+ if (tag_name === 'select' && elm.multiple) {
2199
+ return Array.from(elm.options || [])
2200
+ .filter(function (option) {
2201
+ return option.selected;
2202
+ })
2203
+ .map(function (option) {
2204
+ return option.value;
2205
+ });
2206
+ }
2207
+
2208
+ if (type === 'checkbox') {
2209
+ return has_explicit_value(elm) ? elm.value : !!elm.checked;
2210
+ }
2211
+
2212
+ if (type === 'radio') {
2213
+ return elm.value;
2214
+ }
2215
+
2216
+ return typeof elm.value !== 'undefined' ? elm.value : undefined;
2217
+ },
2218
+ setter: function (elm, value) {
2219
+ if (!elm) {
2220
+ return false;
2221
+ }
2222
+
2223
+ const tag_name = elm?.tagName?.toLowerCase?.();
2224
+ const type = (elm?.type || '').toLowerCase();
2225
+
2226
+ if (tag_name === 'select' && elm.multiple) {
2227
+ const selected_values = Array.isArray(value)
2228
+ ? value.map(function (item) {
2229
+ return String(item);
2230
+ })
2231
+ : [String(value)];
2232
+ Array.from(elm.options || []).forEach(function (option) {
2233
+ option.selected = selected_values.includes(String(option.value));
2234
+ });
2235
+ return true;
2236
+ }
2237
+
2238
+ if (type === 'checkbox' || type === 'radio') {
2239
+ return true;
2240
+ }
2241
+
2242
+ if (typeof elm.value !== 'undefined') {
2243
+ elm.value = value === null || typeof value === 'undefined' ? '' : String(value);
2244
+ }
2245
+ return true;
2246
+ },
2247
+ listener: function (elm, handler) {
2248
+ if (!elm?.addEventListener || typeof handler !== 'function') {
2249
+ return false;
2250
+ }
2251
+
2252
+ const event_name = get_listener_event(elm);
2253
+ const listener_key = '__xuda_native_bind_listener_' + event_name;
2254
+ if (elm[listener_key]) {
2255
+ elm.removeEventListener(event_name, elm[listener_key]);
2256
+ }
2257
+ elm.addEventListener(event_name, handler);
2258
+ elm[listener_key] = handler;
2259
+ return true;
2260
+ },
2261
+ };
2262
+ };
2263
+ func.runtime.bind.is_valid_adapter = function (adapter) {
2264
+ return !!(
2265
+ adapter &&
2266
+ typeof adapter.getter === 'function' &&
2267
+ typeof adapter.setter === 'function' &&
2268
+ typeof adapter.listener === 'function'
2269
+ );
2270
+ };
2271
+ func.runtime.bind.get_adapter = function (SESSION_ID) {
2272
+ const native_adapter = func.runtime.bind.get_native_adapter();
2273
+ if (func.runtime.session.is_slim(SESSION_ID)) {
2274
+ return native_adapter;
2275
+ }
2276
+
2277
+ const plugin_bind = UI_FRAMEWORK_PLUGIN?.bind;
2278
+ if (!plugin_bind) {
2279
+ return native_adapter;
2280
+ }
2281
+
2282
+ if (func.runtime.bind.is_valid_adapter(plugin_bind)) {
2283
+ return plugin_bind;
2284
+ }
2285
+
2286
+ if (typeof plugin_bind === 'function') {
2287
+ try {
2288
+ const bind_instance = new plugin_bind();
2289
+ if (func.runtime.bind.is_valid_adapter(bind_instance)) {
2290
+ return bind_instance;
2291
+ }
2292
+ } catch (error) {}
2293
+
2294
+ try {
2295
+ const bind_factory = plugin_bind();
2296
+ if (func.runtime.bind.is_valid_adapter(bind_factory)) {
2297
+ return bind_factory;
2298
+ }
2299
+ } catch (error) {}
2300
+ }
2301
+
2302
+ return native_adapter;
2303
+ };
2168
2304
  func.runtime.bind.resolve_field = async function (SESSION_ID, prog_id, dsSessionP, field_id, iterate_info) {
2169
2305
  let _prog_id = prog_id;
2170
2306
  let _dsP = dsSessionP;
@@ -8834,7 +8970,10 @@ func.runtime.ui.find_in_root = function (SESSION_ID, selector) {
8834
8970
  };
8835
8971
  func.runtime.ui.get_root_tag_name = function () {
8836
8972
  let root_tag_name = 'div';
8837
- if (typeof glb.SLIM_BUNDLE === 'undefined' && !glb.SLIM_BUNDLE) {
8973
+ if (!func.runtime.session.is_slim()) {
8974
+ if (typeof UI_FRAMEWORK_PLUGIN?.core !== 'function') {
8975
+ return root_tag_name;
8976
+ }
8838
8977
  const ui_plugin_core = new UI_FRAMEWORK_PLUGIN.core();
8839
8978
  root_tag_name = ui_plugin_core?.rootTagName() || root_tag_name;
8840
8979
  }
@@ -12661,6 +12800,12 @@ func.runtime.ui.close_modal_session = async function (SESSION_ID, modal_id) {
12661
12800
  func.runtime.ui.render_screen_type = async function (options) {
12662
12801
  const $div_content = func.runtime.ui.get_children(options.$div);
12663
12802
  func.runtime.ui.sync_child_parent_container(options.$div);
12803
+ const assert_framework_screen_supported = function (screen_type) {
12804
+ if (!func.runtime.session.is_slim(options.SESSION_ID)) {
12805
+ return;
12806
+ }
12807
+ throw new Error('Slim mode does not support "' + screen_type + '" screens without a UI framework plugin');
12808
+ };
12664
12809
 
12665
12810
  let $ret = options.$div;
12666
12811
  let $nav = func.runtime.ui.get_nav(options.SESSION_ID);
@@ -12668,6 +12813,7 @@ func.runtime.ui.render_screen_type = async function (options) {
12668
12813
 
12669
12814
  switch (options.paramsP.screen_type) {
12670
12815
  case 'modal': {
12816
+ assert_framework_screen_supported('modal');
12671
12817
  params = func.runtime.ui.build_modal_params(options.paramsP, options.$div, options.$container, options.close_modal);
12672
12818
  const modal_id = params.modal_id;
12673
12819
  func.runtime.ui.set_modal_params(options.SESSION_ID, modal_id, params);
@@ -12684,6 +12830,7 @@ func.runtime.ui.render_screen_type = async function (options) {
12684
12830
  }
12685
12831
 
12686
12832
  case 'popover': {
12833
+ assert_framework_screen_supported('popover');
12687
12834
  const xu_popover_controller = func.UI.component.create_app_popover_component(options.SESSION_ID);
12688
12835
  params = func.runtime.ui.build_popover_params(options.paramsP, options.$div, options.$container);
12689
12836
 
@@ -12698,6 +12845,7 @@ func.runtime.ui.render_screen_type = async function (options) {
12698
12845
  }
12699
12846
 
12700
12847
  case 'page': {
12848
+ assert_framework_screen_supported('page');
12701
12849
  const nav = func.runtime.ui.get_first_node($nav);
12702
12850
 
12703
12851
  params = func.runtime.ui.build_page_params(options.SESSION_ID, options.paramsP, $div_content, options.$container, nav);
@@ -17301,7 +17449,7 @@ func.runtime.render.handle_xu_bind = async function (options) {
17301
17449
  return {};
17302
17450
  }
17303
17451
 
17304
- const bind = new UI_FRAMEWORK_PLUGIN.bind();
17452
+ const bind = func.runtime.bind.get_adapter(options.SESSION_ID);
17305
17453
  const field_changed = async function () {
17306
17454
  const _ds = SESSION_OBJ[options.SESSION_ID].DS_GLB[_dsP];
17307
17455
  const field_type = func.runtime.bind.get_field_type(field_prop);
@@ -20701,6 +20849,25 @@ func.expression.get = async function (SESSION_ID, valP, dsSessionP, sourceP, row
20701
20849
 
20702
20850
  // var split = [];
20703
20851
  var var_Arr = [];
20852
+ const get_iterate_value_ret = function (fieldIdP) {
20853
+ if (!iterate_info || (iterate_info.iterator_key !== fieldIdP && iterate_info.iterator_val !== fieldIdP)) {
20854
+ return null;
20855
+ }
20856
+
20857
+ const iter_value = iterate_info.iterator_key === fieldIdP ? iterate_info._key : iterate_info._val;
20858
+ const iter_type = typeof iter_value !== 'undefined' ? {}.toString.call(iter_value).match(/\s([a-zA-Z]+)/)[1].toLowerCase() : 'string';
20859
+
20860
+ return {
20861
+ ret: {
20862
+ value: iter_value,
20863
+ type: iter_type,
20864
+ prop: ['array', 'object'].includes(iter_type) ? iter_value : null,
20865
+ },
20866
+ fieldIdP,
20867
+ currentRecordId: rowIdP,
20868
+ found: typeof iter_value !== 'undefined',
20869
+ };
20870
+ };
20704
20871
  const split = func.expression.parse(ret) || [];
20705
20872
  // console.log(valP, split);
20706
20873
  const split_entries = Object.entries(split);
@@ -20797,7 +20964,7 @@ func.expression.get = async function (SESSION_ID, valP, dsSessionP, sourceP, row
20797
20964
  } // put default
20798
20965
  fields[val.fieldId] = var_Arr[key].value;
20799
20966
 
20800
- const ret = await func.datasource.get_value(SESSION_ID, val.fieldId, dsSessionP, rowIdP); // find field in dataSources
20967
+ const ret = get_iterate_value_ret(val.fieldId) || (await func.datasource.get_value(SESSION_ID, val.fieldId, dsSessionP, rowIdP)); // find field in dataSources
20801
20968
 
20802
20969
  await replace_value_in_string(ret.ret, ret.fieldIdP);
20803
20970
  }
@@ -22359,13 +22526,22 @@ func.index.call_worker = async function (SESSION_ID, obj, params, promiseP) {
22359
22526
  };
22360
22527
 
22361
22528
  func.index.init_SCREEN_BLOCKER = async function (SESSION_ID) {
22529
+ const get_loader = async function () {
22530
+ if (func.runtime.session.is_slim(SESSION_ID) || typeof UI_FRAMEWORK_PLUGIN?.loader !== 'function') {
22531
+ return {
22532
+ dismiss: function () {},
22533
+ };
22534
+ }
22535
+ return await UI_FRAMEWORK_PLUGIN.loader(LOADER_TEXT);
22536
+ };
22537
+
22362
22538
  setInterval(async function () {
22363
22539
  if (glb.CURRENT_APP_LOADING || (!LOADER_ACTIVE && xu_isEmpty(SCREEN_BLOCKER_OBJ))) {
22364
22540
  return;
22365
22541
  }
22366
22542
  glb.CURRENT_APP_LOADING = 1;
22367
22543
 
22368
- const loader = await UI_FRAMEWORK_PLUGIN.loader(LOADER_TEXT);
22544
+ const loader = await get_loader();
22369
22545
 
22370
22546
  glb.CURRENT_APP_LOADING = loader;
22371
22547