Skip to content

Commit ead3225

Browse files
committed
fix(datagrid-web): enforce filter-aware minimum width during column resize
1 parent 9d0e652 commit ead3225

8 files changed

Lines changed: 70 additions & 19 deletions

File tree

packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -591,6 +591,13 @@ $root: ".widget-datagrid";
591591

592592
.grid-mock-header {
593593
display: contents;
594+
595+
span {
596+
visibility: hidden;
597+
height: 0;
598+
display: block;
599+
overflow: hidden;
600+
}
594601
}
595602

596603
:where(#{$root}-paging-bottom, #{$root}-padding-top) {

packages/pluggableWidgets/datagrid-web/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66

77
## [Unreleased]
88

9+
### Fixed
10+
11+
- We fixed an issue where columns could be resized narrower than their header filter widget required, making filters unusable.
12+
913
## [3.8.1] - 2026-02-19
1014

1115
### Fixed

packages/pluggableWidgets/datagrid-web/src/components/GridHeader.tsx

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,29 @@ export function GridHeader(): ReactElement {
2424
<div className="widget-datagrid-grid-head" role="rowgroup" ref={gridSizeStore.gridHeaderRef}>
2525
<div key="headers_row" className="tr" role="row">
2626
<CheckboxColumnHeader key="headers_column_select_all" />
27-
{columns.map(column => (
28-
<ColumnProvider column={column} key={`${column.columnId}`}>
29-
<Header
30-
dropTarget={dragOver}
31-
isDragging={isDragging}
32-
resizer={
33-
<ColumnResizer
34-
onResizeStart={() => columnsStore.setIsResizing(true)}
35-
onResizeEnds={() => columnsStore.setIsResizing(false)}
36-
setColumnWidth={(width: number) => column.setSize(width)}
37-
/>
38-
}
39-
setDropTarget={setDragOver}
40-
setIsDragging={setIsDragging}
41-
/>
42-
</ColumnProvider>
43-
))}
27+
{columns.map(column => {
28+
const filterMinWidth = columnsStore.columnFilters[column.columnIndex]?.suggestedMinWidth ?? 0;
29+
const minWidth = Math.max(50, column.minWidthLimit, filterMinWidth);
30+
31+
return (
32+
<ColumnProvider column={column} key={`${column.columnId}`}>
33+
<Header
34+
dropTarget={dragOver}
35+
isDragging={isDragging}
36+
resizer={
37+
<ColumnResizer
38+
minWidth={minWidth}
39+
onResizeStart={() => columnsStore.setIsResizing(true)}
40+
onResizeEnds={() => columnsStore.setIsResizing(false)}
41+
setColumnWidth={(width: number) => column.setSize(width)}
42+
/>
43+
}
44+
setDropTarget={setDragOver}
45+
setIsDragging={setIsDragging}
46+
/>
47+
</ColumnProvider>
48+
);
49+
})}
4450
{columnsHidable && (
4551
<ColumnSelector
4652
key="headers_column_selector"

packages/pluggableWidgets/datagrid-web/src/components/MockHeader.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ export function MockHeader(): ReactNode {
4646
// as this mock header is aligned with CSS grid, so it is more reliable
4747
// the real header is aligned programmatically based on this header
4848
ref={ref => c.setHeaderElementRef(ref)}
49-
></div>
49+
>
50+
<span>{c.header}</span>
51+
</div>
5052
))}
5153
{config.selectorColumnEnabled && <div data-column-id="selector" key={"selector"}></div>}
5254
</div>

packages/pluggableWidgets/datagrid-web/src/helpers/ColumnBase.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ interface BaseColumnProps {
88
width: WidthEnum;
99
size: number | null;
1010
alignment: AlignmentEnum;
11-
1211
wrapText: boolean;
1312
minWidth: MinWidthEnum;
1413
minWidthLimit: number;
@@ -45,6 +44,10 @@ export class BaseColumn {
4544
return this.properties.wrapText;
4645
}
4746

47+
get minWidthLimit(): number {
48+
return this.properties.minWidthLimit;
49+
}
50+
4851
getCssWidth(): string {
4952
switch (this.properties.width) {
5053
case "autoFit": {

packages/pluggableWidgets/datagrid-web/src/helpers/state/column/ColumnFilterStore.tsx

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,12 @@ export class ColumnFilterStore implements IColumnFilterStore {
2727
private _filterStore: FilterStore | null = null;
2828
private _context: FilterAPI;
2929
private _filterHost: ObservableFilterHost;
30+
private _attributeType: ListAttributeValue["type"] | undefined;
3031

3132
constructor(props: ColumnsType, info: StaticInfo, filterHost: ObservableFilterHost) {
3233
this._filterHost = filterHost;
3334
this._widget = props.filter;
35+
this._attributeType = isListAttributeValue(props.attribute) ? props.attribute.type : undefined;
3436
const storeResult = this.createFilterStore(props, null);
3537
if (storeResult === null) {
3638
this._error = this._filterStore = null;
@@ -104,6 +106,28 @@ export class ColumnFilterStore implements IColumnFilterStore {
104106
this._filterStore?.fromJSON(data);
105107
}
106108
}
109+
110+
get suggestedMinWidth(): number {
111+
if (this._attributeType === undefined) {
112+
return 0;
113+
}
114+
switch (this._attributeType) {
115+
case "DateTime":
116+
return 150;
117+
case "AutoNumber":
118+
case "Decimal":
119+
case "Integer":
120+
case "Long":
121+
return 120;
122+
case "String":
123+
case "HashString":
124+
case "Boolean":
125+
case "Enum":
126+
return 100;
127+
default:
128+
return 0;
129+
}
130+
}
107131
}
108132

109133
const isListAttributeValue = (

packages/pluggableWidgets/datagrid-web/src/helpers/state/column/ColumnStore.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,10 @@ export class ColumnStore implements GridColumn {
112112
return this.baseInfo.draggable;
113113
}
114114

115+
get minWidthLimit(): number {
116+
return this.baseInfo.minWidthLimit;
117+
}
118+
115119
// hiding
116120
get canHide(): boolean {
117121
return this.baseInfo.hidable;

packages/pluggableWidgets/datagrid-web/src/typings/GridColumn.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export interface GridColumn {
3333

3434
// sizing
3535
canResize: boolean;
36+
minWidthLimit: number;
3637
size: number | undefined;
3738
setSize(size: number): void;
3839
getCssWidth(): string;

0 commit comments

Comments
 (0)