UI/CurrentGoalsPanel.razor
@using Sandbox
@using Sandbox.UI
@using HC3.UI
@using System

@inherits PanelComponent
@namespace HC3

<root class="@(ShouldBeVisible ? "visible" : "")">
    <column>

    @if ( !Group.IsValid() )
    {
        return;
    }

    <row class="header">
        <label class="title">Tasks</label>
        <div class="icon" />
        <label class="subtitle">@Group.Description</label>
    </row>

    <div class="goal-list">
        @foreach ( var goal in Group.GetGoals() )
        {
            <div class="goal window-container @(goal.IsUnlocked() ? "complete" : "")">
                <row>
                    <label class="goal-name">@goal.GoalName</label>
                    <div class="grow" />
                    <label class="goal-amount">@GetStatText(goal)</label>
                </row>

                @if ( !string.IsNullOrEmpty( goal.GoalDescription ) )
                {
                    <label class="goal-description">@goal.GoalDescription</label>
                }
                <div class="bar">
                    <div class="progress" style="@($"width: {GetStatPercent( goal )}")"></div>
                </div>

                @if ( !string.IsNullOrEmpty( goal.GoalReward ) )
                {
                    <label class="goal-reward subtitle">@goal.GoalReward</label>
                }
            </div>
        }

            <div class="window-button button" onclick=@(() => GoalWindow.Show())>
            <span>
                <Silkicon Icon="star" />
                View all tasks
            </span>
        </div>
    </div>

    </column>
</root>

@code
{
    public GoalGroup Group => Scene.GetAll<GoalGroup>().FirstOrDefault( x => x.IsActiveManager );

    public bool ShouldBeVisible => Group.IsValid() && !GoalWindow.IsOpen;

    string GetStatPercent( Goal goal )
    {
        if ( goal == null || goal.StatNeededToComplete <= 0 )
            return "0%";

        float percent = MathF.Min( goal.GetStat() / goal.StatNeededToComplete, 1.0f ) * 100.0f;
        return $"{percent}%";
    }

    string GetStatText( Goal goal )
    {
        return $"{Math.Min( goal.GetStat(), goal.StatNeededToComplete )} / {goal.StatNeededToComplete}";
    }

    protected override int BuildHash()
    {
        if ( GoalWindow.IsOpen ) return -2;
        if ( !Group.IsValid() ) return -1;

        return System.HashCode.Combine( Time.Now );
    }
}