Skip to content

Draggable - Add safety guards for Angular SSR and disposal#33775

Merged
aleksei-semikozov merged 1 commit into
DevExpress:26_1from
aleksei-semikozov:draggable-ssr-guards
Jun 1, 2026
Merged

Draggable - Add safety guards for Angular SSR and disposal#33775
aleksei-semikozov merged 1 commit into
DevExpress:26_1from
aleksei-semikozov:draggable-ssr-guards

Conversation

@aleksei-semikozov
Copy link
Copy Markdown
Contributor

No description provided.

@aleksei-semikozov aleksei-semikozov self-assigned this May 29, 2026
@aleksei-semikozov aleksei-semikozov marked this pull request as ready for review June 1, 2026 12:53
@aleksei-semikozov aleksei-semikozov requested a review from a team as a code owner June 1, 2026 12:53
Copilot AI review requested due to automatic review settings June 1, 2026 12:53
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR improves robustness around Draggable/Sortable disposal and Angular server-side rendering by adding defensive guards to prevent runtime crashes in edge cases (uninitialized animator, empty/non-element SSR output).

Changes:

  • Make Draggable’s _stopAnimator tolerant to an uninitialized _scrollAnimator.
  • Add a Jest test ensuring dxSortable.dispose() doesn’t throw when _scrollAnimator is missing.
  • Add a guard in Angular SSR rendering to avoid dereferencing a missing rendered root node.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 3 comments.

File Description
packages/devextreme/js/__internal/m_draggable.ts Makes animator stopping safe when _scrollAnimator is missing.
packages/devextreme/js/__internal/__tests__/draggable_dispose.test.ts Adds a regression test for safe disposal when _scrollAnimator is undefined.
packages/devextreme-angular/src/server/render.ts Adds SSR guard to avoid crashes when the rendered markup has no root node.

Comment on lines 27 to 31
const mainElement = temp.childNodes[0];
if (!mainElement) {
return;
}
const childString = mainElement.innerHTML;
Comment on lines +1 to +7
import $ from '@js/core/renderer';
import Sortable from '@js/ui/sortable';

describe('Draggable dispose safety', () => {
beforeEach(() => {
document.body.innerHTML = '';
});
Comment on lines +9 to +12
it('should not crash on _stopAnimator when _scrollAnimator is not initialized', () => {
const $container = $('<div>').appendTo(document.body);
const sortable = new Sortable($container, {});

@aleksei-semikozov aleksei-semikozov merged commit fb5f54f into DevExpress:26_1 Jun 1, 2026
127 of 128 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants