148 lines
6.4 KiB
Plaintext
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();
|
|
}
|
|
}
|
|
} |