Feature-based folder structure

1. Created feature-based folder structure - Components now organized by domain feature
  2. Moved all components - 20+ files moved to new locations
  3. Updated _Imports.razor - Added all new namespace paths for global component access
  4. Updated CustomThemes.cs namespace - Changed from WebApp.Components.Layout to WebApp.Components.Shared.Layout
  5. Removed old using directives - Cleaned up Login.razor and Routes.razor
  6. Removed empty directories - Cleaned up old folder structure
This commit is contained in:
2025-12-03 22:04:23 -05:00
parent bd04483bed
commit 2d5d075879
38 changed files with 13 additions and 4 deletions
@@ -0,0 +1,103 @@
@if (Title != null)
{
<MudText Typo="Typo.h4">@Title</MudText>
}
<MudAutocomplete T="Student"
Label="@Label"
@bind-Value="_currentStudent"
SearchFunc="@SearchStudents"
ToStringFunc="@(s => ShowFullName ? s?.FirstNameLastName : s?.FirstName)"
Immediate="true"
ResetValueOnEmptyText="true"
CoerceText="false"
CoerceValue="false"
AdornmentIcon="@Icons.Material.Filled.Search"
Clearable="true">
<ItemTemplate Context="student">
@if (ShowFullName)
{
@student.FirstNameLastName
}
else
{
@student.FirstName
}
@if (ShowGrade)
{
<MudText Typo="Typo.caption" Color="Color.Secondary"> - Grade @student.Grade</MudText>
}
</ItemTemplate>
</MudAutocomplete>
@if (SelectedStudents.Any())
{
<MudChipSet T="Student" AllClosable="true" Class="mt-2">
@foreach (var student in SelectedStudents.OrderBy(s => s.FirstName))
{
<MudChip T="Student"
Value="@student"
Text="@(ShowFullName ? student.FirstNameLastName : student.FirstName)"
OnClose="@(() => RemoveStudent(student))" />
}
</MudChipSet>
}
@code {
[Parameter]
public IEnumerable<Student> Students { get; set; } = [];
[Parameter]
public IEnumerable<Student> SelectedStudents { get; set; } = [];
[Parameter]
public EventCallback<IEnumerable<Student>> SelectedStudentsChanged { get; set; }
[Parameter]
public string? Title { get; set; }
[Parameter]
public string Label { get; set; } = "Search Students";
[Parameter]
public bool ShowFullName { get; set; } = true;
[Parameter]
public bool ShowGrade { get; set; } = false;
private Student? _currentStudent
{
get => _currentStudentValue;
set
{
_currentStudentValue = value;
if (value != null && !SelectedStudents.Contains(value))
{
var updatedList = SelectedStudents.Append(value).ToList();
SelectedStudentsChanged.InvokeAsync(updatedList);
_currentStudentValue = null;
}
}
}
private Student? _currentStudentValue;
private Task<IEnumerable<Student>> SearchStudents(string? searchText, CancellationToken cancellationToken)
{
if (string.IsNullOrWhiteSpace(searchText))
return Task.FromResult<IEnumerable<Student>>(Students.Where(s => !SelectedStudents.Contains(s)));
var search = searchText.ToLower();
return Task.FromResult<IEnumerable<Student>>(Students
.Where(s => !SelectedStudents.Contains(s))
.Where(s => s.FirstName.ToLower().Contains(search) ||
s.LastName.ToLower().Contains(search))
.OrderBy(s => s.FirstName));
}
private void RemoveStudent(Student student)
{
var updatedList = SelectedStudents.Where(s => s.Id != student.Id).ToList();
SelectedStudentsChanged.InvokeAsync(updatedList);
}
}
@@ -0,0 +1,48 @@
@if (Title != null)
{
<MudText Typo="Typo.h4">@Title</MudText>
}
<MudToggleGroup T="Student"
SelectionMode="SelectionMode.MultiSelection"
Values="@SelectedStudents"
ValuesChanged="@OnSelectedStudentsChanged"
Vertical="true"
CheckMark>
@foreach (var student in Students.OrderBy(e => e.FirstName))
{
<MudToggleItem Value="@student" Style="font-size: .75rem;">
@if (ShowFullName)
{
@student.FirstNameLastName
}
else
{
@student.FirstName
}
</MudToggleItem>
}
</MudToggleGroup>
@code {
[Parameter]
public IEnumerable<Student> Students { get; set; } = [];
[Parameter]
public IEnumerable<Student> SelectedStudents { get; set; } = [];
[Parameter]
public EventCallback<IEnumerable<Student>> SelectedStudentsChanged { get; set; }
[Parameter]
public string? Title { get; set; }
[Parameter]
public bool ShowFullName { get; set; } = true;
private async Task OnSelectedStudentsChanged(IEnumerable<Student> value)
{
SelectedStudents = value;
await SelectedStudentsChanged.InvokeAsync(value);
}
}