@wavemaker/app-ng-runtime 11.14.1-3.6306 → 11.14.1-6.6324

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 (44) hide show
  1. package/components/base/bundles/index.umd.js +7 -75
  2. package/components/base/esm2022/pipes/custom-pipes.mjs +1 -1
  3. package/components/base/esm2022/widgets/common/base/base.component.mjs +7 -68
  4. package/components/base/esm2022/widgets/common/lazy-load/lazy-load.directive.mjs +2 -4
  5. package/components/base/esm2022/widgets/framework/property-change-handler.mjs +2 -7
  6. package/components/base/fesm2022/index.mjs +8 -76
  7. package/components/base/fesm2022/index.mjs.map +1 -1
  8. package/components/basic/label/bundles/index.umd.js +1 -9
  9. package/components/basic/label/esm2022/label.directive.mjs +2 -10
  10. package/components/basic/label/fesm2022/index.mjs +1 -9
  11. package/components/basic/label/fesm2022/index.mjs.map +1 -1
  12. package/components/data/table/bundles/index.umd.js +11 -218
  13. package/components/data/table/esm2022/table.component.mjs +12 -219
  14. package/components/data/table/fesm2022/index.mjs +11 -218
  15. package/components/data/table/fesm2022/index.mjs.map +1 -1
  16. package/components/data/table/table.component.d.ts +2 -6
  17. package/components/navigation/menu/bundles/index.umd.js +0 -5
  18. package/components/navigation/menu/esm2022/menu.component.mjs +1 -6
  19. package/components/navigation/menu/fesm2022/index.mjs +0 -5
  20. package/components/navigation/menu/fesm2022/index.mjs.map +1 -1
  21. package/components/navigation/popover/bundles/index.umd.js +6 -6
  22. package/components/navigation/popover/esm2022/popover.component.mjs +4 -4
  23. package/components/navigation/popover/fesm2022/index.mjs +3 -3
  24. package/components/navigation/popover/fesm2022/index.mjs.map +1 -1
  25. package/components/navigation/popover/popover.component.d.ts +0 -6
  26. package/core/bundles/index.umd.js +82 -326
  27. package/core/esm2022/public_api.mjs +2 -2
  28. package/core/esm2022/utils/watcher.mjs +81 -323
  29. package/core/fesm2022/index.mjs +84 -326
  30. package/core/fesm2022/index.mjs.map +1 -1
  31. package/core/public_api.d.ts +1 -1
  32. package/core/utils/watcher.d.ts +5 -26
  33. package/npm-shrinkwrap.json +2 -2
  34. package/package-lock.json +2 -2
  35. package/package.json +1 -1
  36. package/runtime/base/bundles/index.umd.js +0 -35
  37. package/runtime/base/esm2022/components/app-component/app.component.mjs +2 -7
  38. package/runtime/base/esm2022/components/base-page.component.mjs +2 -9
  39. package/runtime/base/esm2022/components/base-partial.component.mjs +2 -10
  40. package/runtime/base/esm2022/components/base-prefab.component.mjs +2 -10
  41. package/runtime/base/esm2022/components/base-spa-page.component.mjs +2 -9
  42. package/runtime/base/fesm2022/index.mjs +1 -36
  43. package/runtime/base/fesm2022/index.mjs.map +1 -1
  44. package/scripts/datatable/datatable.js +2 -19
@@ -1,5 +1,5 @@
1
1
  import * as i1 from '@wm/core';
