@wavemaker/app-ng-runtime 11.14.1-18.6421 → 11.14.1-18.6427

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 (76) hide show
  1. package/components/base/bundles/index.umd.js +17 -81
  2. package/components/base/esm2022/pipes/custom-pipes.mjs +10 -10
  3. package/components/base/esm2022/utils/widget-utils.mjs +3 -3
  4. package/components/base/esm2022/widgets/common/base/base.component.mjs +6 -61
  5. package/components/base/esm2022/widgets/common/lazy-load/lazy-load.directive.mjs +3 -7
  6. package/components/base/esm2022/widgets/framework/property-change-handler.mjs +2 -7
  7. package/components/base/fesm2022/index.mjs +18 -82
  8. package/components/base/fesm2022/index.mjs.map +1 -1
  9. package/components/base/pipes/custom-pipes.d.ts +5 -5
  10. package/components/basic/label/bundles/index.umd.js +1 -9
  11. package/components/basic/label/esm2022/label.directive.mjs +2 -10
  12. package/components/basic/label/fesm2022/index.mjs +1 -9
  13. package/components/basic/label/fesm2022/index.mjs.map +1 -1
  14. package/components/chart/bundles/index.umd.js +2 -2
  15. package/components/chart/esm2022/chart.utils.mjs +3 -3
  16. package/components/chart/fesm2022/index.mjs +2 -2
  17. package/components/chart/fesm2022/index.mjs.map +1 -1
  18. package/components/containers/wizard/bundles/index.umd.js +2 -21
  19. package/components/containers/wizard/esm2022/wizard-step/wizard-step.component.mjs +1 -3
  20. package/components/containers/wizard/esm2022/wizard.component.mjs +3 -20
  21. package/components/containers/wizard/fesm2022/index.mjs +2 -21
  22. package/components/containers/wizard/fesm2022/index.mjs.map +1 -1
  23. package/components/containers/wizard/wizard-step/wizard-step.component.d.ts +0 -2
  24. package/components/data/pagination/bundles/index.umd.js +0 -4
  25. package/components/data/pagination/esm2022/pagination.component.mjs +1 -5
  26. package/components/data/pagination/fesm2022/index.mjs +0 -4
  27. package/components/data/pagination/fesm2022/index.mjs.map +1 -1
  28. package/components/data/table/bundles/index.umd.js +14 -370
  29. package/components/data/table/esm2022/table-action/table-action.directive.mjs +1 -8
  30. package/components/data/table/esm2022/table-column/table-column.directive.mjs +3 -107
  31. package/components/data/table/esm2022/table-column-group/table-column-group.directive.mjs +1 -9
  32. package/components/data/table/esm2022/table-cud.directive.mjs +2 -8
  33. package/components/data/table/esm2022/table-filter.directive.mjs +2 -12
  34. package/components/data/table/esm2022/table-row/table-row.directive.mjs +1 -8
  35. package/components/data/table/esm2022/table-row-action/table-row-action.directive.mjs +1 -8
  36. package/components/data/table/esm2022/table.component.mjs +12 -219
  37. package/components/data/table/fesm2022/index.mjs +15 -371
  38. package/components/data/table/fesm2022/index.mjs.map +1 -1
  39. package/components/data/table/table-action/table-action.directive.d.ts +2 -3
  40. package/components/data/table/table-column/table-column.directive.d.ts +2 -3
  41. package/components/data/table/table-column-group/table-column-group.directive.d.ts +2 -3
  42. package/components/data/table/table-cud.directive.d.ts +1 -3
  43. package/components/data/table/table-filter.directive.d.ts +1 -3
  44. package/components/data/table/table-row/table-row.directive.d.ts +2 -3
  45. package/components/data/table/table-row-action/table-row-action.directive.d.ts +2 -3
  46. package/components/data/table/table.component.d.ts +2 -6
  47. package/components/navigation/menu/bundles/index.umd.js +0 -5
  48. package/components/navigation/menu/esm2022/menu.component.mjs +1 -6
  49. package/components/navigation/menu/fesm2022/index.mjs +0 -5
  50. package/components/navigation/menu/fesm2022/index.mjs.map +1 -1
  51. package/components/navigation/popover/bundles/index.umd.js +6 -6
  52. package/components/navigation/popover/esm2022/popover.component.mjs +4 -4
  53. package/components/navigation/popover/fesm2022/index.mjs +3 -3
  54. package/components/navigation/popover/fesm2022/index.mjs.map +1 -1
  55. package/components/navigation/popover/popover.component.d.ts +0 -6
  56. package/core/bundles/index.umd.js +15 -120
  57. package/core/esm2022/public_api.mjs +2 -2
  58. package/core/esm2022/utils/utils.mjs +2 -6
  59. package/core/esm2022/utils/watcher.mjs +15 -118
  60. package/core/fesm2022/index.mjs +15 -124
  61. package/core/fesm2022/index.mjs.map +1 -1
  62. package/core/public_api.d.ts +1 -1
  63. package/core/utils/utils.d.ts +0 -1
  64. package/npm-shrinkwrap.json +2 -2
  65. package/package-lock.json +2 -2
  66. package/package.json +1 -1
  67. package/runtime/base/bundles/index.umd.js +2 -3
  68. package/runtime/base/esm2022/components/base-page.component.mjs +1 -2
  69. package/runtime/base/esm2022/services/pipe-provider.service.mjs +4 -4
  70. package/runtime/base/fesm2022/index.mjs +2 -3
  71. package/runtime/base/fesm2022/index.mjs.map +1 -1
  72. package/runtime/dynamic/bundles/index.umd.js +0 -4
  73. package/runtime/dynamic/esm2022/app/app.config.mjs +2 -6
  74. package/runtime/dynamic/fesm2022/index.mjs +1 -5
  75. package/runtime/dynamic/fesm2022/index.mjs.map +1 -1
  76. package/scripts/datatable/datatable.js +15 -103
