using System.Diagnostics.CodeAnalysis; using Connected.Annotations; using Connected.Extensions; using Connected.Utilities; using Connected.Utilities.BindingConverters; using Microsoft.AspNetCore.Components; namespace Connected.Components; public partial class ProgressLinear : UIComponent { protected string DivClassname => new CssBuilder("mud-progress-linear") .AddClass("mud-progress-linear-rounded", Rounded) .AddClass($"mud-progress-linear-striped", Striped) .AddClass($"mud-progress-indeterminate", Indeterminate) .AddClass($"mud-progress-linear-buffer", Buffer && !Indeterminate) .AddClass($"mud-progress-linear-{Size.ToDescriptionString()}") .AddClass($"mud-progress-linear-color-{Color.ToDescriptionString()}") .AddClass("horizontal", !Vertical) .AddClass("vertical", Vertical) .AddClass("mud-flip-x-rtl") .AddClass(Class) .Build(); /// /// The color of the component. It supports the theme colors. /// [Parameter] [Category(CategoryTypes.ProgressLinear.Appearance)] public ThemeColor Color { get; set; } = ThemeColor.Default; /// /// The color of the component. It supports the theme colors. /// [Parameter] [Category(CategoryTypes.ProgressLinear.Appearance)] public Size Size { get; set; } = Size.Small; /// /// Constantly animates, does not follow any value. /// [Parameter] [Category(CategoryTypes.ProgressLinear.Behavior)] public bool Indeterminate { get; set; } = false; /// /// If true, the buffer value will be used. /// [Parameter] [Category(CategoryTypes.ProgressLinear.Behavior)] public bool Buffer { get; set; } = false; /// /// If true, border-radius is set to the themes default value. /// [Parameter] [Category(CategoryTypes.ProgressLinear.Appearance)] public bool Rounded { get; set; } = false; /// /// Adds stripes to the filled part of the linear progress. /// [Parameter] [Category(CategoryTypes.ProgressLinear.Appearance)] public bool Striped { get; set; } = false; /// /// If true, the progress bar will be displayed vertically. /// [Parameter] [Category(CategoryTypes.ProgressLinear.Appearance)] public bool Vertical { get; set; } = false; /// /// Child content of component. /// [Parameter] [Category(CategoryTypes.ProgressLinear.Behavior)] public RenderFragment ChildContent { get; set; } /// /// The minimum allowed value of the linear progress. Should not be equal to max. /// [Parameter] [Category(CategoryTypes.ProgressLinear.Behavior)] public double Min { get => _min; set { _min = value; UpdatePercentages(); } } /// /// The maximum allowed value of the linear progress. Should not be equal to min. /// [Parameter] [Category(CategoryTypes.ProgressLinear.Behavior)] public double Max { get => _max; set { _max = value; UpdatePercentages(); } } private double _min = 0.0; private double _max = 100.0; private double _value; private double _bufferValue; /// /// The maximum allowed value of the linear progress. Should not be equal to min. /// [Parameter] [Category(CategoryTypes.ProgressLinear.Behavior)] public double Value { get => _value; set { _value = value; UpdatePercentages(); } } [Parameter] [Category(CategoryTypes.ProgressLinear.Behavior)] public double BufferValue { get => _bufferValue; set { _bufferValue = value; UpdatePercentages(); } } protected double ValuePercent { get; set; } protected double BufferPercent { get; set; } protected void UpdatePercentages() { ValuePercent = GetValuePercent(); BufferPercent = GetBufferPercent(); StateHasChanged(); } private double GetPercentage(double input) { var total = Math.Abs(_max - _min); if (NumericConverter.AreEqual(0, total)) { // numeric instability! return 0.0; } var value = Math.Max(0, Math.Min(total, input - _min)); return value / total * 100.0; } public double GetValuePercent() => GetPercentage(_value); public double GetBufferPercent() => GetPercentage(_bufferValue); private string GetStyleBarTransform(double input) => Vertical == true ? $"transform: translateY({(int)Math.Round(100 - input)}%);" : $"transform: translateX(-{(int)Math.Round(100 - input)}%);"; public string GetStyledBar1Transform() => GetStyleBarTransform(ValuePercent); public string GetStyledBar2Transform() => GetStyleBarTransform(BufferPercent); #region --> Obsolete Forwarders for Backwards-Compatiblilty [Obsolete("Use Min instead.", true)] [ExcludeFromCodeCoverage] [Parameter] public double Minimum { get => Min; set => Min = value; } [Obsolete("Use Max instead.", true)] [ExcludeFromCodeCoverage] [Parameter] public double Maximum { get => Max; set => Max = value; } #endregion }