2
- import { FormWidgetType, checkIsCustomPipeExpression, $parseExpr, isValidWebURL, _WM_APP_PROJECT, isValidImageUrl, encodeUrl, stringStartsWith, prettifyLabel, deHyphenate, initCaps, getClonedObject, DataSource, debounce, processFilterExpBindNode, isDefined, MatchMode, $parseEvent, isEqualWithFields, getFormattedDate, isAndroid, isNumberType, DataType, setCSS, IDGenerator, toBoolean, isChangeFromWatch, $unwatch, resetChangeFromWatch, isObject as isObject$1, toDimension, $appDigest, removeClass, addClass, setCSSFromObj, App, findParent, setAttr, switchClass, removeAttr, $invokeWatchers, $watch, $unwatchAll, findValueOf, validateAccessRoles, ComponentType, noop as noop$1, VALIDATOR, isIos, isMobile, hasOffsetStr, AbstractI18nService, CURRENCY_INFO, replace as replace$1, transformFileURI, isLargeTabletLandscape, isLargeTabletPortrait } from '@wm/core';
2
+ import { FormWidgetType, checkIsCustomPipeExpression, $parseExpr, isValidWebURL, _WM_APP_PROJECT, isValidImageUrl, encodeUrl, stringStartsWith, prettifyLabel, deHyphenate, initCaps, getClonedObject, DataSource, debounce, processFilterExpBindNode, isDefined, MatchMode, $parseEvent, isEqualWithFields, getFormattedDate, isAndroid, isNumberType, DataType, setCSS, IDGenerator, toBoolean, isChangeFromWatch, $unwatch, resetChangeFromWatch, isObject as isObject$1, toDimension, $appDigest, removeClass, addClass, setCSSFromObj, App, findParent, setAttr, switchClass, removeAttr, $invokeWatchers, $watch, findValueOf, validateAccessRoles, ComponentType, noop as noop$1, VALIDATOR, isIos, isMobile, hasOffsetStr, AbstractI18nService, CURRENCY_INFO, replace as replace$1, transformFileURI, isLargeTabletLandscape, isLargeTabletPortrait } from '@wm/core';
3
3
  import * as i0 from '@angular/core';
4
4
  import { InjectionToken, forwardRef, ElementRef, inject, ViewContainerRef, Injector, Injectable, Inject, Optional, Directive, Self, ContentChildren, Attribute, Input, Component, Pipe, SecurityContext } from '@angular/core';
5
5
  import { createFocusTrap } from '@wavemaker/focus-trap';
@@ -1994,12 +1994,7 @@ const parseValue = (key, value, type) => {
1994
1994
  return toBoolean(value, isBooleanAttr(key) && key);
1995
1995
  }
1996
1996
  if (type === PROP_TYPE.NUMBER) {
1997
- const numValue = +value;
1998
- // Fix NaN for tabindex - default to 0 if value is invalid
1999
- if (key === 'tabindex' && isNaN(numValue)) {
2000
- return value === null || value === undefined || value === '' ? 0 : numValue;
2001
- }
2002
- return numValue;
1997
+ return +value;
2003
1998
  }
2004
1999
  return value;
2005
2000
  };
@@ -2323,26 +2318,10 @@ class BaseComponent {
2323
2318
  this.propertyChange.subscribe(({ key, nv, ov }) => fn(key, nv, ov));
2324
2319
  }
2325
2320
  registerDestroyListener(fn, ctx) {
2326
- if (!fn) {
2327
- return;
2328
- }
2329
2321
  if (ctx) {
2330
2322
  fn = fn.bind(ctx);
2331
2323
  }
2332
- this.destroy.subscribe(() => { }, () => { }, () => {
2333
- try {
2334
- if (fn && typeof fn === 'function') {
2335
- fn();
2336
- }
2337
- }
2338
- catch (e) {
2339
- // Silently handle cleanup errors to prevent test failures
2340
- // These are typically non-critical cleanup issues like:
2341
- // - Subscriptions already unsubscribed
2342
- // - Null references during cleanup
2343
- // - Components already destroyed
2344
- }
2345
- });
2324
+ this.destroy.subscribe(() => { }, () => { }, () => fn());
2346
2325
  }
2347
2326
  getDisplayType() {
2348
2327
  return this.displayType;
@@ -2508,24 +2487,14 @@ class BaseComponent {
2508
2487
  // the promise returned by the variable call.
2509
2488
  boundFnVal = boundFn();
2510
2489
  if (boundFnVal instanceof Promise) {
2511
- return boundFnVal.then(response => response, err => {
2512
- const widgetName = widget.name || widget.widgetId || 'unknown';
2513
- console.error(`Error in promise returned by event callback "${eventName}" on widget "${widgetName}":`, err);
2514
- return err;
2515
- });
2490
+ return boundFnVal.then(response => response, err => err);
2516
2491
  }
2517
2492
  else {
2518
2493
  return boundFnVal;
2519
2494
  }
2520
2495
  }
2521
2496
  catch (e) {
2522
- // Enhanced error logging with context
2523
- const widgetName = widget.name || widget.widgetId || 'unknown';
2524
- const errorMessage = e.message || String(e);
2525
- console.error(`Error executing event callback "${eventName}" on widget "${widgetName}":`, errorMessage);
2526
- console.error('Event expression context:', { eventName, widgetName, locals });
2527
- // Re-throw to maintain original behavior but with better context
2528
- throw e;
2497
+ console.error(e);
2529
2498
  }
2530
2499
  };
2531
2500
  if (child && !child.widget.eventHandlers)
