Skip to content

Commit e2945bf

Browse files
authored
CardView - fix memory leaks (#30061)
1 parent 3ec77ef commit e2945bf

File tree

5 files changed

+24
-10
lines changed

5 files changed

+24
-10
lines changed

packages/devextreme/js/__internal/grids/grid_core/pager/m_pager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import Pagination from '@ts/pagination/wrappers/pagination';
66
import modules from '../m_modules';
77

88
const PAGER_CLASS = 'pager';
9-
const MAX_PAGES_COUNT = 10;
9+
export const MAX_PAGES_COUNT = 10;
1010

1111
const getPageIndex = function (dataController) {
1212
// eslint-disable-next-line radix

packages/devextreme/js/__internal/grids/new/grid_core/core/view.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type { ReadonlySignal } from '@preact/signals-core';
77
import { effect } from '@preact/signals-core';
88
import { infernoRenderer } from '@ts/core/m_inferno_renderer';
99
import { BaseInfernoComponent } from '@ts/core/r1/runtime/inferno/base_component';
10+
import { hasWindow } from '@ts/core/utils/m_window';
1011
import { type ComponentType } from 'inferno';
1112

1213
export abstract class View<T extends {}> {
@@ -50,24 +51,28 @@ export abstract class View<T extends {}> {
5051
}
5152

5253
return class InfernoView extends BaseInfernoComponent<{}, State> {
53-
private readonly subscription: () => void;
54+
private readonly unsubscribe: () => void;
5455

5556
constructor() {
5657
super();
5758
const props = view.getProps();
58-
this.subscription = effect(() => {
59+
this.unsubscribe = effect(() => {
5960
view.props = props.value;
6061

6162
this.state ??= {
6263
props: props.value,
6364
};
6465

65-
if (this.state.props !== props.value) {
66+
if (this.state.props !== props.value && hasWindow()) {
6667
this.setState({ props: props.value });
6768
}
6869
});
6970
}
7071

72+
public componentWillUnmount(): void {
73+
this.unsubscribe();
74+
}
75+
7176
public render(): JSX.Element | undefined {
7277
const ViewComponent = view.component;
7378
return <ViewComponent {...this.state!.props}/>;

packages/devextreme/js/__internal/grids/new/grid_core/inferno_wrappers/root_element_updater.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,8 @@ export class RootElementUpdater extends Component<Properties> {
1515
private previousAttributes: Record<string, unknown> = {};
1616

1717
public render(): JSX.Element {
18-
return <>
19-
{this.props.children}
20-
</>;
18+
// @ts-expect-error
19+
return this.props.children;
2120
}
2221

2322
private updateClasses(element: HTMLDivElement): void {

packages/devextreme/js/__internal/grids/new/grid_core/pager/view.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { ReadonlySignal, Signal } from '@preact/signals-core';
22
import { computed, effect, signal } from '@preact/signals-core';
3+
import { MAX_PAGES_COUNT } from '@ts/grids/grid_core/pager/m_pager';
34

45
import { View } from '../core/view';
56
import { DataController } from '../data_controller/index';
@@ -55,13 +56,16 @@ export class PagerView extends View<PagerProps> {
5556
pageSizeChanged: (value): void => {
5657
this.dataController.pageSize.value = value;
5758
},
58-
isGridCompatibility: false,
5959
pageCount: this.dataController.pageCount.value,
6060
showPageSizeSelector: this.options.oneWay('pager.showPageSizeSelector').value,
6161
_skipValidation: true,
6262
tabIndex: 0,
6363
showInfo: this.options.oneWay('pager.showInfo').value,
6464
showNavigationButtons: this.options.oneWay('pager.showNavigationButtons').value,
65+
label: this.options.oneWay('pager.label').value,
66+
pagesNavigatorVisible: this.options.oneWay('pager.visible').value,
67+
displayMode: this.options.oneWay('pager.displayMode').value,
68+
maxPagesCount: MAX_PAGES_COUNT,
6569
}));
6670
}
6771
}

packages/devextreme/js/__internal/ui/overlay/m_overlay.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -777,10 +777,16 @@ class Overlay<
777777
if (_loopFocus || enabled) {
778778
eventsEngine.on(domAdapter.getDocument(), eventName, this._proxiedTabTerminatorHandler);
779779
} else {
780-
eventsEngine.off(domAdapter.getDocument(), eventName, this._proxiedTabTerminatorHandler);
780+
this._destroyTabTerminator();
781781
}
782782
}
783783

784+
_destroyTabTerminator(): void {
785+
// @ts-expect-error ts-error
786+
const eventName = addNamespace('keydown', this.NAME);
787+
eventsEngine.off(domAdapter.getDocument(), eventName, this._proxiedTabTerminatorHandler);
788+
}
789+
784790
_findTabbableBounds(): { first: dxElementWrapper | null; last: dxElementWrapper | null } {
785791
const $elements = this._$wrapper.find('*');
786792
const elementsCount = $elements.length - 1;
@@ -1248,7 +1254,6 @@ class Overlay<
12481254
this._toggleViewPortSubscription(false);
12491255
this._toggleSubscriptions(false);
12501256
this._updateZIndexStackPosition(false);
1251-
this._toggleTabTerminator(false);
12521257

12531258
this._actions = null;
12541259
this._parentsScrollSubscriptionInfo = null;
@@ -1259,6 +1264,7 @@ class Overlay<
12591264
this.option('visible') && zIndexPool.remove(this._zIndex);
12601265
this._$wrapper.remove();
12611266
this._$content.remove();
1267+
this._destroyTabTerminator();
12621268
}
12631269

12641270
_toggleRTLDirection(rtl) {

0 commit comments

Comments
 (0)