OnProfNext/OnProfNext.Client/Components/Modals/ProjectModal.razor
2025-10-15 15:01:00 +02:00

148 lines
6.4 KiB
Plaintext

@using OnProfNext.Client.Services
@using OnProfNext.Shared.Models
@using OnProfNext.Shared.Models.DTOs
@inject ProjectApiService ProjectService
@inject UserApiService UserService
<div class="modal fade @(ShowModal ? "show d-block" : "")" tabindex="-1" style="background-color: rgba(0,0,0,0.5);">
<div class="modal-dialog modal-dialog-centered" @onclick:stopPropagation>
<div class="modal-content border-0 shadow">
<div class="modal-header bg-primary text-white">
<h5 class="modal-title">Neues Projekt anlegen</h5>
<button type="button" class="btn-close btn-close-white" @onclick="CloseModal"></button>
</div>
<div class="modal-body">
@if (users == null)
{
<div class="text-center mt-3">
<div class="spinner-border text-primary" role="status"></div>
<p class="mt-2 text-secondary">Benutzer werden geladen...</p>
</div>
@if (!string.IsNullOrEmpty(errorMessage))
{
<div class="alert alert-danger mt-3">@errorMessage</div>
}
}
else
{
<EditForm Model="NewProject" OnValidSubmit="CreateProjectAsync">
<DataAnnotationsValidator />
<ValidationSummary />
<div class="mb-3">
<label class="form-label">Projektname</label>
<InputText class="form-control" @bind-Value="NewProject.ProjectName" />
</div>
<div class="mb-3">
<label class="form-label">Beschreibung</label>
<InputTextArea class="form-control" rows="3" @bind-Value="NewProject.Description" />
</div>
<div class="mb-3">
<label class="form-label">Projektleiter</label>
<InputText class="form-control mb-2" @bind-Value="SearchText" placeholder="Projektleiter suchen..." />
<div class="list-group" style="max-height: 150px; overflow-y: auto;">
@if (!FilteredUsers.Any())
{
<div class="list-group-item text-muted">Keine Benutzer gefunden</div>
}
else
{
@foreach (var user in FilteredUsers)
{
<label class="list-group-item">
<input type="checkbox"
value="@user.Id"
checked="@(NewProject.ProjectManagerIds.Contains(user.Id))"
@onchange="@(e => ToggleProjectManager(user.Id, e.Value != null && (bool)e.Value))" />
@user.FirstName @user.LastName (@user.Username)
</label>
}
}
</div>
</div>
<div class="mb-3">
<label class="form-label">Status</label>
<InputSelect class="form-select" @bind-Value="NewProject.Status">
<option value="Geplant">Geplant</option>
<option value="In Arbeit">In Arbeit</option>
<option value="Abgeschlossen">Abgeschlossen</option>
</InputSelect>
</div>
<div class="d-flex justify-content-end">
<button type="button" class="btn btn-secondary me-2" @onclick="CloseModal">Abbrechen</button>
<button type="submit" class="btn btn-success">Speichern</button>
</div>
</EditForm>
}
</div>
</div>
</div>
</div>
@code {
[Parameter] public bool ShowModal { get; set; }
[Parameter] public EventCallback<bool> ShowModalChanged { get; set; }
[Parameter] public ProjectCreateDto NewProject { get; set; } = new();
[Parameter] public EventCallback<ProjectCreateDto> OnProjectCreated { get; set; }
[Parameter] public string SearchText { get; set; } = "";
private List<UserDto>? users;
private string? errorMessage;
protected override async Task OnInitializedAsync()
{
await LoadUsersAsync();
}
private async Task LoadUsersAsync()
{
var userResult = await UserService.GetUsersAsync();
Console.WriteLine($"UserService.GetUsersAsync result: Success={userResult.Success}, Data={userResult.Data?.Count}, Error={userResult.Error}");
if (userResult.Success && userResult.Data != null)
{
users = userResult.Data;
}
else
{
errorMessage = userResult.Error ?? "Fehler beim Laden der Benutzer.";
}
}
private IEnumerable<UserDto> FilteredUsers => users is null || string.IsNullOrWhiteSpace(SearchText)
? Enumerable.Empty<UserDto>()
: users.Where(u => $"{u.FirstName} {u.LastName} {u.Username}"
.Contains(SearchText, StringComparison.OrdinalIgnoreCase));
private void CloseModal()
{
ShowModal = false;
ShowModalChanged.InvokeAsync(ShowModal);
}
private void ToggleProjectManager(int userId, bool isChecked)
{
if (isChecked)
{
if (!NewProject.ProjectManagerIds.Contains(userId))
NewProject.ProjectManagerIds.Add(userId);
}
else
{
NewProject.ProjectManagerIds.Remove(userId);
}
}
private async Task CreateProjectAsync()
{
var result = await ProjectService.CreateProjectAsync(NewProject);
if (result.Success)
{
await OnProjectCreated.InvokeAsync(NewProject);
CloseModal();
}
}
}