You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Connected.Components/Components/Table/TableGroupDefinition.cs

151 lines
3.4 KiB

2 years ago
// Copyright (c) MudBlazor 2021
// MudBlazor licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System.Diagnostics.CodeAnalysis;
namespace Connected.Components;
public class TableGroupDefinition<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] T>
{
public TableGroupDefinition()
{
}
public TableGroupDefinition(Func<T, object> selector, TableGroupDefinition<T> innerGroup = null)
{
Selector = selector;
InnerGroup = innerGroup;
}
/// <summary>
/// Gets or Sets the Group Name. It's useful for use on Header, for example.
/// </summary>
public string GroupName { get; set; }
/// <summary>
/// The selector func to be used on .GroupBy() with LINQ.
/// </summary>
public Func<T, object> Selector { get; set; }
private TableGroupDefinition<T> _innerGroup;
public TableGroupDefinition<T> InnerGroup
{
get => _innerGroup;
set
{
if (_innerGroup != null)
{
_innerGroup.Parent = null;
_innerGroup.Context = null;
}
_innerGroup = value;
if (_innerGroup != null)
{
_innerGroup.Parent = this;
_innerGroup.Indentation = Indentation;
_innerGroup.Context = Context;
}
}
}
internal TableGroupDefinition<T> Parent { get; private set; }
private bool _indentation;
/// <summary>
/// Gets or Sets if First Column cell must have Indentation.
/// It must be set on First grouping level and works recursively.
/// </summary>
public bool Indentation
{
get => _indentation;
set
{
_indentation = value;
if (InnerGroup != null)
InnerGroup.Indentation = value;
}
}
private bool _expandable = false;
/// <summary>
/// Gets or Sets is group header can Expand and Collapse its children.
/// </summary>
public bool Expandable
{
get => _expandable;
set
{
_expandable = value;
if (_expandable == false)
Context?.GroupRows.Where(gr => gr.GroupDefinition == this).ToList().ForEach(gr => gr.IsExpanded = IsInitiallyExpanded);
}
}
private bool _isInitiallyExpanded = true;
/// <summary>
/// Gets or Sets if expandable group header is collapsed or expanded on initialization.
/// </summary>
public bool IsInitiallyExpanded
{
get => _isInitiallyExpanded;
set
{
_isInitiallyExpanded = value;
}
}
internal bool IsParentExpandable
{
get
{
if (Parent?.Expandable ?? false)
return true;
else
return Parent?.IsParentExpandable ?? false;
}
}
internal bool IsThisOrParentExpandable
{
get
{
if (Expandable)
return Expandable;
else
return Parent?.IsThisOrParentExpandable ?? false;
}
}
internal int Level
{
get
{
if (Parent == null)
return 1;
else
return Parent.Level + 1;
}
}
private TableContext<T> _context;
internal TableContext<T> Context
{
get => _context;
set
{
_context = value;
if (_innerGroup != null)
{
_innerGroup.Context = _context;
}
}
}
}