@@ -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, 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, 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';
@@ -190,7 +190,7 @@ const getImageUrl = (urlString, shouldEncode, defaultUrl) => {
190
190
  urlString = (defaultUrl || 'resources/images/imagelists/default-image.png');
191
191
  }
192
192
  }
193
- if (urlString && !_WM_APP_PROJECT.isPreview && !isValidImageUrl(urlString) && !urlString.startsWith(_WM_APP_PROJECT.cdnUrl) && !urlString.startsWith('services')) {
193
+ if (urlString && !_WM_APP_PROJECT.isPreview && !isValidWebURL(urlString) && !urlString.startsWith(_WM_APP_PROJECT.cdnUrl)) {
194
194
  urlString = (_WM_APP_PROJECT.cdnUrl || '') + urlString;
195
195
  }
196
196
  urlString = shouldEncode ? encodeUrl(urlString) : urlString;
@@ -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,25 +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
- // Don't re-throw - allow execution to continue (e.g., navigation should still work)
2528
- // Return undefined to indicate error was handled
2529
- return undefined;
2497
+ console.error(e);
2530
2498
  }
2531
2499
  };
2532
2500
  if (child && !child.widget.eventHandlers)
@@ -2550,17 +2518,11 @@ class BaseComponent {
2550
2518
  if (!child)
2551
2519
  this.initState.delete(propName);
2552
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;
2553
- // OPTIMIZATION: Apply throttling for non-critical properties
2554
- const watchConfig = widgetProps.get(propName) || {};
2555
- const throttledProps = ['class', 'style', 'ngclass', 'ngstyle'];
2556
- if (throttledProps.includes(propName.toLowerCase())) {
2557
- watchConfig.throttle = 100; // Throttle to 100ms for style/class properties
2558
- }
2559
2521
  this.registerDestroyListener($watch(expr, viewParent, context, nv => {
2560
2522
  if (propName.startsWith('base-') && widget.updateData)
2561
2523
  widget.updateData(propName, nv);
2562
2524
  widget[propName] = nv;
2563
- }, getWatchIdentifier(widgetId, propName), propName === 'datasource', watchConfig, () => isMuted));
2525
+ }, getWatchIdentifier(widgetId, propName), propName === 'datasource', widgetProps.get(propName), () => isMuted));
2564
2526
  }
