@wavemaker/app-ng-runtime 11.14.0-rc.6276 → 11.14.1-3.6306
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.
- package/components/base/bundles/index.umd.js +89 -17
- package/components/base/esm2022/pipes/custom-pipes.mjs +10 -10
- package/components/base/esm2022/utils/widget-utils.mjs +5 -3
- package/components/base/esm2022/widgets/common/base/base.component.mjs +68 -7
- package/components/base/esm2022/widgets/common/lazy-load/lazy-load.directive.mjs +7 -3
- package/components/base/esm2022/widgets/framework/property-change-handler.mjs +7 -2
- package/components/base/fesm2022/index.mjs +90 -18
- package/components/base/fesm2022/index.mjs.map +1 -1
- package/components/base/pipes/custom-pipes.d.ts +5 -5
- package/components/basic/label/bundles/index.umd.js +9 -1
- package/components/basic/label/esm2022/label.directive.mjs +10 -2
- package/components/basic/label/fesm2022/index.mjs +9 -1
- package/components/basic/label/fesm2022/index.mjs.map +1 -1
- package/components/data/table/bundles/index.umd.js +218 -11
- package/components/data/table/esm2022/table.component.mjs +219 -12
- package/components/data/table/fesm2022/index.mjs +218 -11
- package/components/data/table/fesm2022/index.mjs.map +1 -1
- package/components/data/table/table.component.d.ts +6 -2
- package/components/dialogs/default/bundles/index.umd.js +21 -18
- package/components/dialogs/default/dialog-header/dialog-header.component.d.ts +4 -1
- package/components/dialogs/default/esm2022/dialog-header/dialog-header.component.mjs +13 -10
- package/components/dialogs/default/fesm2022/index.mjs +9 -6
- package/components/dialogs/default/fesm2022/index.mjs.map +1 -1
- package/components/navigation/menu/bundles/index.umd.js +5 -0
- package/components/navigation/menu/esm2022/menu.component.mjs +6 -1
- package/components/navigation/menu/fesm2022/index.mjs +5 -0
- package/components/navigation/menu/fesm2022/index.mjs.map +1 -1
- package/components/navigation/popover/bundles/index.umd.js +6 -6
- package/components/navigation/popover/esm2022/popover.component.mjs +4 -4
- package/components/navigation/popover/fesm2022/index.mjs +3 -3
- package/components/navigation/popover/fesm2022/index.mjs.map +1 -1
- package/components/navigation/popover/popover.component.d.ts +6 -0
- package/core/bundles/index.umd.js +332 -82
- package/core/esm2022/public_api.mjs +3 -3
- package/core/esm2022/types/types.mjs +1 -1
- package/core/esm2022/utils/utils.mjs +6 -2
- package/core/esm2022/utils/watcher.mjs +323 -81
- package/core/fesm2022/index.mjs +331 -84
- package/core/fesm2022/index.mjs.map +1 -1
- package/core/public_api.d.ts +2 -2
- package/core/types/types.d.ts +1 -0
- package/core/utils/utils.d.ts +1 -0
- package/core/utils/watcher.d.ts +26 -5
- package/npm-shrinkwrap.json +2 -2
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/runtime/base/bundles/index.umd.js +38 -2
- package/runtime/base/esm2022/components/app-component/app.component.mjs +7 -2
- package/runtime/base/esm2022/components/base-page.component.mjs +9 -2
- package/runtime/base/esm2022/components/base-partial.component.mjs +10 -2
- package/runtime/base/esm2022/components/base-prefab.component.mjs +10 -2
- package/runtime/base/esm2022/components/base-spa-page.component.mjs +9 -2
- package/runtime/base/esm2022/services/app.service.mjs +2 -1
- package/runtime/base/esm2022/services/pipe-provider.service.mjs +4 -4
- package/runtime/base/fesm2022/index.mjs +39 -3
- package/runtime/base/fesm2022/index.mjs.map +1 -1
- package/runtime/base/services/app.service.d.ts +1 -0
- package/scripts/@wavemaker/nvd3/build/nv.d3.min.js +1 -1
- package/scripts/datatable/datatable.js +19 -2
- package/transpiler/bundles/index.umd.js +1 -1
- package/transpiler/esm2022/imports.mjs +2 -2
- package/transpiler/fesm2022/index.mjs +1 -1
- package/transpiler/fesm2022/index.mjs.map +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PipeTransform } from '@angular/core';
|
|
2
2
|
import { DatePipe, DecimalPipe } from '@angular/common';
|
|
3
|
-
import { AbstractI18nService, CustomPipeManager } from '@wm/core';
|
|
3
|
+
import { AbstractI18nService, App, CustomPipeManager } from '@wm/core';
|
|
4
4
|
import { WmPipe } from "./wm-pipe";
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
export declare class TrailingZeroDecimalPipe implements PipeTransform {
|
|
@@ -13,11 +13,11 @@ export declare class TrailingZeroDecimalPipe implements PipeTransform {
|
|
|
13
13
|
export declare class ToDatePipe extends WmPipe implements PipeTransform {
|
|
14
14
|
private datePipe;
|
|
15
15
|
private i18nService;
|
|
16
|
-
protected customPipeManager: CustomPipeManager;
|
|
17
16
|
private app;
|
|
17
|
+
protected customPipeManager: CustomPipeManager;
|
|
18
18
|
returnFn(data: any, args: any, variables: any): any;
|
|
19
19
|
transform(data: any, format: any, timezone?: any, compInstance?: any): any;
|
|
20
|
-
constructor(datePipe: DatePipe, i18nService: AbstractI18nService, customPipeManager: CustomPipeManager);
|
|
20
|
+
constructor(datePipe: DatePipe, i18nService: AbstractI18nService, app: App, customPipeManager: CustomPipeManager);
|
|
21
21
|
static ɵfac: i0.ɵɵFactoryDeclaration<ToDatePipe, never>;
|
|
22
22
|
static ɵpipe: i0.ɵɵPipeDeclaration<ToDatePipe, "toDate", true>;
|
|
23
23
|
}
|
|
@@ -51,9 +51,9 @@ export declare class SuffixPipe implements PipeTransform {
|
|
|
51
51
|
* Custom pipe: It is work as interceptor between the user custom pipe function and angular pipe
|
|
52
52
|
*/
|
|
53
53
|
export declare class CustomPipe implements PipeTransform {
|
|
54
|
-
private custmeUserPipe;
|
|
55
54
|
private app;
|
|
56
|
-
|
|
55
|
+
private custmeUserPipe;
|
|
56
|
+
constructor(app: App, custmeUserPipe: CustomPipeManager);
|
|
57
57
|
transform(data: any, pipename: any): any;
|
|
58
58
|
static ɵfac: i0.ɵɵFactoryDeclaration<CustomPipe, never>;
|
|
59
59
|
static ɵpipe: i0.ɵɵPipeDeclaration<CustomPipe, "custom", true>;
|
|
@@ -54,6 +54,9 @@
|
|
|
54
54
|
i1.styler(this.nativeElement, this);
|
|
55
55
|
}
|
|
56
56
|
onPropertyChange(key, nv, ov) {
|
|
57
|
+
if (this.isDestroyed) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
57
60
|
if (key === 'caption') {
|
|
58
61
|
// Check for trustPipe safe values
|
|
59
62
|
let bindContent = this.nativeElement.getAttribute('caption.bind');
|
|
@@ -72,7 +75,12 @@
|
|
|
72
75
|
core.setProperty(this.nativeElement, 'innerHTML', nv[Object.keys(nv)[0]]);
|
|
73
76
|
}
|
|
74
77
|
else {
|
|
75
|
-
|
|
78
|
+
if (this.sanitizePipe) {
|
|
79
|
+
core.setProperty(this.nativeElement, 'innerHTML', this.sanitizePipe.transform(insertZWSP(nv), i0.SecurityContext.HTML));
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
core.setProperty(this.nativeElement, 'textContent', insertZWSP(nv));
|
|
83
|
+
}
|
|
76
84
|
}
|
|
77
85
|
}
|
|
78
86
|
else if (key === 'required') {
|
|
@@ -19,6 +19,9 @@ export class LabelDirective extends StylableComponent {
|
|
|
19
19
|
styler(this.nativeElement, this);
|
|
20
20
|
}
|
|
21
21
|
onPropertyChange(key, nv, ov) {
|
|
22
|
+
if (this.isDestroyed) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
22
25
|
if (key === 'caption') {
|
|
23
26
|
// Check for trustPipe safe values
|
|
24
27
|
let bindContent = this.nativeElement.getAttribute('caption.bind');
|
|
@@ -37,7 +40,12 @@ export class LabelDirective extends StylableComponent {
|
|
|
37
40
|
setProperty(this.nativeElement, 'innerHTML', nv[Object.keys(nv)[0]]);
|
|
38
41
|
}
|
|
39
42
|
else {
|
|
40
|
-
|
|
43
|
+
if (this.sanitizePipe) {
|
|
44
|
+
setProperty(this.nativeElement, 'innerHTML', this.sanitizePipe.transform(insertZWSP(nv), SecurityContext.HTML));
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
setProperty(this.nativeElement, 'textContent', insertZWSP(nv));
|
|
48
|
+
}
|
|
41
49
|
}
|
|
42
50
|
}
|
|
43
51
|
else if (key === 'required') {
|
|
@@ -68,4 +76,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
68
76
|
}, {
|
|
69
77
|
type: Optional
|
|
70
78
|
}] }] });
|
|
71
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFiZWwuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy93aWRnZXRzL2Jhc2ljL2xhYmVsL3NyYy9sYWJlbC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFckYsT0FBTyxFQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDbEQsT0FBTyxFQUNILFlBQVksRUFFWixrQkFBa0IsRUFDbEIsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixNQUFNLEVBQ1QsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxXQUFXLENBQUM7OztBQUVuQyxNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUM7QUFDaEMsTUFBTSxhQUFhLEdBQWtCO0lBQ2pDLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLFdBQVcsRUFBRSxZQUFZLENBQUMsWUFBWTtDQUN6QyxDQUFDO0FBVUYsTUFBTSxPQUFPLGNBQWUsU0FBUSxpQkFBaUI7YUFDMUMsb0JBQWUsR0FBRyxhQUFhLEVBQUUsQUFBbEIsQ0FBbUI7SUFFekMsWUFBWSxHQUFhLEVBQVUsWUFBeUIsRUFBMEMsZUFBb0I7UUFDdEgsS0FBSyxDQUFDLEdBQUcsRUFBRSxhQUFhLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFEWixpQkFBWSxHQUFaLFlBQVksQ0FBYTtRQUd4RCxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFHO1FBQ3pCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25CLE9BQU87UUFDWCxDQUFDO1FBQ0QsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDcEIsa0NBQWtDO1lBQ2xDLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ2xFLElBQUksU0FBUyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUM3RSxNQUFNLFVBQVUsR0FBRyxDQUFDLEtBQVUsRUFBVSxFQUFFO2dCQUN0QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7b0JBQUUsT0FBTyxLQUFLLENBQUM7Z0JBQzVDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDdEMsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDckQsQ0FBQyxDQUFDLENBQUM7WUFDUCxDQUFDLENBQUM7WUFDRixJQUFJLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUM3QixXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLENBQUM7aUJBQU0sSUFBSSxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ25DLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekUsQ0FBQztpQkFBTyxDQUFDO2dCQUNMLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUN4QixXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNoSCxDQUFDO3FCQUFNLENBQUM7b0JBQ0osV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNuRSxDQUFDO1lBQ0wsQ0FBQztRQUVMLENBQUM7YUFBTSxJQUFJLEdBQUcsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUM1QixXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDcEQsQ0FBQzthQUFNLENBQUM7WUFDSixLQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4QyxDQUFDO0lBQ0wsQ0FBQzsrR0F4Q1EsY0FBYyxzRUFHK0Msa0JBQWtCO21HQUgvRSxjQUFjLHdEQUxaO1lBQ1Asa0JBQWtCLENBQUMsY0FBYyxDQUFDO1NBQ3JDOzs0RkFHUSxjQUFjO2tCQVIxQixTQUFTO21CQUFDO29CQUNULFVBQVUsRUFBRSxJQUFJO29CQUNkLFFBQVEsRUFBRSxXQUFXO29CQUNyQixTQUFTLEVBQUU7d0JBQ1Asa0JBQWtCLGdCQUFnQjtxQkFDckM7b0JBQ0QsUUFBUSxFQUFFLFNBQVM7aUJBQ3RCOzswQkFJa0UsTUFBTTsyQkFBQyxrQkFBa0I7OzBCQUFHLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RpcmVjdGl2ZSwgSW5qZWN0LCBJbmplY3RvciwgT3B0aW9uYWwsIFNlY3VyaXR5Q29udGV4dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7c2V0UHJvcGVydHksIHRvZ2dsZUNsYXNzfSBmcm9tICdAd20vY29yZSc7XG5pbXBvcnQge1xuICAgIERJU1BMQVlfVFlQRSxcbiAgICBJV2lkZ2V0Q29uZmlnLFxuICAgIHByb3ZpZGVBc1dpZGdldFJlZixcbiAgICBTYW5pdGl6ZVBpcGUsXG4gICAgU3R5bGFibGVDb21wb25lbnQsXG4gICAgc3R5bGVyXG59IGZyb20gJ0B3bS9jb21wb25lbnRzL2Jhc2UnO1xuXG5pbXBvcnQge3JlZ2lzdGVyUHJvcHN9IGZyb20gJy4vbGFiZWwucHJvcHMnO1xuaW1wb3J0IHtpc09iamVjdH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuXG5jb25zdCBERUZBVUxUX0NMUyA9ICdhcHAtbGFiZWwnO1xuY29uc3QgV0lER0VUX0NPTkZJRzogSVdpZGdldENvbmZpZyA9IHtcbiAgICB3aWRnZXRUeXBlOiAnd20tbGFiZWwnLFxuICAgIGhvc3RDbGFzczogREVGQVVMVF9DTFMsXG4gICAgZGlzcGxheVR5cGU6IERJU1BMQVlfVFlQRS5JTkxJTkVfQkxPQ0tcbn07XG5cbkBEaXJlY3RpdmUoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnW3dtTGFiZWxdJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgcHJvdmlkZUFzV2lkZ2V0UmVmKExhYmVsRGlyZWN0aXZlKVxuICAgIF0sXG4gICAgZXhwb3J0QXM6ICd3bUxhYmVsJ1xufSlcbmV4cG9ydCBjbGFzcyBMYWJlbERpcmVjdGl2ZSBleHRlbmRzIFN0eWxhYmxlQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgaW5pdGlhbGl6ZVByb3BzID0gcmVnaXN0ZXJQcm9wcygpO1xuXG4gICAgY29uc3RydWN0b3IoaW5qOiBJbmplY3RvciwgcHJpdmF0ZSBzYW5pdGl6ZVBpcGU6U2FuaXRpemVQaXBlLCBASW5qZWN0KCdFWFBMSUNJVF9DT05URVhUJykgQE9wdGlvbmFsKCkgZXhwbGljaXRDb250ZXh0OiBhbnkpIHtcbiAgICAgICAgc3VwZXIoaW5qLCBXSURHRVRfQ09ORklHLCBleHBsaWNpdENvbnRleHQpO1xuXG4gICAgICAgIHN0eWxlcih0aGlzLm5hdGl2ZUVsZW1lbnQsIHRoaXMpO1xuICAgIH1cblxuICAgIG9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3Y/KSB7XG4gICAgICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleSA9PT0gJ2NhcHRpb24nKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgdHJ1c3RQaXBlIHNhZmUgdmFsdWVzXG4gICAgICAgICAgICBsZXQgYmluZENvbnRlbnQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdjYXB0aW9uLmJpbmQnKTtcbiAgICAgICAgICAgIGxldCBzYWZlVmFsdWUgPSBiaW5kQ29udGVudCA/IG52ICYmIGJpbmRDb250ZW50LmluY2x1ZGVzKCd0cnVzdEFzOicpIDogZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBpbnNlcnRaV1NQID0gKHZhbHVlOiBhbnkpOiBzdHJpbmcgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xcZHs1LH0vZywgKG1hdGNoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaC5yZXBsYWNlKC8oLns5fSkoPz0uKS9nLCAnJDFcXHUyMDBCJyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGlzT2JqZWN0KG52KSAmJiAhc2FmZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgc2V0UHJvcGVydHkodGhpcy5uYXRpdmVFbGVtZW50LCAndGV4dENvbnRlbnQnLCBKU09OLnN0cmluZ2lmeShudikpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdChudikgJiYgc2FmZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgc2V0UHJvcGVydHkodGhpcy5uYXRpdmVFbGVtZW50LCAnaW5uZXJIVE1MJywgbnZbT2JqZWN0LmtleXMobnYpWzBdXSk7XG4gICAgICAgICAgICB9ICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zYW5pdGl6ZVBpcGUpIHtcbiAgICAgICAgICAgICAgICBzZXRQcm9wZXJ0eSh0aGlzLm5hdGl2ZUVsZW1lbnQsICdpbm5lckhUTUwnLCB0aGlzLnNhbml0aXplUGlwZS50cmFuc2Zvcm0oaW5zZXJ0WldTUChudiksIFNlY3VyaXR5Q29udGV4dC5IVE1MKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0UHJvcGVydHkodGhpcy5uYXRpdmVFbGVtZW50LCAndGV4dENvbnRlbnQnLCBpbnNlcnRaV1NQKG52KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncmVxdWlyZWQnKSB7XG4gICAgICAgICAgICB0b2dnbGVDbGFzcyh0aGlzLm5hdGl2ZUVsZW1lbnQsICdyZXF1aXJlZCcsIG52KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1cGVyLm9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19
|
|
@@ -35,6 +35,9 @@ class LabelDirective extends StylableComponent {
|
|
|
35
35
|
styler(this.nativeElement, this);
|
|
36
36
|
}
|
|
37
37
|
onPropertyChange(key, nv, ov) {
|
|
38
|
+
if (this.isDestroyed) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
38
41
|
if (key === 'caption') {
|
|
39
42
|
// Check for trustPipe safe values
|
|
40
43
|
let bindContent = this.nativeElement.getAttribute('caption.bind');
|
|
@@ -53,7 +56,12 @@ class LabelDirective extends StylableComponent {
|
|
|
53
56
|
setProperty(this.nativeElement, 'innerHTML', nv[Object.keys(nv)[0]]);
|
|
54
57
|
}
|
|
55
58
|
else {
|
|
56
|
-
|
|
59
|
+
if (this.sanitizePipe) {
|
|
60
|
+
setProperty(this.nativeElement, 'innerHTML', this.sanitizePipe.transform(insertZWSP(nv), SecurityContext.HTML));
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
setProperty(this.nativeElement, 'textContent', insertZWSP(nv));
|
|
64
|
+
}
|
|
57
65
|
}
|
|
58
66
|
}
|
|
59
67
|
else if (key === 'required') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../../projects/components/widgets/basic/label/src/label.props.ts","../../../../../projects/components/widgets/basic/label/src/label.directive.ts","../../../../../projects/components/widgets/basic/label/src/index.ts"],"sourcesContent":["import {PROP_ANY, PROP_BOOLEAN, PROP_STRING, register} from '@wm/components/base';\n\nexport const registerProps = () => {\n register(\n 'wm-label',\n new Map(\n [\n ['animation', PROP_STRING],\n ['caption', {value: 'Label', ...PROP_STRING}],\n ['class', PROP_STRING],\n ['conditionalclass', PROP_ANY],\n ['conditionalstyle', PROP_ANY],\n ['type', PROP_STRING],\n ['notag', PROP_BOOLEAN],\n ['hint', PROP_STRING],\n ['name', PROP_STRING],\n ['required', PROP_BOOLEAN],\n ['show', {value: true, ...PROP_BOOLEAN}]\n ]\n )\n );\n};\n","import {Directive, Inject, Injector, Optional, SecurityContext} from '@angular/core';\n\nimport {setProperty, toggleClass} from '@wm/core';\nimport {\n DISPLAY_TYPE,\n IWidgetConfig,\n provideAsWidgetRef,\n SanitizePipe,\n StylableComponent,\n styler\n} from '@wm/components/base';\n\nimport {registerProps} from './label.props';\nimport {isObject} from \"lodash-es\";\n\nconst DEFAULT_CLS = 'app-label';\nconst WIDGET_CONFIG: IWidgetConfig = {\n widgetType: 'wm-label',\n hostClass: DEFAULT_CLS,\n displayType: DISPLAY_TYPE.INLINE_BLOCK\n};\n\n@Directive({\n standalone: true,\n selector: '[wmLabel]',\n providers: [\n provideAsWidgetRef(LabelDirective)\n ],\n exportAs: 'wmLabel'\n})\nexport class LabelDirective extends StylableComponent {\n static initializeProps = registerProps();\n\n constructor(inj: Injector, private sanitizePipe:SanitizePipe, @Inject('EXPLICIT_CONTEXT') @Optional() explicitContext: any) {\n super(inj, WIDGET_CONFIG, explicitContext);\n\n styler(this.nativeElement, this);\n }\n\n onPropertyChange(key, nv, ov?) {\n\n if (key === 'caption') {\n // Check for trustPipe safe values\n let bindContent = this.nativeElement.getAttribute('caption.bind');\n let safeValue = bindContent ? nv && bindContent.includes('trustAs:') : false;\n const insertZWSP = (value: any): string => {\n if (typeof value !== 'string') return value;\n return value.replace(/\\d{5,}/g, (match) => {\n return match.replace(/(.{9})(?=.)/g, '$1\\u200B');\n });\n };\n if (isObject(nv) && !safeValue) {\n setProperty(this.nativeElement, 'textContent', JSON.stringify(nv));\n } else if (isObject(nv) && safeValue) {\n setProperty(this.nativeElement, 'innerHTML', nv[Object.keys(nv)[0]]);\n } else {\n setProperty(this.nativeElement, 'innerHTML', this.sanitizePipe.transform(insertZWSP(nv), SecurityContext.HTML));\n }\n\n } else if (key === 'required') {\n toggleClass(this.nativeElement, 'required', nv);\n } else {\n super.onPropertyChange(key, nv, ov);\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;;;;AAEO,MAAM,aAAa,GAAG,MAAK;AAC9B,IAAA,QAAQ,CACJ,UAAU,EACV,IAAI,GAAG,CACH;QACI,CAAC,WAAW,EAAE,WAAW,CAAC;QAC1B,CAAC,SAAS,EAAE,EAAC,KAAK,EAAE,OAAO,EAAE,GAAG,WAAW,EAAC,CAAC;QAC7C,CAAC,OAAO,EAAE,WAAW,CAAC;QACtB,CAAC,kBAAkB,EAAE,QAAQ,CAAC;QAC9B,CAAC,kBAAkB,EAAE,QAAQ,CAAC;QAC9B,CAAC,MAAM,EAAE,WAAW,CAAC;QACrB,CAAC,OAAO,EAAE,YAAY,CAAC;QACvB,CAAC,MAAM,EAAE,WAAW,CAAC;QACrB,CAAC,MAAM,EAAE,WAAW,CAAC;QACrB,CAAC,UAAU,EAAE,YAAY,CAAC;QAC1B,CAAC,MAAM,EAAE,EAAC,KAAK,EAAE,IAAI,EAAE,GAAG,YAAY,EAAC;AAC1C,KAAA,CACJ,CACJ;AACL,CAAC;;ACND,MAAM,WAAW,GAAG,WAAW;AAC/B,MAAM,aAAa,GAAkB;AACjC,IAAA,UAAU,EAAE,UAAU;AACtB,IAAA,SAAS,EAAE,WAAW;IACtB,WAAW,EAAE,YAAY,CAAC;CAC7B;AAUK,MAAO,cAAe,SAAQ,iBAAiB,CAAA;AAC1C,IAAA,SAAA,IAAA,CAAA,eAAe,GAAG,aAAa,EAAhB,CAAmB;AAEzC,IAAA,WAAA,CAAY,GAAa,EAAU,YAAyB,EAA0C,eAAoB,EAAA;AACtH,QAAA,KAAK,CAAC,GAAG,EAAE,aAAa,EAAE,eAAe,CAAC;QADX,IAAA,CAAA,YAAY,GAAZ,YAAY;AAG3C,QAAA,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC;IACpC;AAEA,IAAA,gBAAgB,CAAC,GAAG,EAAE,EAAE,EAAE,EAAG,EAAA;
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../../projects/components/widgets/basic/label/src/label.props.ts","../../../../../projects/components/widgets/basic/label/src/label.directive.ts","../../../../../projects/components/widgets/basic/label/src/index.ts"],"sourcesContent":["import {PROP_ANY, PROP_BOOLEAN, PROP_STRING, register} from '@wm/components/base';\n\nexport const registerProps = () => {\n register(\n 'wm-label',\n new Map(\n [\n ['animation', PROP_STRING],\n ['caption', {value: 'Label', ...PROP_STRING}],\n ['class', PROP_STRING],\n ['conditionalclass', PROP_ANY],\n ['conditionalstyle', PROP_ANY],\n ['type', PROP_STRING],\n ['notag', PROP_BOOLEAN],\n ['hint', PROP_STRING],\n ['name', PROP_STRING],\n ['required', PROP_BOOLEAN],\n ['show', {value: true, ...PROP_BOOLEAN}]\n ]\n )\n );\n};\n","import {Directive, Inject, Injector, Optional, SecurityContext} from '@angular/core';\n\nimport {setProperty, toggleClass} from '@wm/core';\nimport {\n DISPLAY_TYPE,\n IWidgetConfig,\n provideAsWidgetRef,\n SanitizePipe,\n StylableComponent,\n styler\n} from '@wm/components/base';\n\nimport {registerProps} from './label.props';\nimport {isObject} from \"lodash-es\";\n\nconst DEFAULT_CLS = 'app-label';\nconst WIDGET_CONFIG: IWidgetConfig = {\n widgetType: 'wm-label',\n hostClass: DEFAULT_CLS,\n displayType: DISPLAY_TYPE.INLINE_BLOCK\n};\n\n@Directive({\n standalone: true,\n selector: '[wmLabel]',\n providers: [\n provideAsWidgetRef(LabelDirective)\n ],\n exportAs: 'wmLabel'\n})\nexport class LabelDirective extends StylableComponent {\n static initializeProps = registerProps();\n\n constructor(inj: Injector, private sanitizePipe:SanitizePipe, @Inject('EXPLICIT_CONTEXT') @Optional() explicitContext: any) {\n super(inj, WIDGET_CONFIG, explicitContext);\n\n styler(this.nativeElement, this);\n }\n\n onPropertyChange(key, nv, ov?) {\n if (this.isDestroyed) {\n return;\n }\n if (key === 'caption') {\n // Check for trustPipe safe values\n let bindContent = this.nativeElement.getAttribute('caption.bind');\n let safeValue = bindContent ? nv && bindContent.includes('trustAs:') : false;\n const insertZWSP = (value: any): string => {\n if (typeof value !== 'string') return value;\n return value.replace(/\\d{5,}/g, (match) => {\n return match.replace(/(.{9})(?=.)/g, '$1\\u200B');\n });\n };\n if (isObject(nv) && !safeValue) {\n setProperty(this.nativeElement, 'textContent', JSON.stringify(nv));\n } else if (isObject(nv) && safeValue) {\n setProperty(this.nativeElement, 'innerHTML', nv[Object.keys(nv)[0]]);\n } else {\n if (this.sanitizePipe) {\n setProperty(this.nativeElement, 'innerHTML', this.sanitizePipe.transform(insertZWSP(nv), SecurityContext.HTML));\n } else {\n setProperty(this.nativeElement, 'textContent', insertZWSP(nv));\n }\n }\n\n } else if (key === 'required') {\n toggleClass(this.nativeElement, 'required', nv);\n } else {\n super.onPropertyChange(key, nv, ov);\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -186,8 +186,15 @@
|
|
|
186
186
|
this.setDataGridOption('colDefs', i2.getClonedObject(this.fieldDefs));
|
|
187
187
|
}
|
|
188
188
|
// If data and colDefs are present, call on before data render event
|
|
189
|
+
// Note: Errors in beforedatarender should not prevent table rendering
|
|
189
190
|
if (!this.isdynamictable && !lodashEs.isEmpty(newValue) && gridOptions.colDefs.length) {
|
|
190
|
-
|
|
191
|
+
try {
|
|
192
|
+
this.invokeEventCallback('beforedatarender', { $data: this._gridData, $columns: this.columns, data: this._gridData, columns: this.columns });
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
// Log error but continue with rendering - beforedatarender errors should not block table rendering
|
|
196
|
+
console.warn('Error in beforedatarender event callback, continuing with table rendering:', error);
|
|
197
|
+
}
|
|
191
198
|
}
|
|
192
199
|
this.setDataGridOption('data', i2.getClonedObject(this._gridData));
|
|
193
200
|
}
|
|
@@ -580,7 +587,7 @@
|
|
|
580
587
|
this.prevData = i2.getClonedObject(row);
|
|
581
588
|
},
|
|
582
589
|
afterRowUpdate: (row, e, callBack, options) => {
|
|
583
|
-
this.updateRecord(lodashEs.extend({}, options, { row, 'prevData': this.prevData, 'event': e, 'callBack': callBack }));
|
|
590
|
+
this.updateRecord(lodashEs.extend({}, options, { row, 'prevData': options.rowindex ? options.rowindex : this.prevData, 'event': e, 'callBack': callBack }));
|
|
584
591
|
},
|
|
585
592
|
onBeforeRowUpdate: (row, e, options) => {
|
|
586
593
|
return this.invokeEventCallback('beforerowupdate', { $event: e, $data: row, row, options: options });
|
|
@@ -1234,6 +1241,10 @@
|
|
|
1234
1241
|
return this.actualPageSize || 5;
|
|
1235
1242
|
}
|
|
1236
1243
|
watchVariableDataSet(newVal) {
|
|
1244
|
+
// Guard against component destruction
|
|
1245
|
+
if (this.isDestroyed) {
|
|
1246
|
+
return;
|
|
1247
|
+
}
|
|
1237
1248
|
let result;
|
|
1238
1249
|
// Check for Variable filters if applied
|
|
1239
1250
|
if (this.gridOptions.isNavTypeScrollOrOndemand()) {
|
|
@@ -1291,6 +1302,12 @@
|
|
|
1291
1302
|
}
|
|
1292
1303
|
/*Return if data is invalid.*/
|
|
1293
1304
|
if (!this.isDataValid()) {
|
|
1305
|
+
// If data is invalid and variableInflight is still true, clear loading state
|
|
1306
|
+
// This prevents tables from getting stuck in loading when data is invalid
|
|
1307
|
+
if (this.variableInflight) {
|
|
1308
|
+
this.variableInflight = false;
|
|
1309
|
+
this.setGridData([]);
|
|
1310
|
+
}
|
|
1294
1311
|
return;
|
|
1295
1312
|
}
|
|
1296
1313
|
// If value is empty or in studio mode, dont enable the navigation
|
|
@@ -1318,7 +1335,13 @@
|
|
|
1318
1335
|
// @ts-ignore
|
|
1319
1336
|
if (!lodashEs.isObject(newVal) || newVal === '' || (newVal && newVal.dataValue === '')) {
|
|
1320
1337
|
if (!this.variableInflight) {
|
|
1321
|
-
// If variable has finished loading and resultSet is empty,
|
|
1338
|
+
// If variable has finished loading and resultSet is empty, render empty data
|
|
1339
|
+
this.setGridData([]);
|
|
1340
|
+
}
|
|
1341
|
+
else {
|
|
1342
|
+
// If variableInflight is still true but we have invalid/empty data, clear loading state
|
|
1343
|
+
// This handles cases where data never arrives or is invalid
|
|
1344
|
+
this.variableInflight = false;
|
|
1322
1345
|
this.setGridData([]);
|
|
1323
1346
|
}
|
|
1324
1347
|
return;
|
|
@@ -1328,13 +1351,143 @@
|
|
|
1328
1351
|
}
|
|
1329
1352
|
}
|
|
1330
1353
|
ngOnDestroy() {
|
|
1354
|
+
// MEMORY LEAK FIX: Remove document click listener
|
|
1331
1355
|
document.removeEventListener('click', this.documentClickBind);
|
|
1356
|
+
// MEMORY LEAK FIX: Unsubscribe from navigator watches
|
|
1332
1357
|
if (this.navigatorResultWatch) {
|
|
1333
1358
|
this.navigatorResultWatch.unsubscribe();
|
|
1359
|
+
this.navigatorResultWatch = null;
|
|
1334
1360
|
}
|
|
1335
1361
|
if (this.navigatorMaxResultWatch) {
|
|
1336
1362
|
this.navigatorMaxResultWatch.unsubscribe();
|
|
1363
|
+
this.navigatorMaxResultWatch = null;
|
|
1364
|
+
}
|
|
1365
|
+
// MEMORY LEAK FIX: Clear all ViewContainerRef embedded views
|
|
1366
|
+
// These hold references to row data, custom expressions, and inline widgets
|
|
1367
|
+
if (this.customExprViewRef) {
|
|
1368
|
+
this.customExprViewRef.clear();
|
|
1369
|
+
}
|
|
1370
|
+
if (this.rowActionsViewRef) {
|
|
1371
|
+
this.rowActionsViewRef.clear();
|
|
1372
|
+
}
|
|
1373
|
+
if (this.filterViewRef) {
|
|
1374
|
+
this.filterViewRef.clear();
|
|
1375
|
+
}
|
|
1376
|
+
if (this.inlineEditViewRef) {
|
|
1377
|
+
this.inlineEditViewRef.clear();
|
|
1378
|
+
}
|
|
1379
|
+
if (this.inlineEditNewViewRef) {
|
|
1380
|
+
this.inlineEditNewViewRef.clear();
|
|
1337
1381
|
}
|
|
1382
|
+
if (this.rowDetailViewRef) {
|
|
1383
|
+
this.rowDetailViewRef.clear();
|
|
1384
|
+
}
|
|
1385
|
+
if (this.rowExpansionActionViewRef) {
|
|
1386
|
+
this.rowExpansionActionViewRef.clear();
|
|
1387
|
+
}
|
|
1388
|
+
if (this.dynamicTableRef) {
|
|
1389
|
+
this.dynamicTableRef.clear();
|
|
1390
|
+
}
|
|
1391
|
+
// MEMORY LEAK FIX: Clear compiled template caches
|
|
1392
|
+
this.rowActionsCompiledTl = {};
|
|
1393
|
+
this.rowFilterCompliedTl = {};
|
|
1394
|
+
this.inlineCompliedTl = {};
|
|
1395
|
+
this.inlineNewCompliedTl = {};
|
|
1396
|
+
this.customExprCompiledTl = {};
|
|
1397
|
+
this.customExprCompiledSummaryTl = {};
|
|
1398
|
+
this.rowDefInstances = {};
|
|
1399
|
+
this.rowDefMap = {};
|
|
1400
|
+
this.rowExpansionActionTl = {};
|
|
1401
|
+
// MEMORY LEAK FIX: Clear dynamic context
|
|
1402
|
+
if (this._dynamicContext) {
|
|
1403
|
+
Object.keys(this._dynamicContext).forEach(key => {
|
|
1404
|
+
delete this._dynamicContext[key];
|
|
1405
|
+
});
|
|
1406
|
+
this._dynamicContext = null;
|
|
1407
|
+
}
|
|
1408
|
+
// MEMORY LEAK FIX: Clear data arrays
|
|
1409
|
+
this._gridData = [];
|
|
1410
|
+
this.items = [];
|
|
1411
|
+
this.selectedItems = [];
|
|
1412
|
+
this.fieldDefs = [];
|
|
1413
|
+
this.fullFieldDefs = [];
|
|
1414
|
+
this.gridData = [];
|
|
1415
|
+
this.__fullData = null;
|
|
1416
|
+
// MEMORY LEAK FIX: Destroy jQuery datatable widget before clearing gridOptions
|
|
1417
|
+
if (this.datagridElement && this.datagridElement.datatable) {
|
|
1418
|
+
try {
|
|
1419
|
+
this.datagridElement.datatable('destroy');
|
|
1420
|
+
}
|
|
1421
|
+
catch (e) {
|
|
1422
|
+
// Ignore errors during destroy
|
|
1423
|
+
}
|
|
1424
|
+
}
|
|
1425
|
+
// MEMORY LEAK FIX: Clear gridOptions to release all function closures and data
|
|
1426
|
+
// gridOptions holds many closures that capture 'this' and prevent GC
|
|
1427
|
+
if (this.gridOptions) {
|
|
1428
|
+
// Clear data array
|
|
1429
|
+
if (this.gridOptions.data) {
|
|
1430
|
+
this.gridOptions.data = [];
|
|
1431
|
+
}
|
|
1432
|
+
// Clear column definitions
|
|
1433
|
+
if (this.gridOptions.colDefs) {
|
|
1434
|
+
this.gridOptions.colDefs = [];
|
|
1435
|
+
}
|
|
1436
|
+
// Clear row actions
|
|
1437
|
+
if (this.gridOptions.rowActions) {
|
|
1438
|
+
this.gridOptions.rowActions = [];
|
|
1439
|
+
}
|
|
1440
|
+
// Clear header config
|
|
1441
|
+
if (this.gridOptions.headerConfig) {
|
|
1442
|
+
this.gridOptions.headerConfig = [];
|
|
1443
|
+
}
|
|
1444
|
+
// Nullify all function references to break closures
|
|
1445
|
+
Object.keys(this.gridOptions).forEach(key => {
|
|
1446
|
+
if (typeof this.gridOptions[key] === 'function') {
|
|
1447
|
+
this.gridOptions[key] = null;
|
|
1448
|
+
}
|
|
1449
|
+
});
|
|
1450
|
+
}
|
|
1451
|
+
// MEMORY LEAK FIX: Clear other data structures
|
|
1452
|
+
this.columns = {};
|
|
1453
|
+
this.formfields = {};
|
|
1454
|
+
this.rowFilter = {};
|
|
1455
|
+
this.actions = [];
|
|
1456
|
+
this._actions = { header: [], footer: [] };
|
|
1457
|
+
this.exportOptions = [];
|
|
1458
|
+
this.headerConfig = [];
|
|
1459
|
+
this.rowActions = [];
|
|
1460
|
+
// MEMORY LEAK FIX: Clear all @ContentChildren QueryLists holding template references
|
|
1461
|
+
// These QueryLists hold TemplateRef instances that create circular references to the parent LView
|
|
1462
|
+
if (this.rowActionTmpl) {
|
|
1463
|
+
this.rowActionTmpl.reset([]);
|
|
1464
|
+
}
|
|
1465
|
+
if (this.filterTmpl) {
|
|
1466
|
+
this.filterTmpl.reset([]);
|
|
1467
|
+
}
|
|
1468
|
+
if (this.inlineWidgetTmpl) {
|
|
1469
|
+
this.inlineWidgetTmpl.reset([]);
|
|
1470
|
+
}
|
|
1471
|
+
if (this.inlineWidgetNewTmpl) {
|
|
1472
|
+
this.inlineWidgetNewTmpl.reset([]);
|
|
1473
|
+
}
|
|
1474
|
+
if (this.customExprTmpl) {
|
|
1475
|
+
this.customExprTmpl.reset([]);
|
|
1476
|
+
}
|
|
1477
|
+
if (this.rowExpansionActionTmpl) {
|
|
1478
|
+
this.rowExpansionActionTmpl.reset([]);
|
|
1479
|
+
}
|
|
1480
|
+
// MEMORY LEAK FIX: Clear @ContentChild template reference
|
|
1481
|
+
this.rowExpansionTmpl = null;
|
|
1482
|
+
// MEMORY LEAK FIX: Complete and clear subjects
|
|
1483
|
+
if (this.selectedItemChange) {
|
|
1484
|
+
this.selectedItemChange.complete();
|
|
1485
|
+
this.selectedItemChange = null;
|
|
1486
|
+
}
|
|
1487
|
+
// MEMORY LEAK FIX: Clear ViewChild references
|
|
1488
|
+
this.dataNavigator = null;
|
|
1489
|
+
this._tableElement = null;
|
|
1490
|
+
// console.log("table component destroyed");
|
|
1338
1491
|
super.ngOnDestroy();
|
|
1339
1492
|
}
|
|
1340
1493
|
addRowIndex(row) {
|
|
@@ -1405,6 +1558,9 @@
|
|
|
1405
1558
|
if (!key.endsWith('_filter') && ((key.endsWith('_new') && newRow) || (!key.endsWith('_new') && !newRow))) {
|
|
1406
1559
|
ctrls[key].setValue('');
|
|
1407
1560
|
this.resetFormControl(ctrls[key]);
|
|
1561
|
+
// MEMORY LEAK FIX: Clear validators to release references
|
|
1562
|
+
ctrls[key].clearValidators();
|
|
1563
|
+
ctrls[key].clearAsyncValidators();
|
|
1408
1564
|
}
|
|
1409
1565
|
});
|
|
1410
1566
|
}
|
|
@@ -1724,7 +1880,14 @@
|
|
|
1724
1880
|
defaultFieldDefs.forEach(col => {
|
|
1725
1881
|
this.columns[col.field] = col;
|
|
1726
1882
|
});
|
|
1727
|
-
|
|
1883
|
+
// Note: Errors in beforedatarender should not prevent table rendering
|
|
1884
|
+
try {
|
|
1885
|
+
this.invokeEventCallback('beforedatarender', { $data: data, $columns: this.columns, data: data, columns: this.columns });
|
|
1886
|
+
}
|
|
1887
|
+
catch (error) {
|
|
1888
|
+
// Log error but continue with rendering - beforedatarender errors should not block table rendering
|
|
1889
|
+
console.warn('Error in beforedatarender event callback, continuing with table rendering:', error);
|
|
1890
|
+
}
|
|
1728
1891
|
defaultFieldDefs = [];
|
|
1729
1892
|
// Apply the changes made by the user
|
|
1730
1893
|
lodashEs.forEach(this.columns, val => {
|
|
@@ -1763,23 +1926,30 @@
|
|
|
1763
1926
|
return sortExp || '';
|
|
1764
1927
|
}
|
|
1765
1928
|
onPropertyChange(key, nv, ov) {
|
|
1929
|
+
// Guard against property changes after component destruction
|
|
1930
|
+
if (this.isDestroyed) {
|
|
1931
|
+
return;
|
|
1932
|
+
}
|
|
1766
1933
|
let enableNewRow;
|
|
1767
1934
|
switch (key) {
|
|
1768
1935
|
case 'datasource':
|
|
1769
1936
|
// Fix for [WMS-23653] when startUpdate is false (request on page load property is unchecked),
|
|
1770
1937
|
// then set status msg as "No data found"
|
|
1771
|
-
if (this.allowpagesizechange) {
|
|
1938
|
+
if (this.allowpagesizechange && this.datasource) {
|
|
1772
1939
|
this.datasource.maxResults = this.pagesize || this.datasource.maxResults;
|
|
1773
1940
|
}
|
|
1774
|
-
if (nv.startUpdate === false) {
|
|
1941
|
+
if (nv && nv.startUpdate === false) {
|
|
1775
1942
|
this.variableInflight = false;
|
|
1776
1943
|
this.callDataGridMethod('setStatus', 'nodata', this.nodatamessage);
|
|
1777
1944
|
}
|
|
1778
|
-
if (lodashEs.get(this.datasource, 'category') !== 'wm.Variable') {
|
|
1945
|
+
if (this.datasource && lodashEs.get(this.datasource, 'category') !== 'wm.Variable') {
|
|
1779
1946
|
this.headerselectall = false;
|
|
1780
1947
|
this.setDataGridOption("headerselectall", false);
|
|
1781
1948
|
}
|
|
1782
|
-
|
|
1949
|
+
// Process dataset when datasource is set, especially if dataset was previously skipped
|
|
1950
|
+
if (this.datasource && this.dataset !== undefined) {
|
|
1951
|
+
this.watchVariableDataSet(this.dataset);
|
|
1952
|
+
}
|
|
1783
1953
|
this.onDataSourceChange();
|
|
1784
1954
|
break;
|
|
1785
1955
|
case 'dataset':
|
|
@@ -1787,6 +1957,12 @@
|
|
|
1787
1957
|
this.gridOptions.setIsNextPageData(false);
|
|
1788
1958
|
}
|
|
1789
1959
|
if (this.binddatasource && !this.datasource) {
|
|
1960
|
+
// If datasource is not set yet, clear loading state and show no data
|
|
1961
|
+
// This prevents tables from being stuck in loading state
|
|
1962
|
+
if (this.variableInflight) {
|
|
1963
|
+
this.variableInflight = false;
|
|
1964
|
+
this.callDataGridMethod('setStatus', 'nodata', this.nodatamessage);
|
|
1965
|
+
}
|
|
1790
1966
|
return;
|
|
1791
1967
|
}
|
|
1792
1968
|
// if table is inside list then table dataset will be set as "item.XXX" and there is no datasource.
|
|
@@ -1890,9 +2066,11 @@
|
|
|
1890
2066
|
this.allowpagesizechange = nv;
|
|
1891
2067
|
break;
|
|
1892
2068
|
case 'pagesizeoptions':
|
|
1893
|
-
this.
|
|
1894
|
-
this.pagesizeoptions = nv;
|
|
1895
|
-
this.
|
|
2069
|
+
this.prevPagesizeoptions = this.sanitizeCommaSeparatedIntegers(ov);
|
|
2070
|
+
this.gridOptions.pagesizeoptions = this.sanitizeCommaSeparatedIntegers(nv);
|
|
2071
|
+
this.pagesizeoptions = this.sanitizeCommaSeparatedIntegers(nv);
|
|
2072
|
+
if (this.allowpagesizechange)
|
|
2073
|
+
this.setDefaultPageSize(nv);
|
|
1896
2074
|
break;
|
|
1897
2075
|
case 'multiselecttitle':
|
|
1898
2076
|
this.setDataGridOption('multiselecttitle', nv);
|
|
@@ -1936,12 +2114,41 @@
|
|
|
1936
2114
|
this.pagesize = nv;
|
|
1937
2115
|
}
|
|
1938
2116
|
this.updatedPageSize = nv;
|
|
2117
|
+
if (this.isPageSizeOptionsChanged()) {
|
|
2118
|
+
this.dataNavigator.defaultPageSizeOptions = this.pagesizeoptions?.split(',').map(Number).sort((a, b) => a - b) || [];
|
|
2119
|
+
this.dataNavigator.pageSizeOptions = [...this.dataNavigator.defaultPageSizeOptions];
|
|
2120
|
+
}
|
|
1939
2121
|
}
|
|
1940
2122
|
this.dataNavigator.options = {
|
|
1941
2123
|
maxResults: nv
|
|
1942
2124
|
};
|
|
1943
2125
|
this.dataNavigator.widget.maxResults = nv;
|
|
1944
2126
|
this.dataNavigator.maxResults = nv;
|
|
2127
|
+
if (this.datasource) {
|
|
2128
|
+
this.datasource.maxResults = this.pagesize || this.datasource.maxResults;
|
|
2129
|
+
}
|
|
2130
|
+
}
|
|
2131
|
+
isPageSizeOptionsChanged() {
|
|
2132
|
+
return !lodashEs.isEqual(this.prevPagesizeoptions, this.pagesizeoptions);
|
|
2133
|
+
}
|
|
2134
|
+
selectPageSize(pagesize) {
|
|
2135
|
+
if (!this.allowpagesizechange && !pagesize)
|
|
2136
|
+
return;
|
|
2137
|
+
if (pagesize < this.dataNavigator.pageSizeOptions[0] || pagesize > this.dataNavigator.pageSizeOptions[this.dataNavigator.pageSizeOptions.length - 1]
|
|
2138
|
+
|| !this.dataNavigator.pageSizeOptions.includes(Number(pagesize))) {
|
|
2139
|
+
pagesize = this.dataNavigator.pageSizeOptions[0];
|
|
2140
|
+
}
|
|
2141
|
+
this.dataNavigator.onPageSizeChange(undefined, pagesize);
|
|
2142
|
+
}
|
|
2143
|
+
sanitizeCommaSeparatedIntegers(input) {
|
|
2144
|
+
if (!input)
|
|
2145
|
+
return "";
|
|
2146
|
+
const uniqueNumbers = Array.from(new Set(input
|
|
2147
|
+
.split(",")
|
|
2148
|
+
.map(v => v.trim())
|
|
2149
|
+
.filter(v => /^-?\d+$/.test(v))
|
|
2150
|
+
.map(v => Math.abs(parseInt(v, 10)))));
|
|
2151
|
+
return uniqueNumbers.join(",");
|
|
1945
2152
|
}
|
|
1946
2153
|
onDataSourceChange() {
|
|
1947
2154
|
this.fieldDefs.forEach(col => {
|