Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,54 +1,57 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Text;
using Aspire.Dashboard.Components.Resize;
using Aspire.Dashboard.Model;

namespace Aspire.Dashboard.Components;

public class GridColumnManager
public class GridColumnManager(IEnumerable<GridColumn> columns, DimensionManager dimensionManager)
{
private readonly GridColumn[] _columns;
private readonly DimensionManager _dimensionManager;
private readonly Dictionary<string, GridColumn> _columnById
= columns.ToDictionary(c => c.Name, StringComparers.GridColumn);

public GridColumnManager(GridColumn[] columns, DimensionManager dimensionManager)
/// <summary>
/// Gets whether the column is known, visible, and has a width for the current viewport.
/// </summary>
public bool IsColumnVisible(string columnName)
{
if (columns.DistinctBy(c => c.Name, StringComparers.GridColumn).Count() != columns.Length)
{
throw new InvalidOperationException("There are duplicate columns");
}

_columns = columns;
_dimensionManager = dimensionManager;
return _columnById.TryGetValue(columnName, out var column) // Is a known column.
&& GetColumnWidth(column) is not null // Has width for current viewport.
&& column.IsVisible?.Invoke() is null or true; // Is visible.
}

public bool IsColumnVisible(string columnId)
{
return GetColumnWidth(_columns.First(column => column.Name == columnId)) is not null;
}

private string? GetColumnWidth(GridColumn column)
/// <summary>
/// Gets a string that can be used as the value for the grid-template-columns CSS property.
/// For example, <c>1fr 2fr 1fr</c>.
/// </summary>
/// <returns></returns>
public string GetGridTemplateColumns()
{
if (column.IsVisible is not null && !column.IsVisible())
{
return null;
}
StringBuilder sb = new();

if (_dimensionManager.ViewportInformation.IsDesktop)
foreach (var (_, column) in _columnById)
{
return column.DesktopWidth;
if (column.IsVisible?.Invoke() is null or true &&
GetColumnWidth(column) is string width)
{
if (sb.Length > 0)
{
sb.Append(' ');
}

sb.Append(width);
}
}

return column.MobileWidth;
return sb.ToString();
}

public string GetGridTemplateColumns()
private string? GetColumnWidth(GridColumn column)
{
var visibleColumns = _columns
.Select(GetColumnWidth)
.Where(s => s is not null)
.Select(s => s!);

return string.Join(" ", visibleColumns);
return dimensionManager.ViewportInformation.IsDesktop
? column.DesktopWidth
: column.MobileWidth;
}
}