Skip to content

Commit 331eda8

Browse files
authored
DataGrid/TreeList - ColumnChooser - Use new TreeView api instead custom logic in ColumnChooser to restore disabled items selection (#32768)
1 parent c735f84 commit 331eda8

3 files changed

Lines changed: 96 additions & 28 deletions

File tree

apps/react-storybook/stories/examples/datagrid/DataGrid.stories.tsx

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,55 @@ const meta: Meta<typeof DataGrid> = {
155155
}
156156
};
157157

158+
const columnChooserArgTypes: Partial<Meta<typeof DataGrid>['argTypes']> = {
159+
'columnChooser.enabled': {
160+
control: 'boolean',
161+
},
162+
'columnChooser.mode': {
163+
control: 'radio',
164+
options: ['select', 'dragAndDrop'],
165+
},
166+
'columnChooser.title': {
167+
control: 'text',
168+
},
169+
'columnChooser.height': {
170+
control: 'number',
171+
},
172+
'columnChooser.width': {
173+
control: 'number',
174+
},
175+
'columnChooser.sortOrder': {
176+
control: 'radio',
177+
options: ['asc', 'desc', 'none'],
178+
mapping: {
179+
asc: 'asc',
180+
desc: 'desc',
181+
none: undefined,
182+
},
183+
},
184+
'columnChooser.emptyPanelText': {
185+
control: 'text',
186+
},
187+
'columnChooser.container': {
188+
control: 'text',
189+
},
190+
'columnChooser.search.enabled': {
191+
control: 'boolean',
192+
},
193+
'columnChooser.search.timeout': {
194+
control: 'number',
195+
},
196+
'columnChooser.selection.allowSelectAll': {
197+
control: 'boolean',
198+
},
199+
'columnChooser.selection.recursive': {
200+
control: 'boolean',
201+
},
202+
'columnChooser.selection.selectByClick': {
203+
control: 'boolean',
204+
},
205+
};
206+
158207
export default meta;
159208

160209
type Story = StoryObj<typeof DataGrid>;
@@ -353,3 +402,46 @@ export const AiColumn: Story = {
353402
allowColumnReordering: true,
354403
},
355404
};
405+
406+
export const ColumnChooserStory: Story = {
407+
name: 'ColumnChooser',
408+
argTypes: columnChooserArgTypes,
409+
args: {
410+
'columnChooser.enabled': true,
411+
'columnChooser.mode': 'select',
412+
'columnChooser.title': 'Choose Columns',
413+
'columnChooser.height': 300,
414+
'columnChooser.width': 250,
415+
'columnChooser.sortOrder': undefined,
416+
'columnChooser.emptyPanelText': 'Drag a column here to hide it',
417+
'columnChooser.search.enabled': true,
418+
'columnChooser.search.timeout': 0,
419+
'columnChooser.selection.allowSelectAll': true,
420+
'columnChooser.selection.recursive': true,
421+
'columnChooser.selection.selectByClick': true,
422+
},
423+
render: (args) => (
424+
<DataGrid
425+
dataSource={countries}
426+
keyExpr="ID"
427+
showBorders={true}
428+
allowColumnReordering={true}
429+
{...args}
430+
>
431+
<Column dataField="ID" width={60} />
432+
<Column dataField="Country" />
433+
<Column dataField="Area" caption="Area, km²" format="fixedPoint" />
434+
<Column caption="Population">
435+
<Column dataField="Population_Total" caption="Total" format="fixedPoint" />
436+
<Column dataField="Population_Urban" caption="Urban" format="percent" />
437+
<Column dataField="Population_Rural" caption="Rural" format="percent" />
438+
</Column>
439+
<Column caption="GDP">
440+
<Column dataField="GDP_Total" caption="Total, mln $" allowHiding={false} format="fixedPoint" />
441+
<Column dataField="GDP_Agriculture" caption="Agriculture" format={{ type: 'percent', precision: 1 }} />
442+
<Column dataField="GDP_Industry" caption="Industry" format={{ type: 'percent', precision: 1 }} />
443+
<Column dataField="GDP_Services" caption="Services" format={{ type: 'percent', precision: 1 }} />
444+
</Column>
445+
</DataGrid>
446+
),
447+
};

packages/devextreme/js/__internal/grids/grid_core/column_chooser/m_column_chooser.ts

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -345,30 +345,9 @@ export class ColumnChooserView extends ColumnsView {
345345

346346
private _prepareSelectModeConfig() {
347347
const selectionOptions = this.option('columnChooser.selection') ?? {};
348-
349-
const updateSelection = (e, nodes) => {
350-
nodes
351-
.filter((node) => node.itemData.allowHiding === false)
352-
.forEach((node) => e.component.selectItem(node.key));
353-
};
354-
355-
let isUpdatingSelection = false;
356-
357348
const selectionChangedHandler = (e) => {
358-
if (isUpdatingSelection) {
359-
return;
360-
}
361-
362349
const nodes = this._getOrderedFlatNodes(e.component.getNodes());
363350

364-
e.component.beginUpdate();
365-
isUpdatingSelection = true;
366-
367-
updateSelection(e, nodes);
368-
369-
e.component.endUpdate();
370-
isUpdatingSelection = false;
371-
372351
this.component.beginUpdate();
373352
this._isUpdatingColumnVisibility = true;
374353

@@ -382,6 +361,7 @@ export class ColumnChooserView extends ColumnsView {
382361
selectByClick: selectionOptions.selectByClick,
383362
selectNodesRecursive: selectionOptions.recursive,
384363
showCheckBoxesMode: selectionOptions.allowSelectAll ? 'selectAll' : 'normal',
364+
disabledNodeSelectionMode: 'never',
385365
onSelectionChanged: selectionChangedHandler,
386366
};
387367
}
@@ -483,12 +463,6 @@ export class ColumnChooserView extends ColumnsView {
483463
return this.isColumnChooserVisible() && isParentColumnVisible && isColumnHidden;
484464
}
485465

486-
private allowColumnHeaderDragging(column) {
487-
const isDragMode = !this.isSelectMode();
488-
489-
return isDragMode && this.isColumnChooserVisible() && column.allowHiding;
490-
}
491-
492466
protected getBoundingRect() {
493467
const that = this;
494468
const container = that._popupContainer?.$overlayContent();

packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/columnChooser.integration.tests.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,9 @@ QUnit.module('Column chooser', baseModuleConfig, () => {
443443
const field2 = band1.children[0];
444444
const field3 = band1.children[1];
445445

446-
assert.strictEqual(band1.selected, undefined, 'Band column is in intermediate state');
446+
// Band column state was changed from undefined to false due to changing TreeView selection logic
447+
assert.strictEqual(band1.selected, false, 'Band column is in unselected state');
448+
447449
assert.strictEqual(field2.selected, false, 'Field 2 column is unselected');
448450
assert.strictEqual(field3.selected, true, 'Field 3 column is selected');
449451
});

0 commit comments

Comments
 (0)