dbMango/Rms.Risk.Mango.Pivot.UI/Pivot/PivotOptionsComponent.razor
Alexander Shabarshov 2a7a24c9e7 Initial contribution
2025-11-03 14:43:26 +00:00

380 lines
14 KiB
Plaintext

@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.
*@
<div class="@Class">
@if ( _pivot != null )
{
<div class="@_rowClass">
<div class="flex-stack-horizontal w-100 mr-3">
<label class="input-group-text w-75" style="min-width: 200px;">User visible</label>
<label class="toggle-switch toggle-switch-xs input-group-text" style="display: inline-block">
<input type="checkbox" @bind="_pivot.UserVisible"/>
<span class="slider" data-label-on="on" data-label-off="off"></span>
</label>
</div>
</div>
<div class="@_rowClass">
<div class="form-group w-100 mr-3">
<label for="order">Columns order</label>
<div class="input-group mr-sm-2">
<textarea class="w-100 form-control" rows="5" @bind="ColumnOrder" id="order"></textarea>
</div>
</div>
</div>
<div class="@_rowClass">
<div class="form-group w-100 mr-3">
<label for="rename">Rename columns</label>
<div class="input-group mr-sm-2">
<textarea class="w-100 form-control" rows="5" @bind="RenameColumns" id="rename"></textarea>
</div>
</div>
</div>
<div class="@_rowClass">
<div class="form-group w-100 mr-3">
<label for="highlightTop">Highlight top/bottom N% (0 - off)</label>
<div class="input-group mr-sm-2">
<input type="text" class="input-group-text w-100" @bind="_pivot.HighlightTopPercent" id="highlightTop"/>
</div>
</div>
</div>
<div class="@_rowClass">
<div class="flex-stack-horizontal w-100 mr-3">
<label class="input-group-text w-75" style="min-width: 200px;">Show totals row</label>
<label class="toggle-switch toggle-switch-xs input-group-text" style="display: inline-block">
<input type="checkbox" @bind="_pivot.ShowTotals"/>
<span class="slider" data-label-on="on" data-label-off="off"></span>
</label>
</div>
</div>
<div class="@_rowClass">
<div class="flex-stack-horizontal w-100 mr-3">
<label class="input-group-text w-75" style="min-width: 200px;">Make 2D pivot</label>
<label class="toggle-switch toggle-switch-xs input-group-text" style="display: inline-block">
<input type="checkbox" @bind="_pivot.Make2DPivot"/>
<span class="slider" data-label-on="on" data-label-off="off"></span>
</label>
</div>
</div>
@if ( _pivot.Make2DPivot )
{
<div class="@_rowClass">
<div class="form-group w-100 mr-3">
<label for="pivot2drows">2D pivot row headers</label>
<div class="input-group mr-sm-2">
<textarea class="w-100 form-control" rows="5" @bind="Pivot2DRows" id="pivot2drows"></textarea>
</div>
</div>
</div>
<div class="@_rowClass">
<div class="form-group w-100 mr-3">
<label for="pivot2dcol">2D pivot column header</label>
<div class="input-group mr-sm-2">
<input type="text" class="input-group-text w-100" @bind="Pivot2DCol" id="pivot2dcol"/>
</div>
</div>
</div>
<div class="@_rowClass">
<div class="form-group w-100 mr-3">
<label for="pivot2ddata">2D pivot data</label>
<div class="input-group mr-sm-2">
<input type="text" class="input-group-text w-100" @bind="Pivot2DData" id="pivot2ddata"/>
</div>
</div>
</div>
<div class="@_rowClass">
<div class="form-group w-100 mr-3">
<label for="pivot2ddatatype">2D pivot data type col</label>
<div class="input-group mr-sm-2">
<input type="text" class="input-group-text w-100" @bind="Pivot2DDataTypeColumn" id="pivot2ddatatype"/>
</div>
</div>
</div>
}
<div class="@_rowClass">
<div class="flex-stack-horizontal w-100 mr-3">
<label class="input-group-text w-75" style="min-width: 200px;">Make Line Chart</label>
<label class="toggle-switch toggle-switch-xs input-group-text" style="display: inline-block">
<input type="checkbox" @bind="_pivot.MakeLineChart"/>
<span class="slider" data-label-on="on" data-label-off="off"></span>
</label>
</div>
</div>
@if ( _pivot.MakeLineChart )
{
<div class="@_rowClass">
<div class="form-group w-100 mr-3 mt-3">
<label for="linechartlabels">X axis (labels)</label>
<div class="input-group mr-sm-2">
<input type="text" class="input-group-text w-100" @bind="LineChartXAxis" id="linechartlabels"/>
</div>
</div>
</div>
<div class="@_rowClass">
<div class="form-group w-100 mr-3">
<label for="linechartdata">Y axis (data)</label>
<div class="input-group mr-sm-2">
<textarea class="w-100 form-control" rows="5" @bind="LineChartYAxis" id="linechartdata"></textarea>
</div>
</div>
</div>
<div class="@_rowClass">
<div class="form-group w-100 mr-3">
<label for="linechartdatasets">Data set keys (optional)</label>
<div class="input-group mr-sm-2">
<textarea class="w-100 form-control" rows="5" @bind="LineChartAdditionalKeys" id="linechartdatasets"></textarea>
</div>
</div>
</div>
<div class="@_rowClass">
<div class="flex-stack-horizontal w-100 mr-3">
<label class="input-group-text w-75" style="min-width: 200px;">Show legend</label>
<label class="toggle-switch toggle-switch-xs input-group-text" style="display: inline-block">
<input type="checkbox" @bind="LineChartShowLegend"/>
<span class="slider" data-label-on="on" data-label-off="off"></span>
</label>
</div>
</div>
<div class="@_rowClass">
<div class="flex-stack-horizontal w-100 mr-3">
<label class="input-group-text w-75" style="min-width: 200px;">Stepped line</label>
<label class="toggle-switch toggle-switch-xs input-group-text" style="display: inline-block">
<input type="checkbox" @bind="LineChartSteppedLine"/>
<span class="slider" data-label-on="on" data-label-off="off"></span>
</label>
</div>
</div>
<div class="@_rowClass">
<div class="flex-stack-horizontal w-100 mr-3">
<label class="input-group-text w-75" style="min-width: 200px;">Fill</label>
<label class="toggle-switch toggle-switch-xs input-group-text" style="display: inline-block">
<input type="checkbox" @bind="LineChartFill"/>
<span class="slider" data-label-on="on" data-label-off="off"></span>
</label>
</div>
</div>
}
}
</div>
@code {
[Parameter] public string Class { get; set; } = "";
[Parameter]
public PivotDefinition? Pivot
{
get => _pivot;
set
{
if (_pivot == value)
return;
_pivot = value;
InvokeAsync(StateHasChanged);
}
}
private PivotDefinition? _pivot;
private string _rowClass = "";
private string RenameColumns
{
get => string.Join(
"\n",
(_pivot?.RenameColumn ?? new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase))
.Select(x => new { Key = x.Key?.Trim(), Value = x.Value?.Trim() })
.Where(x => !string.IsNullOrWhiteSpace(x.Key) && !string.IsNullOrWhiteSpace(x.Value))
.Select(x => $"{x.Key}={x.Value}")
);
set
{
if (_pivot == null || ColumnOrder == value)
return;
_pivot.RenameColumn = (value ?? "")
.Replace("\r", "")
.Split("\n")
.Select(x => x.Split("="))
.Where(x => x.Length == 2 && !string.IsNullOrWhiteSpace(x[0]) && !string.IsNullOrWhiteSpace(x[1]))
.ToDictionary(x => x[0].Trim(), x => x[1].Trim())
;
}
}
private string ColumnOrder
{
get => string.Join("\n", (_pivot?.ColumnsOrder ?? []).Select(x => x?.Trim()).Where(x => !string.IsNullOrWhiteSpace(x)));
set
{
if (_pivot == null || ColumnOrder == value)
return;
_pivot.ColumnsOrder ??= [];
_pivot.ColumnsOrder.Clear();
_pivot.ColumnsOrder.AddRange((value ?? "")
.Replace("\r", "")
.Split("\n")
.Select(x => x.Trim())
.Where(x => !string.IsNullOrWhiteSpace(x))
);
}
}
private string Pivot2DRows
{
get => string.Join("\n", (_pivot?.Pivot2DRows ?? []).Select(x => x?.Trim()).Where(x => !string.IsNullOrWhiteSpace(x)));
set
{
if (_pivot == null || Pivot2DRows == value)
return;
_pivot.Pivot2DRows ??= [];
_pivot.Pivot2DRows.Clear();
_pivot.Pivot2DRows.AddRange((value ?? "")
.Replace("\r", "")
.Split("\n")
.Select(x => x.Trim())
.Where(x => !string.IsNullOrWhiteSpace(x))
);
}
}
private string Pivot2DCol
{
get => _pivot?.Pivot2DColumn ?? "";
set
{
if (_pivot == null || _pivot.Pivot2DColumn == value)
return;
_pivot.Pivot2DColumn = value;
}
}
private string Pivot2DData
{
get => _pivot?.Pivot2DData ?? "";
set
{
if (_pivot == null || _pivot.Pivot2DData == value)
return;
_pivot.Pivot2DData = value;
}
}
private string Pivot2DDataTypeColumn
{
get => _pivot?.Pivot2DDataTypeColumn ?? "";
set
{
if (_pivot == null || _pivot.Pivot2DDataTypeColumn == value)
return;
_pivot.Pivot2DDataTypeColumn = value;
}
}
private string LineChartXAxis
{
get => _pivot?.LineChartXAxis ?? "";
set
{
if (_pivot == null)
return;
_pivot.LineChartXAxis = value;
}
}
private string LineChartYAxis
{
get => string.Join("\n", _pivot?.LineChartYAxis ?? Enumerable.Empty<string>());
set
{
if (_pivot == null)
return;
_pivot.LineChartYAxis ??= [];
_pivot.LineChartYAxis.Clear();
_pivot.LineChartYAxis.AddRange(value
.Replace("\r", "")
.Split("\n")
.Select(x => x.Trim())
.Where(x => !string.IsNullOrWhiteSpace(x))
);
}
}
private string LineChartAdditionalKeys
{
get => string.Join("\n",_pivot?.LineChartDataSetKeys ?? []);
set
{
if (_pivot == null)
return;
var s = value
.Replace("\r", "")
.Split("\n")
.Select(x => x.Trim())
.Where(x => !string.IsNullOrWhiteSpace(x))
;
_pivot.LineChartDataSetKeys ??= [];
_pivot.LineChartDataSetKeys.Clear();
_pivot.LineChartDataSetKeys.AddRange(s);
}
}
private bool LineChartShowLegend
{
get => _pivot?.LineChartShowLegend ?? false;
set
{
if (_pivot == null)
return;
_pivot.LineChartShowLegend = value;
}
}
private bool LineChartSteppedLine
{
get => _pivot?.LineChartSteppedLine ?? false;
set
{
if (_pivot == null)
return;
_pivot.LineChartSteppedLine = value;
}
}
private bool LineChartFill
{
get => _pivot?.LineChartFill ?? false;
set
{
if (_pivot == null)
return;
_pivot.LineChartFill = value;
}
}
}