110 lines
4.0 KiB
Plaintext
110 lines
4.0 KiB
Plaintext
@page "/"
|
|
@rendermode InteractiveServer
|
|
@using TodoTicketApp.Models
|
|
@using TodoTicketApp.Services
|
|
@inject ITicketService TicketService
|
|
@inject NavigationManager Nav
|
|
|
|
<PageTitle>Ticket Dashboard | Custom Theme</PageTitle>
|
|
|
|
<div class="main-container">
|
|
<header class="dashboard-header">
|
|
<h1>Ticket <span>Dashboard</span></h1>
|
|
<p class="subtitle">Effiziente FIFO-Verwaltung nach Priorität</p>
|
|
</header>
|
|
|
|
<div class="ticket-anlage">
|
|
<input class="custom-input"
|
|
placeholder="Neues Ticket-Titel eingeben..."
|
|
@bind="newTicketTitle"
|
|
@onkeyup="HandleKeyUp" />
|
|
</div>
|
|
|
|
<div class="ticket-list">
|
|
@{
|
|
bool dividerShown = false;
|
|
}
|
|
@foreach (var ticket in TicketService.GetPendingTickets())
|
|
{
|
|
@if (ticket.IsWaitingForFeedback && !dividerShown)
|
|
{
|
|
<div class="waiting-separator">
|
|
<hr class="dashed-line" />
|
|
<span class="separator-text">WARTENDE TICKETS</span>
|
|
<hr class="dashed-line" />
|
|
</div>
|
|
dividerShown = true;
|
|
}
|
|
|
|
<div class="ticket-card priority-@ticket.Priority.ToString().ToLower() @(ticket.IsWaitingForFeedback ? "is-waiting" : "")">
|
|
|
|
<div class="ticket-main-click" @onclick="() => GoToDetails(ticket.Id)">
|
|
<div class="card-header-row">
|
|
<span class="prio-badge">@ticket.Priority</span>
|
|
<small class="ticket-date">@ticket.CreatedAt.ToLocalTime().ToString("g")</small>
|
|
</div>
|
|
|
|
<h5 class="ticket-title">@ticket.Title</h5>
|
|
|
|
<div class="ticket-preview">
|
|
<p>@(ticket.Description.Length > 200 ? ticket.Description.Substring(0, 200) + "..." : ticket.Description)</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="ticket-actions-row">
|
|
<div class="meta-info">
|
|
<i class="fa fa-comment"></i> @ticket.Comments.Count
|
|
</div>
|
|
<div class="action-buttons">
|
|
<button class="custom-btn btn-wait"
|
|
@onclick="() => ToggleWaitingStatus(ticket)"
|
|
@onclick:stopPropagation="true">
|
|
@(ticket.IsWaitingForFeedback ? "Warten aufheben" : "Warten")
|
|
</button>
|
|
<button class="custom-btn btn-complete"
|
|
@onclick="() => Complete(ticket.Id)"
|
|
@onclick:stopPropagation="true">
|
|
Erledigen
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
}
|
|
</div>
|
|
</div>
|
|
|
|
@code {
|
|
private string newTicketTitle = "";
|
|
|
|
private async Task HandleKeyUp(KeyboardEventArgs e)
|
|
{
|
|
if (e.Key == "Enter" && !string.IsNullOrWhiteSpace(newTicketTitle))
|
|
{
|
|
var newTicket = new Ticket { Title = newTicketTitle };
|
|
TicketService.AddTicket(newTicket);
|
|
newTicketTitle = "";
|
|
// Hier könnten wir direkt auf die Detailseite navigieren:
|
|
// Nav.NavigateTo($"/ticket/edit/{newTicket.Id}");
|
|
}
|
|
}
|
|
|
|
private void ToggleWaitingStatus(Ticket ticket)
|
|
{
|
|
// Status umkehren
|
|
ticket.IsWaitingForFeedback = !ticket.IsWaitingForFeedback;
|
|
|
|
// In der Datenbank speichern
|
|
TicketService.UpdateTicket(ticket);
|
|
|
|
// UI explizit anweisen, sich neu zu sortieren
|
|
StateHasChanged();
|
|
}
|
|
|
|
private void Complete(Guid id)
|
|
{
|
|
TicketService.CompleteTicket(id);
|
|
StateHasChanged();
|
|
}
|
|
private void GoToDetails(Guid id) => Nav.NavigateTo($"/ticket/edit/{id}");
|
|
}
|