Files
LeaJobTrackerWebApp/Desktop/hallo/LEA/Views/Home/Index.cshtml
younes elhaddoury bb13759af4 hallo
2025-09-17 10:28:02 +02:00

211 lines
9.7 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@model DashboardViewModel
@using System.Text.Encodings.Web
@using System.Text.Json
@using System.Linq
@{
ViewData["Title"] = "Übersicht";
var chartSerializerOptions = new JsonSerializerOptions(JsonSerializerDefaults.Web)
{
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
};
var monthlyStats = Model.MonthlyApplications ?? Array.Empty<MonthlyApplicationStat>();
var recentApplications = Model.RecentApplications ?? Enumerable.Empty<Application>();
}
@if (!Model.IsAuthenticated)
{
<section class="hero">
<div class="hero-content">
<p class="eyebrow">LEA Bewerbungs-Tracker</p>
<h1>Behalte deine Bewerbungen mühelos im Blick</h1>
<p class="lead">Erfasse Bewerbungen, aktualisiere Status und sammle Notizen an einem Ort. Mit wenigen Klicks bleibst du organisiert und bestens vorbereitet auf jedes Gespräch.</p>
<div class="hero-actions">
<a class="btn btn-primary" asp-controller="Account" asp-action="Register">Jetzt registrieren</a>
<a class="btn btn-outline" asp-controller="Account" asp-action="Login">Anmelden</a>
</div>
</div>
<div class="hero-visual" aria-hidden="true">
<div class="hero-card">
<span class="status-badge status-applied">Beworben</span>
<span class="status-badge status-interview">Interview</span>
<span class="status-badge status-offer">Angebot</span>
<span class="status-badge status-rejected">Abgelehnt</span>
</div>
<div class="hero-highlight">
<p><strong>Smarter Überblick</strong></p>
<p>Analysiere Trends, nutze Filter und führe strukturierte Gespräche mit deinem nächsten Arbeitgeber.</p>
</div>
</div>
</section>
<section class="feature-grid">
<article class="feature-card">
<h3>Bewerbungen speichern</h3>
<p>Lege jede Bewerbung mit wenigen Angaben an inklusive Ansprechpartner, Quelle und individuellen Notizen.</p>
</article>
<article class="feature-card">
<h3>Status &amp; Fortschritt</h3>
<p>Halte Termine und Feedback fest, aktualisiere den Status und bleibe immer einen Schritt voraus.</p>
</article>
<article class="feature-card">
<h3>Individuelle Statistiken</h3>
<p>Erhalte auf einen Blick, wie viele Bewerbungen offen, im Interview oder bereits abgeschlossen sind.</p>
</article>
</section>
}
else
{
<section class="dashboard-header">
<div>
<p class="eyebrow">Willkommen zurück</p>
<h1>@(string.IsNullOrWhiteSpace(Model.FullName) ? "Dein Bewerbungs-Dashboard" : $"Hallo, {Model.FullName}!")</h1>
<p class="lead">Behalte deine Bewerbungen im Blick, aktualisiere den Status und bereite dich optimal auf deine nächsten Schritte vor.</p>
<div class="action-group">
<a class="btn btn-primary" asp-controller="Applications" asp-action="Create">Neue Bewerbung erfassen</a>
<a class="btn btn-outline" asp-controller="Applications" asp-action="Index">Alle Bewerbungen anzeigen</a>
</div>
</div>
</section>
<section class="stats-grid">
<article class="stat-card">
<p class="stat-label">Gesamt</p>
<p class="stat-value">@Model.TotalApplications</p>
<p class="stat-caption">Bewerbungen insgesamt</p>
</article>
<article class="stat-card">
<p class="stat-label">Beworben</p>
<p class="stat-value">@Model.AppliedCount</p>
<p class="stat-caption">Offene Bewerbungen</p>
</article>
<article class="stat-card">
<p class="stat-label">Interviews</p>
<p class="stat-value">@Model.InterviewCount</p>
<p class="stat-caption">Geplante Gespräche</p>
</article>
<article class="stat-card">
<p class="stat-label">Angebote</p>
<p class="stat-value">@Model.OfferCount</p>
<p class="stat-caption">Erfolgreiche Angebote</p>
</article>
<article class="stat-card">
<p class="stat-label">Absagen</p>
<p class="stat-value">@Model.RejectedCount</p>
<p class="stat-caption">Erhaltene Rückmeldungen</p>
</article>
</section>
<section class="visual-grid">
<article class="chart-card">
<div class="chart-card-header">
<h2>Statusübersicht</h2>
<p>Wie sich deine Bewerbungen aktuell verteilen.</p>
</div>
@if (Model.TotalApplications == 0)
{
<p class="chart-empty">Sobald du Bewerbungen erfasst, erscheint hier eine Visualisierung.</p>
}
else
{
var statusChartConfig = JsonSerializer.Serialize(new
{
type = "doughnut",
labels = new[] { "Beworben", "Interview", "Angebot", "Abgelehnt" },
values = new[] { Model.AppliedCount, Model.InterviewCount, Model.OfferCount, Model.RejectedCount },
colors = new[] { "#4460f7", "#3ac0a0", "#ff9f43", "#ef476f" },
borderColor = "#ffffff",
datasetLabel = "Bewerbungen",
legend = true
}, chartSerializerOptions);
<div class="chart-wrapper">
<canvas id="dashboard-status-chart" data-chart='@Html.Raw(statusChartConfig)'></canvas>
</div>
}
</article>
<article class="chart-card">
<div class="chart-card-header">
<h2>Monatlicher Verlauf</h2>
<p>Wie viele Bewerbungen du in den letzten Monaten versendet hast.</p>
</div>
@if (!monthlyStats.Any(stat => stat.Count > 0))
{
<p class="chart-empty">Sobald Bewerbungen vorhanden sind, zeigen wir hier deinen Verlauf.</p>
}
else
{
var monthlyLabels = monthlyStats.Select(stat => stat.Label).ToArray();
var monthlyValues = monthlyStats.Select(stat => stat.Count).ToArray();
var monthlyChartConfig = JsonSerializer.Serialize(new
{
type = "line",
labels = monthlyLabels,
values = monthlyValues,
colors = new[] { "rgba(68, 96, 247, 0.20)" },
borderColor = "#4460f7",
datasetLabel = "Bewerbungen",
tension = 0.35,
fill = true,
legend = false
}, chartSerializerOptions);
<div class="chart-wrapper">
<canvas id="dashboard-monthly-chart" data-chart='@Html.Raw(monthlyChartConfig)'></canvas>
</div>
}
</article>
</section>
<section class="recent-applications">
<div class="section-header">
<h2>Aktuelle Bewerbungen</h2>
<a class="link" asp-controller="Applications" asp-action="Index">Zur Bewerbungsübersicht</a>
</div>
@if (!recentApplications.Any())
{
<div class="empty-state">
<p>Noch keine Bewerbungen erfasst.</p>
<a class="btn btn-primary" asp-controller="Applications" asp-action="Create">Jetzt starten</a>
</div>
}
else
{
<div class="table-responsive">
<table class="data-table">
<thead>
<tr>
<th>Unternehmen</th>
<th>Rolle</th>
<th>Status</th>
<th>Beworben am</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var application in recentApplications)
{
<tr>
<td>@application.Company</td>
<td>@application.Role</td>
<td>
<span class="status-badge status-@application.Status.ToString().ToLowerInvariant()">
@application.Status.GetDisplayName()
</span>
</td>
<td>@application.AppliedOn.ToString("dd.MM.yyyy")</td>
<td class="table-actions">
<a class="link" asp-controller="Applications" asp-action="Details" asp-route-id="@application.Id">Details</a>
</td>
</tr>
}
</tbody>
</table>
</div>
}
</section>
}