using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Components;
using Radzen.Blazor;
using Radzen.Documents.Spreadsheet;
namespace Radzen.Blazor.Spreadsheet;
#nullable enable
///
/// Dialog for formatting cells in a spreadsheet.
///
public partial class FormatCellsDialog : SpreadsheetDialogBase
{
///
/// The current format of the selected cell.
///
[Parameter]
public string? CurrentFormat { get; set; }
///
/// A sample value to preview formatting.
///
[Parameter]
public object? SampleValue { get; set; }
///
/// The data type of the sample value.
///
[Parameter]
public CellDataType ValueType { get; set; }
private NumberFormatCategory selectedCategory = NumberFormatCategory.General;
private string customFormatCode = "General";
private int decimalPlaces = 2;
private bool useThousandsSeparator = true;
private string currencySymbol = "$";
private string? selectedPreset;
private string preview = "";
private static readonly NumberFormatCategory[] categories =
[
NumberFormatCategory.General,
NumberFormatCategory.Number,
NumberFormatCategory.Currency,
NumberFormatCategory.Accounting,
NumberFormatCategory.Percentage,
NumberFormatCategory.Scientific,
NumberFormatCategory.Date,
NumberFormatCategory.Time,
NumberFormatCategory.Text
];
private IReadOnlyList<(string, string)> presets = [];
private bool ShowDecimalPlaces => selectedCategory is NumberFormatCategory.Number
or NumberFormatCategory.Currency or NumberFormatCategory.Accounting
or NumberFormatCategory.Percentage or NumberFormatCategory.Scientific;
private bool ShowThousandsSeparator => selectedCategory == NumberFormatCategory.Number;
private bool ShowCurrencySymbol => selectedCategory is NumberFormatCategory.Currency
or NumberFormatCategory.Accounting;
private bool ShowPresetList => selectedCategory is NumberFormatCategory.Date
or NumberFormatCategory.Time;
///
protected override void OnInitialized()
{
if (!string.IsNullOrEmpty(CurrentFormat) &&
!string.Equals(CurrentFormat, "General", StringComparison.OrdinalIgnoreCase))
{
customFormatCode = CurrentFormat;
selectedCategory = NumberFormatPresets.GetCategory(CurrentFormat);
}
LoadPresetsForCategory();
UpdatePreview();
}
private void OnCategoryChanged()
{
LoadPresetsForCategory();
RebuildFormatCode();
UpdatePreview();
}
private void OnOptionChanged()
{
RebuildFormatCode();
UpdatePreview();
}
private void OnPresetChanged()
{
customFormatCode = selectedPreset ?? customFormatCode;
UpdatePreview();
}
private void OnFormatCodeChanged()
{
UpdatePreview();
}
private void LoadPresetsForCategory()
{
if (selectedCategory is NumberFormatCategory.Date or NumberFormatCategory.Time)
{
presets = NumberFormatPresets.GetPresets(selectedCategory);
selectedPreset = presets.Count > 0 ? presets[0].Item2 : null;
}
else
{
presets = [];
selectedPreset = null;
}
}
private void RebuildFormatCode()
{
customFormatCode = FormatCodeBuilder.Build(
selectedCategory, decimalPlaces, useThousandsSeparator,
currencySymbol, selectedPreset);
}
private void UpdatePreview()
{
if (SampleValue is null)
{
preview = "";
return;
}
var result = NumberFormat.Apply(customFormatCode, SampleValue, ValueType, Culture);
preview = result ?? SampleValue.ToString() ?? "";
}
private void OnOk()
{
DialogService.Close(customFormatCode);
}
}