Skip to content

Commit fb27faa

Browse files
authored
[DataGrid] Add MinWidth parameter to ColumnBase (#4112)
* Add MinWidth parameter to ColumnBase and use it in DataGrid resize actions * Update verified files
1 parent a5b184f commit fb27faa

14 files changed

+39
-21
lines changed

examples/Demo/Shared/Microsoft.FluentUI.AspNetCore.Components.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1300,6 +1300,14 @@
13001300
Needs to be a valid CSS width value like '100px', '10%' or '0.5fr'.
13011301
</summary>
13021302
</member>
1303+
<member name="P:Microsoft.FluentUI.AspNetCore.Components.ColumnBase`1.MinWidth">
1304+
<summary>
1305+
Gets or sets the minimal width of the column.
1306+
Defaults to 100px for a regular column and 50px for a select column.
1307+
When resizing a column, the user will not be able to make it smaller than this value.
1308+
Needs to be a valid CSS width value like '100px', '10%' or '0.5fr'.
1309+
</summary>
1310+
</member>
13031311
<member name="P:Microsoft.FluentUI.AspNetCore.Components.ColumnBase`1.Grid">
13041312
<summary>
13051313
Gets a reference to the enclosing <see cref="T:Microsoft.FluentUI.AspNetCore.Components.FluentDataGrid`1" />.

src/Core/Components/DataGrid/Columns/ColumnBase.razor.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,15 @@ public abstract partial class ColumnBase<TGridItem>
151151
[Parameter]
152152
public string? Width { get; set; }
153153

154+
/// <summary>
155+
/// Gets or sets the minimal width of the column.
156+
/// Defaults to 100px for a regular column and 50px for a select column.
157+
/// When resizing a column, the user will not be able to make it smaller than this value.
158+
/// Needs to be a valid CSS width value like '100px', '10%' or '0.5fr'.
159+
/// </summary>
160+
[Parameter]
161+
public string MinWidth { get; set; } = "100px";
162+
154163
/// <summary>
155164
/// Gets a reference to the enclosing <see cref="FluentDataGrid{TGridItem}" />.
156165
/// </summary>

src/Core/Components/DataGrid/Columns/SelectColumn.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public class SelectColumn<TGridItem> : ColumnBase<TGridItem>, IDisposable
3636
public SelectColumn()
3737
{
3838
Width = "50px";
39+
MinWidth = "50px";
3940
ChildContent = GetDefaultChildContent();
4041

4142
_itemsChanged = new(EventCallback.Factory.Create<object?>(this, UpdateSelectedItemsAsync));

src/Core/Components/DataGrid/FluentDataGrid.razor.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
let grids = [];
2-
const minWidth = 100;
32

43
export function init(gridElement, autoFocus) {
54
if (gridElement === undefined || gridElement === null) {
@@ -255,7 +254,7 @@ export function enableColumnResizing(gridElement, resizeColumnOnAllRows = true)
255254
const diffX = isRTL ? pageX - e.pageX : e.pageX - pageX;
256255
const column = columns.find(({ header }) => header === curCol);
257256

258-
column.size = parseInt(Math.max(minWidth, curColWidth + diffX), 10) + 'px';
257+
column.size = parseInt(Math.max(parseInt(column.header.style.minWidth), curColWidth + diffX), 10) + 'px';
259258

260259
columns.forEach((col) => {
261260
if (col.size.startsWith('minmax')) {
@@ -373,7 +372,7 @@ export function resizeColumnDiscrete(gridElement, column, change) {
373372
const width = headerBeingResized.getBoundingClientRect().width + change;
374373

375374
if (change < 0) {
376-
column.size = Math.max(minWidth, width) + 'px';
375+
column.size = Math.max(parseInt(column.header.style.minWidth), width) + 'px';
377376
}
378377
else {
379378
column.size = width + 'px';
@@ -400,7 +399,7 @@ export function resizeColumnExact(gridElement, column, width) {
400399

401400
grids.find(({ id }) => id === gridElement.id).columns.forEach(column => {
402401
if (column.header === headerBeingResized) {
403-
column.size = Math.max(minWidth, width) + 'px';
402+
column.size = Math.max(parseInt(column.header.style.minWidth), width) + 'px';
404403
}
405404
else {
406405
if (column.size.startsWith('minmax')) {

src/Core/Components/DataGrid/FluentDataGridCell.razor.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ public partial class FluentDataGridCell<TGridItem> : FluentComponentBase
7171
.AddStyle("grid-column", GridColumn.ToString(), () => !Grid.EffectiveLoadingValue && (Grid.Items is not null || Grid.ItemsProvider is not null) && Grid.DisplayMode == DataGridDisplayMode.Grid)
7272
.AddStyle("text-align", "center", Column is SelectColumn<TGridItem>)
7373
.AddStyle("align-content", "center", Column is SelectColumn<TGridItem>)
74+
.AddStyle("min-width", Column?.MinWidth, Owner.RowType == DataGridRowType.Header)
7475
.AddStyle("padding-inline-start", "calc(((var(--design-unit)* 3) + var(--focus-stroke-width) - var(--stroke-width))* 1px)", Column is SelectColumn<TGridItem> && Owner.RowType == DataGridRowType.Default)
7576
.AddStyle("padding-top", "calc(var(--design-unit) * 2.5px)", Column is SelectColumn<TGridItem> && (Grid.RowSize == DataGridRowSize.Medium || Owner.RowType == DataGridRowType.Header))
7677
.AddStyle("padding-top", "calc(var(--design-unit) * 1.5px)", Column is SelectColumn<TGridItem> && Grid.RowSize == DataGridRowSize.Small && Owner.RowType == DataGridRowType.Default)

tests/Core/DataGrid/DataGridSortByTests.DataGridSortByTests_SortByColumnIndex_Ascending.verified.razor.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<table id="xxx" class="fluent-data-grid grid" style="grid-template-columns: 1fr 1fr;" aria-rowcount="5" blazor:onclosecolumnoptions="1" blazor:onclosecolumnresize="2" b-ppmhrkw1mj="" blazor:elementreference="">
33
<thead b-ppmhrkw1mj="">
44
<tr class="fluent-data-grid-row" data-row-index="0" role="row" row-type="header" blazor:onkeydown="3" blazor:onclick="4" blazor:ondblclick="5" blazor:onfocus="6" b-upi3f9mbnn="">
5-
<th col-index="1" class="column-header col-justify-start col-sort-asc" style="grid-column: 1; height: 32px; min-height: 44px; z-index: 5;" blazor:oncontextmenu:preventdefault="" blazor:onkeydown="27" blazor:onclick="28" blazor:onfocus="29" scope="col" aria-sort="ascending" b-w6qdxfylwy="">
5+
<th col-index="1" class="column-header col-justify-start col-sort-asc" style="grid-column: 1; min-width: 100px; height: 32px; min-height: 44px; z-index: 5;" blazor:oncontextmenu:preventdefault="" blazor:onkeydown="27" blazor:onclick="28" blazor:onfocus="29" scope="col" aria-sort="ascending" b-w6qdxfylwy="">
66
<div style="display: flex; justify-content: flex-start;" b-pxhtqoo8qd="">
77
<span class="keycapture" style="width: 100%;" blazor:oncontextmenu="57" blazor:elementreference="">
88
<fluent-button class="col-sort-button" style="width: calc(100% - 10px);" type="button" appearance="stealth" blazor:onclick="58" b-x1200685t0="" blazor:elementreference="">
@@ -14,7 +14,7 @@
1414
</span>
1515
</div>
1616
</th>
17-
<th col-index="2" class="column-header col-justify-start" style="grid-column: 2; height: 32px; min-height: 44px; z-index: 5;" blazor:oncontextmenu:preventdefault="" blazor:onkeydown="30" blazor:onclick="31" blazor:onfocus="32" scope="col" aria-sort="none" b-w6qdxfylwy="">
17+
<th col-index="2" class="column-header col-justify-start" style="grid-column: 2; min-width: 100px; height: 32px; min-height: 44px; z-index: 5;" blazor:oncontextmenu:preventdefault="" blazor:onkeydown="30" blazor:onclick="31" blazor:onfocus="32" scope="col" aria-sort="none" b-w6qdxfylwy="">
1818
<div style="display: flex; justify-content: flex-start;" b-pxhtqoo8qd="">
1919
<div class="col-title" style="width: calc(100% - 10px);" b-pxhtqoo8qd="">
2020
<div class="col-title-text" b-pxhtqoo8qd="">Item2</div>

tests/Core/DataGrid/DataGridSortByTests.DataGridSortByTests_SortByColumnIndex_Descending.verified.razor.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<table id="xxx" class="fluent-data-grid grid" style="grid-template-columns: 1fr 1fr;" aria-rowcount="5" blazor:onclosecolumnoptions="1" blazor:onclosecolumnresize="2" b-ppmhrkw1mj="" blazor:elementreference="">
33
<thead b-ppmhrkw1mj="">
44
<tr class="fluent-data-grid-row" data-row-index="0" role="row" row-type="header" blazor:onkeydown="3" blazor:onclick="4" blazor:ondblclick="5" blazor:onfocus="6" b-upi3f9mbnn="">
5-
<th col-index="1" class="column-header col-justify-start col-sort-desc" style="grid-column: 1; height: 32px; min-height: 44px; z-index: 5;" blazor:oncontextmenu:preventdefault="" blazor:onkeydown="27" blazor:onclick="28" blazor:onfocus="29" scope="col" aria-sort="descending" b-w6qdxfylwy="">
5+
<th col-index="1" class="column-header col-justify-start col-sort-desc" style="grid-column: 1; min-width: 100px; height: 32px; min-height: 44px; z-index: 5;" blazor:oncontextmenu:preventdefault="" blazor:onkeydown="27" blazor:onclick="28" blazor:onfocus="29" scope="col" aria-sort="descending" b-w6qdxfylwy="">
66
<div style="display: flex; justify-content: flex-start;" b-pxhtqoo8qd="">
77
<span class="keycapture" style="width: 100%;" blazor:oncontextmenu="57" blazor:elementreference="">
88
<fluent-button class="col-sort-button" style="width: calc(100% - 10px);" type="button" appearance="stealth" blazor:onclick="58" b-x1200685t0="" blazor:elementreference="">
@@ -14,7 +14,7 @@
1414
</span>
1515
</div>
1616
</th>
17-
<th col-index="2" class="column-header col-justify-start" style="grid-column: 2; height: 32px; min-height: 44px; z-index: 5;" blazor:oncontextmenu:preventdefault="" blazor:onkeydown="30" blazor:onclick="31" blazor:onfocus="32" scope="col" aria-sort="none" b-w6qdxfylwy="">
17+
<th col-index="2" class="column-header col-justify-start" style="grid-column: 2; min-width: 100px; height: 32px; min-height: 44px; z-index: 5;" blazor:oncontextmenu:preventdefault="" blazor:onkeydown="30" blazor:onclick="31" blazor:onfocus="32" scope="col" aria-sort="none" b-w6qdxfylwy="">
1818
<div style="display: flex; justify-content: flex-start;" b-pxhtqoo8qd="">
1919
<div class="col-title" style="width: calc(100% - 10px);" b-pxhtqoo8qd="">
2020
<div class="col-title-text" b-pxhtqoo8qd="">Item2</div>

tests/Core/DataGrid/DataGridSortByTests.DataGridSortByTests_SortByColumnTitle_Ascending.verified.razor.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<table id="xxx" class="fluent-data-grid grid" style="grid-template-columns: 1fr 1fr;" aria-rowcount="5" blazor:onclosecolumnoptions="1" blazor:onclosecolumnresize="2" b-ppmhrkw1mj="" blazor:elementreference="">
33
<thead b-ppmhrkw1mj="">
44
<tr class="fluent-data-grid-row" data-row-index="0" role="row" row-type="header" blazor:onkeydown="3" blazor:onclick="4" blazor:ondblclick="5" blazor:onfocus="6" b-upi3f9mbnn="">
5-
<th col-index="1" class="column-header col-justify-start col-sort-asc" style="grid-column: 1; height: 32px; min-height: 44px; z-index: 5;" blazor:oncontextmenu:preventdefault="" blazor:onkeydown="27" blazor:onclick="28" blazor:onfocus="29" scope="col" aria-sort="ascending" b-w6qdxfylwy="">
5+
<th col-index="1" class="column-header col-justify-start col-sort-asc" style="grid-column: 1; min-width: 100px; height: 32px; min-height: 44px; z-index: 5;" blazor:oncontextmenu:preventdefault="" blazor:onkeydown="27" blazor:onclick="28" blazor:onfocus="29" scope="col" aria-sort="ascending" b-w6qdxfylwy="">
66
<div style="display: flex; justify-content: flex-start;" b-pxhtqoo8qd="">
77
<span class="keycapture" style="width: 100%;" blazor:oncontextmenu="57" blazor:elementreference="">
88
<fluent-button class="col-sort-button" style="width: calc(100% - 10px);" type="button" appearance="stealth" blazor:onclick="58" b-x1200685t0="" blazor:elementreference="">
@@ -14,7 +14,7 @@
1414
</span>
1515
</div>
1616
</th>
17-
<th col-index="2" class="column-header col-justify-start" style="grid-column: 2; height: 32px; min-height: 44px; z-index: 5;" blazor:oncontextmenu:preventdefault="" blazor:onkeydown="30" blazor:onclick="31" blazor:onfocus="32" scope="col" aria-sort="none" b-w6qdxfylwy="">
17+
<th col-index="2" class="column-header col-justify-start" style="grid-column: 2; min-width: 100px; height: 32px; min-height: 44px; z-index: 5;" blazor:oncontextmenu:preventdefault="" blazor:onkeydown="30" blazor:onclick="31" blazor:onfocus="32" scope="col" aria-sort="none" b-w6qdxfylwy="">
1818
<div style="display: flex; justify-content: flex-start;" b-pxhtqoo8qd="">
1919
<div class="col-title" style="width: calc(100% - 10px);" b-pxhtqoo8qd="">
2020
<div class="col-title-text" b-pxhtqoo8qd="">Item2</div>

tests/Core/DataGrid/DataGridSortByTests.DataGridSortByTests_SortByColumnTitle_Descending.verified.razor.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<table id="xxx" class="fluent-data-grid grid" style="grid-template-columns: 1fr 1fr;" aria-rowcount="5" blazor:onclosecolumnoptions="1" blazor:onclosecolumnresize="2" b-ppmhrkw1mj="" blazor:elementreference="">
33
<thead b-ppmhrkw1mj="">
44
<tr class="fluent-data-grid-row" data-row-index="0" role="row" row-type="header" blazor:onkeydown="3" blazor:onclick="4" blazor:ondblclick="5" blazor:onfocus="6" b-upi3f9mbnn="">
5-
<th col-index="1" class="column-header col-justify-start col-sort-desc" style="grid-column: 1; height: 32px; min-height: 44px; z-index: 5;" blazor:oncontextmenu:preventdefault="" blazor:onkeydown="27" blazor:onclick="28" blazor:onfocus="29" scope="col" aria-sort="descending" b-w6qdxfylwy="">
5+
<th col-index="1" class="column-header col-justify-start col-sort-desc" style="grid-column: 1; min-width: 100px; height: 32px; min-height: 44px; z-index: 5;" blazor:oncontextmenu:preventdefault="" blazor:onkeydown="27" blazor:onclick="28" blazor:onfocus="29" scope="col" aria-sort="descending" b-w6qdxfylwy="">
66
<div style="display: flex; justify-content: flex-start;" b-pxhtqoo8qd="">
77
<span class="keycapture" style="width: 100%;" blazor:oncontextmenu="57" blazor:elementreference="">
88
<fluent-button class="col-sort-button" style="width: calc(100% - 10px);" type="button" appearance="stealth" blazor:onclick="58" b-x1200685t0="" blazor:elementreference="">
@@ -14,7 +14,7 @@
1414
</span>
1515
</div>
1616
</th>
17-
<th col-index="2" class="column-header col-justify-start" style="grid-column: 2; height: 32px; min-height: 44px; z-index: 5;" blazor:oncontextmenu:preventdefault="" blazor:onkeydown="30" blazor:onclick="31" blazor:onfocus="32" scope="col" aria-sort="none" b-w6qdxfylwy="">
17+
<th col-index="2" class="column-header col-justify-start" style="grid-column: 2; min-width: 100px; height: 32px; min-height: 44px; z-index: 5;" blazor:oncontextmenu:preventdefault="" blazor:onkeydown="30" blazor:onclick="31" blazor:onfocus="32" scope="col" aria-sort="none" b-w6qdxfylwy="">
1818
<div style="display: flex; justify-content: flex-start;" b-pxhtqoo8qd="">
1919
<div class="col-title" style="width: calc(100% - 10px);" b-pxhtqoo8qd="">
2020
<div class="col-title-text" b-pxhtqoo8qd="">Item2</div>

tests/Core/DataGrid/FluentDataGridColumSelectTests.FluentDataGrid_ColumSelect_MultiSelect_Customized_Rendering.verified.razor.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
<table id="xxx" class="fluent-data-grid grid" style="grid-template-columns: 50px auto;" aria-rowcount="4" blazor:onclosecolumnoptions="1" blazor:onclosecolumnresize="2" b-ppmhrkw1mj="" blazor:elementreference="">
33
<thead b-ppmhrkw1mj="">
44
<tr class="fluent-data-grid-row" data-row-index="0" role="row" row-type="header" blazor:onkeydown="3" blazor:onclick="4" blazor:ondblclick="5" blazor:onfocus="6" b-upi3f9mbnn="">
5-
<th col-index="1" class="column-header select-all col-justify-center" style="grid-column: 1; text-align: center; align-content: center; padding-top: calc(var(--design-unit) * 2.5px); height: 32px; min-height: 44px; z-index: 5;" blazor:oncontextmenu:preventdefault="" blazor:onkeydown="23" blazor:onclick="24" blazor:onfocus="25" scope="col" aria-sort="none" b-w6qdxfylwy="">
5+
<th col-index="1" class="column-header select-all col-justify-center" style="grid-column: 1; text-align: center; align-content: center; min-width: 50px; padding-top: calc(var(--design-unit) * 2.5px); height: 32px; min-height: 44px; z-index: 5;" blazor:oncontextmenu:preventdefault="" blazor:onkeydown="23" blazor:onclick="24" blazor:onfocus="25" scope="col" aria-sort="none" b-w6qdxfylwy="">
66
<div style="cursor: pointer; margin-left: 12px;" blazor:onclick="26" blazor:onkeydown="27"></div>
77
</th>
8-
<th col-index="2" class="column-header col-justify-start" style="grid-column: 2; height: 32px; min-height: 44px; z-index: 5;" blazor:oncontextmenu:preventdefault="" blazor:onkeydown="28" blazor:onclick="29" blazor:onfocus="30" scope="col" aria-sort="none" b-w6qdxfylwy="">
8+
<th col-index="2" class="column-header col-justify-start" style="grid-column: 2; min-width: 100px; height: 32px; min-height: 44px; z-index: 5;" blazor:oncontextmenu:preventdefault="" blazor:onkeydown="28" blazor:onclick="29" blazor:onfocus="30" scope="col" aria-sort="none" b-w6qdxfylwy="">
99
<div style="display: flex; justify-content: flex-start;" b-pxhtqoo8qd="">
1010
<div class="col-title" style="width: calc(100% - 10px);" b-pxhtqoo8qd="">
1111
<div class="col-title-text" b-pxhtqoo8qd="">Name</div>

0 commit comments

Comments
 (0)