@using System.Drawing
@using Rms.Risk.Mango.Pivot.Core
@if (_pivotRows is { Length: > 0 })
@*
* dbMango
*
* Copyright 2025 Deutsche Bank AG
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*@
{
@foreach (var field in _pivotRows[0].GetDynamicMemberNames())
{
@TableControl.ConvertToString(TableControl.GetLambdaForValue(field)(context.Row), _pivotRows[0].GetFormat(field))
}
}
@code{
[Parameter]
public IPivotedData? PivotData
{
get;
set
{
if (field == value)
return;
field = value;
_totals.Clear();
if (field == null)
{
_pivotRows = [];
InvokeAsync(StateHasChanged);
return;
}
_shadowHeaders = field.GetColumnPositions();
_descriptorsCache.Clear();
_pivotRows = Enumerable
.Range(0, field.Count)
.Select(x => new PivotRow(field, x, _shadowHeaders, GetColumnDescriptorInternal, GetFieldDescriptorInternal))
.ToArray()
;
_totals.Update(field);
InvokeAsync(StateHasChanged);
}
}
[Parameter] public int Rows { get; set; } = 35;
[Parameter] public bool ShowTotals { get; set; }
private PivotRow[] _pivotRows = [];
private MinMaxCache _totals = new();
private Dictionary _shadowHeaders = [];
private readonly Dictionary _descriptorsCache = new();
private TableControl.SortModeType SortMode { get; set; }
private string? SortColumn { get; set; }
private IMinMaxCache? VisibleTotals => ShowTotals ? _totals : null;
private readonly PivotColumnDescriptor _defaultPivotColumnDescriptor = new()
{
Format = "N0",
NameRegexString = ".*",
Background = Color.FromName(Night.Background),
AlternateBackground = Color.FromName(Night.BackgroundLight)
};
private PivotColumnDescriptor GetColumnDescriptorInternal(string columnName)
{
if (_descriptorsCache.TryGetValue(columnName, out var desc))
return desc;
desc = _defaultPivotColumnDescriptor;
_descriptorsCache[columnName] = desc;
return desc;
}
private string ColumnClass
{
get
{
//This is a little awkward, usually the table control will auto wrap long headers when they contain spaces, but we have some pivots currently that have
//a combination of long columns with and without spaces. Wrapping looks weird here, so we want to turn off wrapping if we can
//detect any column which has a long name without spaces
if ( _pivotRows != null &&
(_pivotRows[0].GetDynamicMemberNames().Count() <= 16
|| _pivotRows[0].GetDynamicMemberNames().Any( n => n.Length >= 10 && !n.Contains( " " ) )
)
)
{
return "table-nowrap";
}
return string.Empty;
}
}
private PivotFieldDescriptor? GetFieldDescriptorInternal( string columnName ) => null;
private string GetCellClassCallback( dynamic row, TableColumnControl col ) => "";
}