2565
2527
  /**
2566
2528
  * Remove watch on the bound property
@@ -2579,19 +2541,7 @@ class BaseComponent {
2579
2541
  const fn = callbackInfo.callback;
2580
2542
  const locals = callbackInfo.locals || {};
2581
2543
  if (fn) {
2582
- try {
2583
- return fn(Object.assign(locals, extraLocals));
2584
- }
2585
- catch (error) {
2586
- // Log error with context information for debugging
2587
- const widgetName = this.name || this.widgetId || 'unknown';
2588
- const errorMessage = error?.message || String(error);
2589
- console.error(`Error executing event callback "${eventName}" on widget "${widgetName}":`, errorMessage);
2590
- console.error('Full error:', error);
2591
- // Don't re-throw - allow execution to continue (e.g., navigation should still work)
2592
- // Return undefined to indicate error was handled
2593
- return undefined;
2594
- }
2544
+ return fn(Object.assign(locals, extraLocals));
2595
2545
  }
2596
2546
  }
2597
2547
  }
@@ -2811,16 +2761,6 @@ class BaseComponent {
2811
2761
  this.propertyChange.complete();
2812
2762
  this.destroy.complete();
2813
2763
  this.isAttached = false;
2814
- // MEMORY LEAK FIX: Clear context to release references to parent scope data
2815
- // The context object holds references to repeater items, wizard steps, etc.
2816
- // which can retain large amounts of data even after component destruction
2817
- if (this.context) {
2818
- // Clear all properties from context
2819
- Object.keys(this.context).forEach(key => {
2820
- delete this.context[key];
2821
- });
2822
- this.context = null;
2823
- }
2824
2764
  }
2825
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)); }; }
2826
2766
  static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: BaseComponent, factory: BaseComponent.ɵfac }); }
@@ -4375,14 +4315,14 @@ class ToDatePipe extends WmPipe {
4375
4315
  }
4376
4316
  return this.returnFn('', arguments, this.app.Variables);
4377
4317
  }
4378
- constructor(datePipe, i18nService, app, customPipeManager) {
4318
+ constructor(datePipe, i18nService, customPipeManager) {
4379
4319
  super('toDate', customPipeManager);
4380
4320
  this.datePipe = datePipe;
4381
4321
  this.i18nService = i18nService;
4382
- this.app = app;
4383
4322
  this.customPipeManager = customPipeManager;
4323
+ this.app = inject(App);
4384
4324
  }
4385
- static { this.ɵfac = function ToDatePipe_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ToDatePipe)(i0.ɵɵdirectiveInject(i1$1.DatePipe, 16), i0.ɵɵdirectiveInject(i1.AbstractI18nService, 16), i0.ɵɵdirectiveInject(i1.App, 16), i0.ɵɵdirectiveInject(i1.CustomPipeManager, 16)); }; }
4325
+ static { this.ɵfac = function ToDatePipe_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ToDatePipe)(i0.ɵɵdirectiveInject(i1$1.DatePipe, 16), i0.ɵɵdirectiveInject(i1.AbstractI18nService, 16), i0.ɵɵdirectiveInject(i1.CustomPipeManager, 16)); }; }
4386
4326
  static { this.ɵpipe = /*@__PURE__*/ i0.ɵɵdefinePipe({ name: "toDate", type: ToDatePipe, pure: true, standalone: true }); }
4387
4327
  }