@@ -2549,17 +2518,11 @@ class BaseComponent {
2549
2518
  if (!child)
2550
2519
  this.initState.delete(propName);
2551
2520
  let viewParent = child ? child.widget.viewParent.viewParent : this.viewParent, context = child ? child.widget.context : this.context, widget = child ? child.widget : this.widget, isMuted = child ? child.widget.isMuted : this.isMuted, widgetProps = child ? child.widget.widgetProps : this.widgetProps, widgetId = child ? child.widget.widgetId : this.widgetId;
2552
- // OPTIMIZATION: Apply throttling for non-critical properties
2553
- const watchConfig = widgetProps.get(propName) || {};
2554
- const throttledProps = ['class', 'style', 'ngclass', 'ngstyle'];
2555
- if (throttledProps.includes(propName.toLowerCase())) {
2556
- watchConfig.throttle = 100; // Throttle to 100ms for style/class properties
2557
- }
2558
2521
  this.registerDestroyListener($watch(expr, viewParent, context, nv => {
2559
2522
  if (propName.startsWith('base-') && widget.updateData)
2560
2523
  widget.updateData(propName, nv);
2561
2524
  widget[propName] = nv;
2562
- }, getWatchIdentifier(widgetId, propName), propName === 'datasource', watchConfig, () => isMuted));
2525
+ }, getWatchIdentifier(widgetId, propName), propName === 'datasource', widgetProps.get(propName), () => isMuted));
2563
2526
  }
2564
2527
  /**
2565
2528
  * Remove watch on the bound property
@@ -2578,18 +2541,7 @@ class BaseComponent {
2578
2541
  const fn = callbackInfo.callback;
2579
2542
  const locals = callbackInfo.locals || {};
2580
2543
  if (fn) {
2581
- try {
2582
- return fn(Object.assign(locals, extraLocals));
2583
- }
2584
- catch (error) {
2585
- // Log error with context information for debugging
2586
- const widgetName = this.name || this.widgetId || 'unknown';
2587
- const errorMessage = error?.message || String(error);
2588
- console.error(`Error executing event callback "${eventName}" on widget "${widgetName}":`, errorMessage);
2589
- console.error('Full error:', error);
2590
- // Re-throw to maintain original behavior but with better error context
2591
- throw error;
2592
- }
2544
+ return fn(Object.assign(locals, extraLocals));
2593
2545
  }
2594
2546
  }
2595
2547
  }
@@ -2809,24 +2761,6 @@ class BaseComponent {
2809
2761
  this.propertyChange.complete();
2810
2762
  this.destroy.complete();
2811
2763
  this.isAttached = false;
2812
- // MEMORY LEAK FIX: Unwatch all watchers for this widget
2813
- // This ensures all watchers registered for this component are cleaned up
2814
- if (this.widgetId) {
2815
- const removedCount = $unwatchAll(this.widgetId);
2816
- if (removedCount > 0) {
2817
- console.log(`🧹 Cleaned up ${removedCount} watcher(s) for widget ${this.widgetId}`);
2818
- }
2819
- }
2820
- // MEMORY LEAK FIX: Clear context to release references to parent scope data
2821
- // The context object holds references to repeater items, wizard steps, etc.
2822
- // which can retain large amounts of data even after component destruction
2823
- if (this.context) {
2824
- // Clear all properties from context
2825
- Object.keys(this.context).forEach(key => {
2826
- delete this.context[key];
2827
- });
2828
- this.context = null;
2829
- }
2830
2764
  }
2831
2765
  static { this.ɵfac = function BaseComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || BaseComponent)(i0.ɵɵinject(i0.Injector), i0.ɵɵinject(WidgetConfig), i0.ɵɵinject('EXPLICIT_CONTEXT', 8), i0.ɵɵinject(Promise)); }; }
2832
2766
  static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: BaseComponent, factory: BaseComponent.ɵfac }); }
@@ -5085,9 +5019,7 @@ class LazyLoadDirective {
5085
5019
  this.unSubscribeFn = $watch(expr, this.viewParent, this.context, (val) => {
5086
5020
  if (!this.embeddedView && val) {
5087
5021
  this.embeddedView = this.viewContainer.createEmbeddedView(this.templateRef, this.context);
5088
- if (this.unSubscribeFn && typeof this.unSubscribeFn === 'function') {
5089
- this.unSubscribeFn();
5090
- }
5022
+ this.unSubscribeFn();
5091
5023
  }
5092
5024
  });
5093
5025
  }