< Summary - Syki

Information
Class: Syki.Front.Pages.Teacher.TeacherClassActivityPage
Assembly: Front
File(s): /home/runner/work/syki/syki/Front/Pages/Teacher/TeacherClassActivityPage.razor
Tag: 4_16869239191
Line coverage
0%
Covered lines: 0
Uncovered lines: 53
Coverable lines: 53
Total lines: 201
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 20
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_ClassId()100%210%
get_ActivityId()100%210%
.ctor()100%210%
OnInitializedAsync()0%4260%
Load()0%620%
HandleStatusFilterChange(...)0%620%
GetWorks()100%210%
OpenDialog()0%620%
GetDeliveryRateFraction(...)100%210%
GetDeliveryRateColor(...)0%2040%
get__quickFilter()100%210%
GetNotFoundMessage()0%2040%

File(s)

/home/runner/work/syki/syki/Front/Pages/Teacher/TeacherClassActivityPage.razor

#LineLine coverage
 1@namespace Syki.Front.Pages.Teacher
 2
 3@page "/teacher/classes/{classId:guid}/activities/{activityId:guid}"
 4@attribute [Authorize(Roles = "Teacher")]
 5
 6<SykiPageTitle Title="Atividade" />
 7
 8<MudContainer Class="mb-4 px-4">
 9    <MudBreadcrumbs Items="@_breadcrumbs" Class="px-0" />
 10    <MudGrid Class="align-center">
 11        <MudItem xs="12" sm="8" md="8" lg="8">
 12            <MudStack Row="true" AlignItems="AlignItems.Center">
 13                <MudIcon Icon="@Icons.Material.Filled.EditNote" Class="mb-1" Size="Size.Large"/>
 14                <MudText Typo="Typo.h5" Class="mt-1" Style="font-weight: bold">Atividade</MudText>
 15            </MudStack>
 16        </MudItem>
 17        <MudItem xs="12" sm="4" md="4" lg="4" Class="d-flex justify-end">
 18            <MudProgressLinear Color="@GetDeliveryRateColor(_activity.GetDeliveryRate())" Rounded="true" Size="Size.Larg
 19                <MudText Typo="Typo.body1">
 020                    <b>@GetDeliveryRateFraction(_activity)</b>
 21                </MudText>
 22            </MudProgressLinear>
 23        </MudItem>
 24    </MudGrid>
 25
 26    <MudExpansionPanels Class="my-4">
 27        <MudExpansionPanel Expanded="@_expanded">
 28            <TitleContent>
 029                <MudText Typo="Typo.h6">@_activity.Title</MudText>
 30            </TitleContent>
 31            <ChildContent>
 32                <MudContainer Class="px-0">
 33                    <MudGrid Spacing="3">
 34                        <MudItem xs="3" sm="2" md="2" lg="2">
 35                            <SykiLabelText Label="Nota" Text="@_activity.Note.ToString()"/>
 36                        </MudItem>
 37                        <MudItem xs="5" sm="2" md="2" lg="2">
 38                            <SykiLabelText Label="Tipo" Text="@_activity.Type.GetDescription()"/>
 39                        </MudItem>
 40                        <MudItem xs="4" sm="2" md="2" lg="2">
 41                            <SykiLabelText Label="Peso (%)" Text="@_activity.Weight.ToString()"/>
 42                        </MudItem>
 43                        <MudItem xs="6" sm="3" md="3" lg="3">
 44                            <SykiLabelText Label="Criada em" Text="@_activity.CreatedAt.ToLocalTime().Format()"/>
 45                        </MudItem>
 46                        <MudItem xs="6" sm="3" md="3" lg="3">
 47                            <SykiLabelText Label="Data de entrega" Text="@_activity.GetDueDate()"/>
 48                        </MudItem>
 49                    </MudGrid>
 50                    <MudText Class="mt-4" Style="white-space: pre-line;">
 051                        @_activity.Description
 52                    </MudText>
 53                </MudContainer>
 54            </ChildContent>
 55        </MudExpansionPanel>
 56    </MudExpansionPanels>
 57
 58    <MudContainer Class="px-0 mb-4">
 59        <style>.mud-table-toolbar { height: auto }</style>
 60        <MudDataGrid Class="pa-4" Items="@GetWorks()" QuickFilter="@_quickFilter" Hover="true" SortMode="@SortMode.None"
 61            <ToolBarContent>
 62                <MudGrid Class="align-center" Spacing="3">
 63                    <MudItem xs="12" sm="5" md="5" lg="5">
 64                        <MudStack Row="true" AlignItems="AlignItems.Center" Spacing="3" Style="width: 100%;">
 65                            <MudToggleGroup T="ClassActivityWorkStatus" SelectionMode="SelectionMode.MultiSelection" Val
 66                                <MudToggleItem Value="@(ClassActivityWorkStatus.Pending)" Text="@ClassActivityWorkStatus
 67                                <MudToggleItem Value="@(ClassActivityWorkStatus.Delivered)" Text="@ClassActivityWorkStat
 68                                <MudToggleItem Value="@(ClassActivityWorkStatus.Finalized)" Text="@ClassActivityWorkStat
 69                            </MudToggleGroup>
 70                        </MudStack>
 71                    </MudItem>
 72                    <MudItem xs="12" sm="7" md="7" lg="7" Class="d-flex justify-end">
 73                        <SykiDataGridSearchTextField @bind-Value="@_searchString" Placeholder="Busque por nome" />
 74                    </MudItem>
 75                </MudGrid>
 76            </ToolBarContent>
 77            <Columns>
 78                <PropertyColumn Property="x => x.StudentName" Title="Aluno" />
 79                <PropertyColumn Property="x => x.Status.GetDescription()" Title="Status" />
 80                <PropertyColumn Property="x => x.Note.Format()" Title="Nota" />
 81                <PropertyColumn Property="x => x.GetLink()" Title="Link" />
 82                <TemplateColumn>
 83                    <CellTemplate>
 084                        <MudIconButton Size="@Size.Small" Icon="@Icons.Material.Filled.BookmarkAdded" OnClick="@(() => O
 85                    </CellTemplate>
 86                </TemplateColumn>
 87            </Columns>
 88            <NoRecordsContent>
 089                @(GetNotFoundMessage())
 90            </NoRecordsContent>
 91        </MudDataGrid>
 92    </MudContainer>
 93</MudContainer>
 94
 95@inject IDialogService DialogService
 96@inject ILocalStorageService LocalStorage
 97@inject IBrowserViewportService BrowserViewportService
 98@inject GetTeacherClassActivityClient GetTeacherClassActivityClient
 99
 100@code
 101{
 102  [Parameter]
 0103  public Guid ClassId { get; set; }
 104
 105  [Parameter]
 0106  public Guid ActivityId { get; set; }
 107
 108    private bool _loading;
 109    private string _searchString;
 0110    private bool _expanded = true;
 0111    private List<CascadingClassDto> _classes = [];
 0112    private List<BreadcrumbItem> _breadcrumbs = [];
 0113    private TeacherClassActivityOut _activity = new();
 114
 115    private Breakpoint _breakpoint;
 0116    private IEnumerable<ClassActivityWorkStatus> _statusFilter = [ClassActivityWorkStatus.Pending, ClassActivityWorkStat
 117
 118    protected override async Task OnInitializedAsync()
 119    {
 0120        _breakpoint = await BrowserViewportService.GetCurrentBreakpointAsync();
 121
 0122        _classes = JsonConvert.DeserializeObject<List<CascadingClassDto>>(await LocalStorage.GetItemAsync<string>("Class
 0123        var @class = _classes.FirstOrDefault(x => x.Id == ClassId);
 0124        if (@class != null)
 125        {
 0126            _breadcrumbs.Add(new("Turmas", href: "/", icon: Icons.Material.Filled.CenterFocusStrong));
 0127            _breadcrumbs.Add(new(@class.Name, href: $"/teacher/classes/{@class.Id}"));
 0128            _breadcrumbs.Add(new("Atividade", href: $"/teacher/classes/{@class.Id}/activities/{ActivityId}"));
 129        }
 130
 0131        await Load();
 0132    }
 133
 134    private async Task Load()
 135    {
 0136        _loading = true;
 0137        var response = await GetTeacherClassActivityClient.Get(ClassId, ActivityId);
 0138        if (response.IsSuccess)
 139        {
 0140            _activity = response.Success;
 141        }
 0142        _statusFilter = [ClassActivityWorkStatus.Pending, ClassActivityWorkStatus.Delivered, ClassActivityWorkStatus.Fin
 0143        _loading = false;
 0144    }
 145
 146    private void HandleStatusFilterChange(IEnumerable<ClassActivityWorkStatus> newValues)
 147    {
 0148        if (!newValues.Any())
 149        {
 0150            _statusFilter = _statusFilter.ToList();
 0151            return;
 152        }
 153
 0154        _statusFilter = newValues;
 0155    }
 156
 157    private List<ClassActivityWorkOut> GetWorks()
 158    {
 0159        return _activity.Works.Where(x => _statusFilter.Contains(x.Status)).ToList();
 160    }
 161
 162    private async Task OpenDialog(ClassActivityWorkOut work)
 163    {
 0164        var parameters = new DialogParameters<AddStudentClassActivityNoteDialog>();
 0165        parameters.Add(x => x.Work, work);
 0166        parameters.Add(x => x.ActivityId, ActivityId);
 167
 0168        _breakpoint = await BrowserViewportService.GetCurrentBreakpointAsync();
 0169        var options = new DialogOptions {
 0170            FullWidth = true,
 0171            MaxWidth = MaxWidth.Small,
 0172            FullScreen = _breakpoint == Breakpoint.Xs,
 0173        };
 0174        var dialog = await DialogService.ShowAsync<AddStudentClassActivityNoteDialog>("", parameters, options);
 175
 0176        var result = await dialog.Result;
 177
 0178        if (result!.Canceled) return;
 179
 0180        await Load();
 0181    }
 182
 183    private static string GetDeliveryRateFraction(TeacherClassActivityOut activity)
 184    {
 0185        return $"{activity.DeliveredWorks} / {activity.TotalWorks} entregas";
 186    }
 187
 188    private static Color GetDeliveryRateColor(decimal deliveryRate)
 189    {
 0190        if (deliveryRate == 100M) return Color.Success;
 191
 0192        return deliveryRate >= 70 ? Color.Warning : Color.Error;
 193    }
 194
 0195    private Func<ClassActivityWorkOut, bool> _quickFilter => x => _searchString.IsIn(x.StudentName);
 196
 197    private string GetNotFoundMessage()
 198    {
 0199        return _searchString.IsEmpty() && _statusFilter.Count() == 3 ? "Não existem alunos cadastrados ainda." : "Nenhum
 200    }
 201}