@page "/projects/{id:int}" @using OnProfNext.Client.Services @inject ProjectApiService ProjectService @inject NavigationManager Nav @inject OrderApiService OrderService @inject UserApiService UserService @using OnProfNext.Shared.Models.DTOs

📁 Projekt-Details

@if (isLoading) {

Projekt wird geladen...

} else if (errorMessage is not null) {
@errorMessage
} else if (project is null) {
Projekt nicht gefunden.
} else {

@project.ProjectName

@project.Status

@project.Description

@project.StartDate.ToString("dd.MM.yyyy") @if (project.EndDate is not null) { – @project.EndDate?.ToString("dd.MM.yyyy") } Mandant: @project.MandantId
@if (project.ProjectManagers?.Any() == true) {
Projektleiter
@foreach (var manager in project.ProjectManagers) { @manager.FullName }
}
@switch (activeTab) { case "overview":
Projektübersicht

Hier kommt später ein Überblick über Fortschritt, KPIs und Aktivitäten.

break; case "tasks":
Aufträge
@if (orders is null) {

Aufträge werden geladen...

} else if (!orders.Any()) {
Keine Aufträge vorhanden.
} else { @foreach (var o in orders) { }
Nr. Titel Status Plan (h) Ist (h) Mitarbeiter
@o.Auftragsnummer @o.Titel @o.Status @o.Planstunden @o.Iststunden noch offen
}
@if (showAddOrderModal) { } break; case "bookings":
Buchungen

Zeiterfassungen und Plan/Ist-Vergleiche werden hier erscheinen.

break; case "members":
Mitarbeiter

Teamzuordnung, Rollenverwaltung, People Picker.

break; case "documents":
Dokumente

Dateiupload, SharePoint-Verknüpfung, Projektreports.

break; case "comments":
Kommentare

Chat/Kommentarbereich für Projektkommunikation.

break; }
} @code { [Parameter] public int id { get; set; } private ProjectDto? project; private string? errorMessage; private bool isLoading = true; // Tabs private string activeTab = "overview"; private readonly List<(string Key, string Title, string Icon)> tabs = new() { ("overview", "Übersicht", "bi bi-house"), ("tasks", "Aufträge", "bi bi-list-task"), ("bookings", "Buchungen", "bi bi-clock-history"), ("members", "Mitarbeiter", "bi bi-people"), ("documents", "Dokumente", "bi bi-folder2-open"), ("comments", "Kommentare", "bi bi-chat-left-text") }; protected override async Task OnInitializedAsync() { await LoadProjectAsync(); var result = await OrderService.GetOrdersByProjectAsync(1); Console.WriteLine($"Orders loaded: {result.Data?.Count}"); } private async Task LoadProjectAsync() { try { var result = await ProjectService.GetProjectAsync(id); if (!result.Success) { errorMessage = result.Error; return; } project = result.Data; } catch (Exception ex) { errorMessage = $"Fehler beim Laden: {ex.Message}"; } finally { isLoading = false; } } private string GetStatusColor(string? status) => status switch { "Geplant" => "secondary", "In Arbeit" => "info", "Abgeschlossen" => "success", _ => "light" }; private void SetActiveTab(string key) => activeTab = key; private void GoBack() => Nav.NavigateTo("/projects"); private List? orders; private bool showAddOrderModal = false; private OrderDto newOrder = new(); private List users = new(); private string searchText = ""; private List selectedUserIds = new(); private IEnumerable FilteredUsers => string.IsNullOrWhiteSpace(searchText) ? users : users.Where(u => $"{u.FirstName} {u.LastName} {u.Username}".Contains(searchText, StringComparison.OrdinalIgnoreCase)); private void ToggleUser(int id, bool selected) { if (selected) { selectedUserIds.Add(id); } else { selectedUserIds.Remove(id); } } private void ShowAddOrderModal() { newOrder = new OrderDto { ProjectId = project!.Id, Status = "Geplant", MandantId = project.MandantId }; selectedUserIds.Clear(); searchText = ""; showAddOrderModal = true; } private void CloseAddOrderModal() => showAddOrderModal = false; private async Task LoadOrderAsync() { var result = await OrderService.GetOrdersByProjectAsync(project!.Id); if(result.Success) { orders = result.Data; } else { errorMessage = result.Error; } } private async Task CreateOrderAsync() { var result = await OrderService.CreateOrderAsync(newOrder); if(!result.Success) { errorMessage = result.Error; return; } CloseAddOrderModal(); await LoadOrderAsync(); } private async Task DeleteOrder(int id) { var result = await OrderService.DeleteOrderAsync(id); if (result.Success) { await LoadOrderAsync(); } else { errorMessage = result.Error; } } }