< Summary

Information
Class: Pomodoro.Web.Components.TaskItemBase
Assembly: Pomodoro.Web
File(s): /home/runner/work/Pomodoro/Pomodoro/src/Pomodoro.Web/Components/TaskItemComponent.razor.cs
Line coverage
100%
Covered lines: 45
Uncovered lines: 0
Coverable lines: 45
Total lines: 114
Line coverage: 100%
Branch coverage
100%
Covered branches: 16
Total branches: 16
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_Item()100%11100%
get_IsSelected()100%11100%
get_OnSelect()100%11100%
get_OnComplete()100%11100%
get_OnDelete()100%11100%
get_OnUncomplete()100%11100%
FormatTime(...)100%22100%
GetTaskClass()100%44100%
GetStatusIcon()100%44100%
HandleSelect()100%22100%
HandleComplete()100%11100%
HandleDelete()100%11100%
HandleUncomplete()100%11100%
HandleKeyDown()100%44100%

File(s)

/home/runner/work/Pomodoro/Pomodoro/src/Pomodoro.Web/Components/TaskItemComponent.razor.cs

#LineLine coverage
 1using Microsoft.AspNetCore.Components;
 2using Microsoft.AspNetCore.Components.Web;
 3using Pomodoro.Web.Models;
 4
 5namespace Pomodoro.Web.Components;
 6
 7/// <summary>
 8/// Code-behind for TaskItem component
 9/// Separates business logic from view
 10/// </summary>
 11public class TaskItemBase : ComponentBase
 12{
 13    #region Parameters (Model)
 14
 15    [Parameter]
 64216    public TaskItem Item { get; set; } = default!;
 17
 18    [Parameter]
 16719    public bool IsSelected { get; set; }
 20
 21    [Parameter]
 3822    public EventCallback<Guid> OnSelect { get; set; }
 23
 24    [Parameter]
 3425    public EventCallback<Guid> OnComplete { get; set; }
 26
 27    [Parameter]
 3428    public EventCallback<Guid> OnDelete { get; set; }
 29
 30    [Parameter]
 3431    public EventCallback<Guid> OnUncomplete { get; set; }
 32
 33    #endregion
 34
 35    #region Business Logic Methods
 36
 37    /// <summary>
 38    /// Formats minutes into human-readable time format
 39    /// </summary>
 40    protected string FormatTime(int minutes)
 6641    {
 6642        if (minutes < Constants.TimeConversion.MinutesPerHour)
 6443            return string.Format(Constants.TimeFormats.MinutesFormat, minutes);
 244        var hours = minutes / Constants.TimeConversion.MinutesPerHour;
 245        var mins = minutes % Constants.TimeConversion.MinutesPerHour;
 246        return string.Format(Constants.TimeFormats.HoursMinutesFormat, hours, mins);
 6647    }
 48
 49    /// <summary>
 50    /// Gets the CSS class for the task item
 51    /// </summary>
 52    protected string GetTaskClass()
 6653    {
 6654        var classes = new List<string>();
 7255        if (IsSelected) classes.Add(Constants.Tasks.SelectedClass);
 7956        if (Item.IsCompleted) classes.Add(Constants.Tasks.CompletedClass);
 6657        return string.Join(" ", classes);
 6658    }
 59
 60    /// <summary>
 61    /// Gets the status icon for the task
 62    /// </summary>
 63    protected string GetStatusIcon()
 6664    {
 7965        if (Item.IsCompleted) return Constants.Tasks.CompletedEmoji;
 8166        if (Item.PomodoroCount > 0) return Constants.Tasks.HasPomodorosEmoji;
 2567        return Constants.Tasks.DefaultEmoji;
 6668    }
 69
 70    /// <summary>
 71    /// Handles task selection click
 72    /// </summary>
 73    protected async Task HandleSelect()
 474    {
 475        if (!Item.IsCompleted)
 376        {
 377            await OnSelect.InvokeAsync(Item.Id);
 378        }
 479    }
 80
 81    /// <summary>
 82    /// Handles task completion click
 83    /// </summary>
 84    protected async Task HandleComplete()
 285    {
 286        await OnComplete.InvokeAsync(Item.Id);
 287    }
 88
 89    /// <summary>
 90    /// Handles task deletion click
 91    /// </summary>
 92    protected async Task HandleDelete()
 293    {
 294        await OnDelete.InvokeAsync(Item.Id);
 295    }
 96
 97    /// <summary>
 98    /// Handles task uncomplete click (undo completion)
 99    /// </summary>
 100    protected async Task HandleUncomplete()
 2101    {
 2102        await OnUncomplete.InvokeAsync(Item.Id);
 2103    }
 104
 105    protected async Task HandleKeyDown(KeyboardEventArgs e)
 4106    {
 4107        if (e.Key == "Enter" || e.Key == " ")
 3108        {
 3109            await HandleSelect();
 3110        }
 4111    }
 112
 113    #endregion
 114}