@using System.Dynamic
@using System.Reflection
@using log4net
@using Rms.Risk.Mango.Pivot.Core.Models
@using Rms.Risk.Mango.Pivot.Core
@*
* 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.
*@
@code
{
private static readonly ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod()!.DeclaringType!);
[Parameter]
public IPivotTableDataSource? PivotService
{
get;
set
{
field = value;
UpdatePivot();
}
}
[Parameter] public Func> HandleCellClick { get; set; } = (_, _) => Task.FromResult(false);
[Parameter] public Func GetColumnDescriptor { get; set; } = _ => null;
[Parameter] public bool EnableAutoUpdate { get; set; } = true;
[Parameter] public int Rows { get; set; } = 35;
[Parameter]
public bool Transpose
{
get;
set
{
field = value;
UpdatePivot();
}
} = false;
[Parameter] public string Class { get; set; } = "";
[Parameter]
public string? CollectionName
{
get;
set
{
if (string.Equals(field, value))
return;
field = value;
UpdatePivot();
}
}
[Parameter]
public string? PivotName
{
get;
set
{
if (string.Equals(field, value))
return;
field = value;
UpdatePivot();
}
}
[Parameter]
public FilterExpressionTree.ExpressionGroup? ExtraFilter
{
get;
set
{
if (value == null)
{
field = null;
return;
}
if (field == value)
return;
field = value;
UpdatePivot();
}
}
[Parameter]
public List Collections
{
get;
set
{
field = value;
UpdatePivot();
}
} = [];
[Parameter]
public IPivotedData? PivotData
{
get;
set
{
if (field == value)
return;
field = value;
PivotDataChanged.InvokeAsync(field);
InvokeAsync(StateHasChanged);
}
}
[Parameter] public EventCallback PivotDataChanged { get; set; }
private readonly FilterExpressionTree.ExpressionGroup _noFilter = new();
private PivotTableComponent? PivotTable
{
get;
set
{
field = value;
UpdatePivot();
}
}
private async void UpdatePivot()
{
try
{
await InvokeAsync(StateHasChanged);
if ( !EnableAutoUpdate )
return;
await Refresh();
}
catch (Exception e)
{
_log.Error(e.Message, e);
}
}
public async Task Refresh()
{
if (PivotName == null || CollectionName == null || PivotService == null || PivotTable == null)
return;
if (Collections.Count == 0)
{
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));
var collections = await PivotService.GetAllMeta(token: cts.Token);
Collections.Clear();
Collections.AddRange(collections);
}
#pragma warning disable BL0005
// WARNING: using hack here to set PivotTable.SelectedXXX parameters.
// Usual way via StateHasChanged is not working due to a race condition
// Somehow it related to multiple SimplePivotComponent on one page
PivotTable.SelectedPivotNode = new() {Text = "", Pivot = new() };
PivotTable.SelectedCollectionNode = Collections.FirstOrDefault(x => x.CollectionNameWithPrefix == CollectionName);
if ( PivotTable.SelectedCollectionNode != null )
PivotTable.SelectedPivotNode = PivotTable.SelectedCollectionNode.Pivots.FirstOrDefault(x => x.Pivot.Name == PivotName);
await InvokeAsync(StateHasChanged);
if (PivotTable.SelectedPivotNode == null)
return;
#pragma warning restore BL0005
await PivotTable.RunPivot(PivotTable.SelectedPivotNode.Pivot, ExtraFilter ?? _noFilter, addToNavigation: false);
if ( Transpose )
{
PivotData = SimpleTranspose.Transpose(PivotData);
}
}
}