< Summary - Syki

Information
Class: Syki.Front.Features.Academic.AssignCampiToTeacher.AssignCampiToTeacherDrawer
Assembly: Front
File(s): /home/runner/work/syki/syki/Front/Features/Academic/AssignCampiToTeacher/AssignCampiToTeacherDrawer.razor
Tag: 4_16869239191
Line coverage
0%
Covered lines: 0
Uncovered lines: 72
Coverable lines: 72
Total lines: 218
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 26
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_AfterSubmit()100%210%
.ctor()100%210%
OnInitializedAsync()0%620%
SearchCampus()0%2040%
HandleCampusChanged(...)100%210%
UnselectCampus(...)0%620%
Open()0%2040%
Close()100%210%
Submit()0%4260%
GetSelectedCampiIcon()0%620%
GetSelectedCampiTitle()0%2040%

File(s)

/home/runner/work/syki/syki/Front/Features/Academic/AssignCampiToTeacher/AssignCampiToTeacherDrawer.razor

#LineLine coverage
 1@namespace Syki.Front.Features.Academic.AssignCampiToTeacher
 2
 3<MudDrawer @bind-Open="@_open" Width="@_width" Anchor="Anchor.Right" Elevation="1" Variant="@DrawerVariant.Temporary">
 4  <MudDrawerHeader Class="justify-space-between">
 5    <MudStack Row Justify="Justify.FlexStart" AlignItems="AlignItems.Center" Spacing="3">
 6      <MudIcon Icon="@Icons.Material.Filled.GroupWork" />
 7      <MudText Typo="Typo.h5"><b>Campi do professor</b></MudText>
 8    </MudStack>
 9    <MudIconButton Icon="@Icons.Material.Filled.Close" OnClick="@Close" />
 10    </MudDrawerHeader>
 11
 12    <MudGrid Spacing="1" Class="px-6">
 013        <MudForm @ref="@_form" Style="width: 100%">
 014            <MudGrid Spacing="2">
 015                <MudItem xs="12" Class="my-2">
 016                    <MudStack Row AlignItems="AlignItems.Center" Justify="Justify.FlexStart" Spacing="1">
 017                        <MudIcon Icon="@Icons.Material.Filled.Person4" Size="Size.Medium" />
 018                        <MudText Typo="Typo.h6"><b>@_teacher.Name</b></MudText>
 19                    </MudStack>
 20                </MudItem>
 21
 22                <MudItem xs="12">
 23                    <SykiTitleText Icon="@GetSelectedCampiIcon()" Text="@GetSelectedCampiTitle()" />
 24                </MudItem>
 25
 26                <MudItem xs="12">
 27                    <MudAutocomplete
 28                        MaxItems="50"
 29                        T="AssignCampiToTeacherSelect"
 30                        SearchFunc="@SearchCampus"
 31                        Dense
 32                        Placeholder=""
 033                        ToStringFunc="@(e => null)"
 34                        DebounceInterval="100"
 35                        ResetValueOnEmptyText
 36                        Margin="Margin.Dense"
 37                        Variant="Variant.Outlined"
 38                        Class="mb-2"
 39                        Value="@_campus"
 040                        ValueChanged="(AssignCampiToTeacherSelect newValue) => HandleCampusChanged(newValue)"
 41                        Label="Campus"
 42                        AdornmentColor="Color.Primary"
 43                    >
 44                        <ItemTemplate Context="e">
 45                            <MudStack Row Spacing="0">
 046                                <MudText Typo="Typo.body1">@e.Name</MudText>
 47                            </MudStack>
 48                        </ItemTemplate>
 49                        <NoItemsTemplate>
 50                            <MudStack Row Spacing="0" AlignItems="AlignItems.Center" Justify="Justify.Center">
 51                                <MudText Typo="Typo.body1">Nenhum campus encontrado</MudText>
 52                            </MudStack>
 53                        </NoItemsTemplate>
 54                    </MudAutocomplete>
 55                </MudItem>
 56            </MudGrid>
 57
 58            <MudItem xs="12" Class="mt-2">
 059                @if (_selectedCampi.Count > 0)
 60                {
 61                    <MudDataGrid
 62                        Dense
 63                        Hover
 64                        Class="my-2"
 65                        SortMode="SortMode.None"
 066                        Items="@_selectedCampi.OrderBy(d => d.Name)"
 67                    >
 68                        <Columns>
 69                            <PropertyColumn Property="x => x.Name" Title="Campus" />
 70                            <TemplateColumn CellClass="d-flex justify-end">
 71                                <CellTemplate>
 072                                    <MudIconButton Size="@Size.Small" Icon="@Icons.Material.Outlined.Delete" Color="@Col
 73                                </CellTemplate>
 74                            </TemplateColumn>
 75                        </Columns>
 76                    </MudDataGrid>
 77                }
 78            </MudItem>
 79        </MudForm>
 80    </MudGrid>
 81
 82    <MudStack Row Justify="Justify.SpaceBetween" AlignItems="AlignItems.Center" Spacing="3" Class="px-2 pt-6">
 83        <DialogCancelButton OnClick="@Close" />
 084        <DialogSaveButton OnClick="@Submit" Disabled="@_selectedCampi.Select(x => x.Id).ToList().IsEquivalentTo(_teacher
 85    </MudStack>
 86</MudDrawer>
 87
 88@inject ISnackbar Snackbar
 89@inject NavigationManager Nav
 90@inject GetCampiClient GetCampiClient
 91@inject IBrowserViewportService BrowserViewportService
 92@inject GetAcademicTeacherClient GetAcademicTeacherClient
 93@inject AssignCampiToTeacherClient AssignCampiToTeacherClient
 94
 95@code
 96{
 97    [Parameter]
 098    public EventCallback AfterSubmit { get; set; }
 99
 100    private bool _open;
 0101    private string _width = "520px";
 102    private Breakpoint _breakpoint;
 103
 104    private MudForm _form;
 105    private bool _loading;
 106
 0107    private GetAcademicTeacherOut _teacher = new();
 108
 109    private AssignCampiToTeacherSelect? _campus;
 0110    private List<AssignCampiToTeacherSelect> _campi = [];
 0111    private HashSet<AssignCampiToTeacherSelect> _selectedCampi = [];
 112
 113    protected override async Task OnInitializedAsync()
 114    {
 0115        _breakpoint = await BrowserViewportService.GetCurrentBreakpointAsync();
 0116        _width = _breakpoint == Breakpoint.Xs ? "100%" : "520px";
 0117        _campi = (await GetCampiClient.Get()).ConvertAll(x => new AssignCampiToTeacherSelect() { Id = x.Id, Name = x.Nam
 0118    }
 119
 120    private async Task<IEnumerable<AssignCampiToTeacherSelect>> SearchCampus(string value, CancellationToken cancellatio
 121    {
 0122        await Task.Yield();
 123
 0124        var filtered = _campi.Where(d => !d.IsSelected)
 0125            .ToList().ConvertAll(x => new AssignCampiToTeacherSelect { Id = x.Id, Name = x.Name });
 126
 0127        if (string.IsNullOrEmpty(value))
 0128            return filtered;
 129
 0130        return filtered.Where(x => x.Name.Contains(value, StringComparison.InvariantCultureIgnoreCase));
 0131    }
 132
 133    private void HandleCampusChanged(AssignCampiToTeacherSelect newValue)
 134    {
 0135        _campi.First(d => d.Id == newValue.Id).IsSelected = true;
 0136        _selectedCampi.Add(newValue);
 0137    }
 138
 139    private void UnselectCampus(AssignCampiToTeacherSelect campus)
 140    {
 0141        _campi.FirstOrDefault(d => d.Id == campus.Id)?.IsSelected = false;
 0142        _selectedCampi.Remove(campus);
 0143    }
 144
 145    public async Task Open(Guid teacherId)
 146    {
 0147        _loading = true;
 148
 0149        var response = await GetAcademicTeacherClient.Get(teacherId);
 0150        if (response.IsSuccess)
 151        {
 0152            _teacher = response.Success;
 0153            _selectedCampi = _teacher.Campi
 0154                .Select(x => new AssignCampiToTeacherSelect() { Id = x.Id, Name = x.Name })
 0155                .ToHashSet();
 156        }
 157        else
 158        {
 0159            Snackbar.Add(response.Error.Message, Severity.Error);
 160        }
 161
 0162        _campus = null;
 0163        _campi.ForEach(x => x.IsSelected = _selectedCampi.Any(c => c.Id == x.Id));
 164
 0165        _open = true;
 0166        await _form?.ResetAsync();
 167
 0168        _loading = false;
 169
 0170        StateHasChanged();
 0171    }
 172
 173    private void Close()
 174    {
 0175        _open = false;
 0176    }
 177
 178    private async Task Submit()
 179    {
 0180        if (_loading) return;
 181
 0182        await _form.Validate();
 0183        if (!_form.IsValid) return;
 184
 0185        _loading = true;
 0186        var selectedCampi = _selectedCampi.Select(x => x.Id).ToList();
 0187        var response = await AssignCampiToTeacherClient.Assign(_teacher.Id, selectedCampi);
 0188        if (response.IsSuccess)
 189        {
 0190            Snackbar.Add("Campus salvos com sucesso!", Severity.Success);
 0191            await AfterSubmit.InvokeAsync();
 0192            _open = false;
 193        }
 194        else
 195        {
 0196            Snackbar.Add(response.Error.Message, Severity.Error);
 197        }
 0198        _loading = false;
 0199    }
 200
 201    private string GetSelectedCampiIcon()
 202    {
 0203        var count = _selectedCampi.Count;
 0204        if (count == 0) return Icons.Material.Filled.Error;
 205
 0206        return Icons.Material.Filled.Check;
 207    }
 208
 209    private string GetSelectedCampiTitle()
 210    {
 0211        var count = _selectedCampi.Count;
 0212        if (count == 0) return "Nenhum campus selecionado";
 213
 0214        if (count == 1) return $"1 campus selecionado";
 215
 0216        return $"{count} campus selecionados";
 217    }
 218}