From 44436ebd962210286f5c96773fb5b5383c3f52da Mon Sep 17 00:00:00 2001 From: Aleksey Semikozov Date: Fri, 29 May 2026 10:21:50 -0300 Subject: [PATCH] Draggable - Add safety guards for Angular SSR and disposal --- .../devextreme-angular/src/server/render.ts | 3 +++ .../__tests__/draggable_dispose.test.ts | 19 +++++++++++++++++++ .../devextreme/js/__internal/m_draggable.ts | 2 +- 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 packages/devextreme/js/__internal/__tests__/draggable_dispose.test.ts diff --git a/packages/devextreme-angular/src/server/render.ts b/packages/devextreme-angular/src/server/render.ts index 272acefd5cc9..1ea7b55f70ce 100644 --- a/packages/devextreme-angular/src/server/render.ts +++ b/packages/devextreme-angular/src/server/render.ts @@ -25,6 +25,9 @@ export class DxServerModule { temp.innerHTML = renderToString(el); const mainElement = temp.childNodes[0]; + if (!mainElement) { + return; + } const childString = mainElement.innerHTML; for (let i = 0; i < mainElement.attributes.length; i++) { diff --git a/packages/devextreme/js/__internal/__tests__/draggable_dispose.test.ts b/packages/devextreme/js/__internal/__tests__/draggable_dispose.test.ts new file mode 100644 index 000000000000..e80ee4015270 --- /dev/null +++ b/packages/devextreme/js/__internal/__tests__/draggable_dispose.test.ts @@ -0,0 +1,19 @@ +import $ from '@js/core/renderer'; +import Sortable from '@js/ui/sortable'; + +describe('Draggable dispose safety', () => { + beforeEach(() => { + document.body.innerHTML = ''; + }); + + it('should not crash on _stopAnimator when _scrollAnimator is not initialized', () => { + const $container = $('
').appendTo(document.body); + const sortable = new Sortable($container, {}); + + (sortable as any)._scrollAnimator = undefined; + + expect(() => { + sortable.dispose(); + }).not.toThrow(); + }); +}); diff --git a/packages/devextreme/js/__internal/m_draggable.ts b/packages/devextreme/js/__internal/m_draggable.ts index 194eca2e53cb..a97a6967a661 100644 --- a/packages/devextreme/js/__internal/m_draggable.ts +++ b/packages/devextreme/js/__internal/m_draggable.ts @@ -439,7 +439,7 @@ class Draggable extends DOMComponent { } _stopAnimator() { - this._scrollAnimator.stop(); + this._scrollAnimator?.stop(); } _addWidgetPrefix(className?) {