4388
4328
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ToDatePipe, [{
@@ -4391,7 +4331,7 @@ class ToDatePipe extends WmPipe {
4391
4331
  standalone: true,
4392
4332
  name: 'toDate'
4393
4333
  }]
4394
- }], () => [{ type: i1$1.DatePipe }, { type: i1.AbstractI18nService }, { type: i1.App }, { type: i1.CustomPipeManager }], null); })();
4334
+ }], () => [{ type: i1$1.DatePipe }, { type: i1.AbstractI18nService }, { type: i1.CustomPipeManager }], null); })();
4395
4335
  class ToNumberPipe {
4396
4336
  transform(data, fracSize) {
4397
4337
  if (fracSize && !String(fracSize).match(/^(\d+)?\.((\d+)(-(\d+))?)?$/)) {
@@ -4479,9 +4419,9 @@ class SuffixPipe {
4479
4419
  * Custom pipe: It is work as interceptor between the user custom pipe function and angular pipe
4480
4420
  */
4481
4421
  class CustomPipe {
4482
- constructor(app, custmeUserPipe) {
4483
- this.app = app;
4422
+ constructor(custmeUserPipe) {
4484
4423
  this.custmeUserPipe = custmeUserPipe;
4424
+ this.app = inject(App);
4485
4425
  }
4486
4426
  transform(data, pipename) {
4487
4427
  let argumentArr = [];
@@ -4501,7 +4441,7 @@ class CustomPipe {
4501
4441
  return data;
4502
4442
  }
4503
4443
  }
4504
- static { this.ɵfac = function CustomPipe_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CustomPipe)(i0.ɵɵdirectiveInject(i1.App, 16), i0.ɵɵdirectiveInject(i1.CustomPipeManager, 16)); }; }
4444
+ static { this.ɵfac = function CustomPipe_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CustomPipe)(i0.ɵɵdirectiveInject(i1.CustomPipeManager, 16)); }; }
4505
4445
  static { this.ɵpipe = /*@__PURE__*/ i0.ɵɵdefinePipe({ name: "custom", type: CustomPipe, pure: true, standalone: true }); }
4506
4446
  }
4507
4447
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CustomPipe, [{
@@ -4510,7 +4450,7 @@ class CustomPipe {
4510
4450
  standalone: true,
4511
4451
  name: 'custom'
4512
4452
  }]
4513
- }], () => [{ type: i1.App }, { type: i1.CustomPipeManager }], null); })();
4453
+ }], () => [{ type: i1.CustomPipeManager }], null); })();
4514
4454
  class TimeFromNowPipe {
4515
4455
  transform(data) {
4516
4456
  let timestamp;
@@ -5079,16 +5019,12 @@ class LazyLoadDirective {
5079
5019
  this.unSubscribeFn = $watch(expr, this.viewParent, this.context, (val) => {
5080
5020
  if (!this.embeddedView && val) {
5081
5021
  this.embeddedView = this.viewContainer.createEmbeddedView(this.templateRef, this.context);
5082
- if (this.unSubscribeFn && typeof this.unSubscribeFn === 'function') {
5083
- this.unSubscribeFn();
5084
- }
5022
+ this.unSubscribeFn();
5085
5023
  }
5086
5024
  });
5087
5025
  }
5088
5026
  ngOnDestroy() {
5089
- if (this.unSubscribeFn && typeof this.unSubscribeFn === 'function') {
5090
- this.unSubscribeFn();
5091
- }
5027
+ this.unSubscribeFn();
5092
5028
  }
5093
5029
  static { this.ɵfac = function LazyLoadDirective_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || LazyLoadDirective)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i0.TemplateRef), i0.ɵɵdirectiveInject(i0.ViewContainerRef), i0.ɵɵdirectiveInject('EXPLICIT_CONTEXT', 8)); }; }
5094
5030
  static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: LazyLoadDirective, selectors: [["", "lazyLoad", ""]], inputs: { lazyLoad: "lazyLoad" }, standalone: true }); }