Skip to content

Commit b3767ad

Browse files
Splitter: resizeHandle should not be duplicated when changing the template option at runtime (T1279224) (DevExpress#29467)
1 parent 79f2ab5 commit b3767ad

File tree

3 files changed

+72
-0
lines changed

3 files changed

+72
-0
lines changed

packages/devextreme/js/__internal/ui/splitter/splitter.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,7 @@ class Splitter extends CollectionWidget<Properties> {
545545
event,
546546
handleElement: getPublicElement<HTMLElement>($resizeHandle),
547547
};
548+
548549
// eslint-disable-next-line @typescript-eslint/no-floating-promises
549550
this._feedbackDeferred?.resolve();
550551
this._toggleActiveState($resizeHandle, false);
@@ -683,6 +684,12 @@ class Splitter extends CollectionWidget<Properties> {
683684
this._itemVisibleOptionChanged(item, value as PropertyType, prevValue as PropertyType);
684685
break;
685686
}
687+
case 'template':
688+
super._itemOptionChanged(item, property, value, prevValue);
689+
690+
this._applyStylesFromLayout(this.getLayout());
691+
this._updateResizeHandles();
692+
break;
686693
default:
687694
super._itemOptionChanged(item, property, value, prevValue);
688695
}

packages/devextreme/js/__internal/ui/splitter/splitter_item.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,12 @@ class SplitterItem extends CollectionWidgetItem {
8282
isLast(): boolean {
8383
return this._owner._isLastVisibleItem(this.getIndex());
8484
}
85+
86+
_dispose(): void {
87+
this._removeResizeHandle();
88+
// @ts-expect-error ts-error
89+
super._dispose();
90+
}
8591
}
8692

8793
export default SplitterItem;

packages/devextreme/testing/tests/DevExpress.ui.widgets/splitter.tests.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1605,6 +1605,47 @@ QUnit.module('Pane visibility', moduleConfig, () => {
16051605
});
16061606
});
16071607

1608+
QUnit.module('Pane.template', moduleConfig, () => {
1609+
QUnit.test('ResizeHandle should not be duplicated when changing the template option at runtime (T1279224)', function(assert) {
1610+
const firstPaneTemplate = () => $('<div>').text('Pane 1');
1611+
const secondPaneTemplate = () => $('<div>').text('Pane 2');
1612+
1613+
this.reinit({
1614+
dataSource: [{
1615+
template: firstPaneTemplate
1616+
}, {
1617+
template: secondPaneTemplate
1618+
}]
1619+
});
1620+
1621+
this.instance.option({
1622+
'items[0].template': secondPaneTemplate,
1623+
'items[1].template': firstPaneTemplate,
1624+
});
1625+
1626+
assert.strictEqual(this.getResizeHandles().length, 1);
1627+
});
1628+
1629+
QUnit.test('Layout should restore the distribution when changing the template option at runtime (T1279224)', function(assert) {
1630+
const firstPaneTemplate = () => $('<div>').text('Pane 1');
1631+
const secondPaneTemplate = () => $('<div>').text('Pane 2');
1632+
1633+
this.reinit({
1634+
dataSource: [{
1635+
size: '300px',
1636+
template: firstPaneTemplate
1637+
}, {
1638+
template: secondPaneTemplate
1639+
}]
1640+
});
1641+
1642+
this.instance.option('items[0].template', secondPaneTemplate);
1643+
1644+
this.checkItemSizes([300, 692]);
1645+
this.assertLayout(['30.2419', '69.7581']);
1646+
});
1647+
});
1648+
16081649
QUnit.module('Resizing', moduleConfig, () => {
16091650
['horizontal', 'vertical'].forEach(orientation => {
16101651
QUnit.test(`collapsed pane should move its neighboring pane on expansion to left, orientation ${orientation}`, function(assert) {
@@ -2929,6 +2970,24 @@ QUnit.module('Visibility of control elements', {
29292970
});
29302971
});
29312972
});
2973+
2974+
QUnit.test('ResizeHandle control elements visibility should be updated when changing the template option at runtime (T1279224)', function(assert) {
2975+
const firstPaneTemplate = () => $('<div>').text('Pane 1');
2976+
const secondPaneTemplate = () => $('<div>').text('Pane 2');
2977+
2978+
this.reinit({
2979+
dataSource: [{
2980+
template: firstPaneTemplate
2981+
}, {
2982+
template: secondPaneTemplate,
2983+
collapsible: true,
2984+
}]
2985+
});
2986+
2987+
this.instance.option('items[0].template', secondPaneTemplate);
2988+
2989+
this.checkIconsVisibility([{ prev: false, resize: true, next: true }]);
2990+
});
29322991
});
29332992

29342993
QUnit.module('Events', moduleConfig, () => {

0 commit comments

Comments
 (0)