Modernize UI with DevExpress icons and improved layout

Updated `Index.cshtml`:
- Added icons and a more descriptive project title.
- Introduced a new introductory paragraph explaining the app's purpose.
- Replaced the old alert section with a detailed workflow explanation.
- Added cards for invoice upload and summary navigation.
- Included a technology stack section with badges for key tools.

Updated `Details.cshtml`:
- Replaced text-based icons with DevExpress icons for titles, buttons, and attachments.
- Improved attachment handling with `<i>` tags and consistent icon usage.
- Updated "No attachments" message to include an icon.

These changes enhance the UI's visual consistency, usability, and professionalism.
This commit is contained in:
OlgunR
2026-06-02 16:56:50 +02:00
parent a55e53521f
commit 84a4c182e2
2 changed files with 84 additions and 36 deletions

View File

@@ -5,33 +5,81 @@
} }
<div class="content-block"> <div class="content-block">
<h2>Willkommen bei DXApp.TemplateKitProject</h2> <h2><i class="dx-icon-product"></i> DevExpress TemplateKit Evaluierungsprojekt</h2>
<p class="lead text-muted">Validierung von DevExpress als Ablösung für GdPicture im Rahmen der E-Rechnungsverarbeitung</p>
<div class="alert alert-info mt-4"> <div class="alert alert-primary mt-4">
<h4>?? ZUGFeRD-Rechnungsverarbeitung</h4> <h4><i class="dx-icon-todo"></i> Projektziel: ZUGFeRD/Factur-X Rechnungsverarbeitung</h4>
<p>Diese Anwendung ermöglicht die Verarbeitung von ZUGFeRD/Factur-X Rechnungen:</p> <p>Diese Anwendung demonstriert die vollständige Verarbeitungskette für elektronische Rechnungen:</p>
<ul>
<li>? Upload von PDF/A-Rechnungen</li> <ol class="mt-3">
<li>? Automatische Extraktion von ZUGFeRD-XML</li> <li class="mb-2">
<li>? Parsing und Speicherung in der Datenbank</li> <strong>Upload & Validierung</strong>
<li>? Erstellung von Result-PDFs mit Verarbeitungsstempel</li> <br/>
<li>? Anzeige von Anhängen (XML, PDF, Bilder)</li> <small class="text-muted">E-Rechnungen im PDF/A-Format hochladen und auf Konformität prüfen</small>
</ul> </li>
<li class="mb-2">
<strong>Extraktion</strong>
<br/>
<small class="text-muted">Automatische Erkennung und Extraktion eingebetteter Anhänge (ZUGFeRD-XML, Bilder, Dokumente)</small>
</li>
<li class="mb-2">
<strong>Datenverarbeitung</strong>
<br/>
<small class="text-muted">Parsing der Rechnungsdaten aus dem ZUGFeRD-XML und persistente Speicherung in der Datenbank</small>
</li>
<li class="mb-2">
<strong>Workflow-Integration</strong>
<br/>
<small class="text-muted">Durchlauf definierter Verarbeitungsschritte mit Status-Tracking</small>
</li>
<li class="mb-2">
<strong>Ausgabe-Generierung</strong>
<br/>
<small class="text-muted">Erstellung einer Result-PDF mit Verarbeitungsstempel und angehängtem Ergebnisbericht</small>
</li>
<li class="mb-2">
<strong>Visualisierung</strong>
<br/>
<small class="text-muted">Interaktive Anzeige aller Anhänge (XML mit Syntax-Highlighting, PDF-Viewer, Bilder)</small>
</li>
</ol>
</div> </div>
<div class="mt-4"> <div class="row mt-4">
<h4>Navigation</h4> <div class="col-md-6">
<div class="list-group"> <div class="card">
<a href="/Invoices/Upload" class="list-group-item list-group-item-action"> <div class="card-body">
<strong>?? PDF hochladen</strong> <h5 class="card-title"><i class="dx-icon-upload"></i> Rechnungen hochladen</h5>
<br/> <p class="card-text">Laden Sie ZUGFeRD-konforme E-Rechnungen hoch und starten Sie die automatische Verarbeitung.</p>
<small class="text-muted">Laden Sie eine ZUGFeRD-Rechnung hoch und verarbeiten Sie diese.</small> <a href="/Invoices/Upload" class="btn btn-primary">
</a> <i class="dx-icon-upload"></i> Zum Upload
<a href="/Invoices" class="list-group-item list-group-item-action">
<strong>?? Rechnungen</strong>
<br/>
<small class="text-muted">Zeigen Sie alle importierten Rechnungen an.</small>
</a> </a>
</div> </div>
</div> </div>
</div> </div>
<div class="col-md-6">
<div class="card">
<div class="card-body">
<h5 class="card-title"><i class="dx-icon-chart"></i> Rechnungsübersicht</h5>
<p class="card-text">Zeigen Sie alle importierten Rechnungen an und greifen Sie auf Details und Anhänge zu.</p>
<a href="/Invoices" class="btn btn-secondary">
<i class="dx-icon-doc"></i> Zur Übersicht
</a>
</div>
</div>
</div>
</div>
<div class="alert alert-light mt-4">
<h6 class="mb-2"><i class="dx-icon-preferences"></i> Technologie-Stack</h6>
<div class="d-flex flex-wrap gap-2">
<span class="badge bg-secondary">ASP.NET Core 8.0</span>
<span class="badge bg-secondary">DevExpress v25.2</span>
<span class="badge bg-secondary">Entity Framework Core</span>
<span class="badge bg-secondary">PDF.js</span>
<span class="badge bg-secondary">CodeMirror</span>
<span class="badge bg-secondary">SQL Server</span>
</div>
</div>
</div>

View File

@@ -11,14 +11,14 @@
} }
} }
<h2>📄 Rechnungsdetails</h2> <h2><i class="dx-icon-doc"></i> Rechnungsdetails</h2>
<a href="/Invoices" class="btn btn-secondary mb-3"> Zurück zur Liste</a> <a href="/Invoices" class="btn btn-secondary mb-3"><i class="dx-icon-back"></i> Zurück zur Liste</a>
@if (!string.IsNullOrEmpty(Model.Invoice?.ResultFilePath)) @if (!string.IsNullOrEmpty(Model.Invoice?.ResultFilePath))
{ {
<button class="btn btn-primary mb-3 ms-2" <button class="btn btn-primary mb-3 ms-2"
onclick="openPdfViewer(@Model.Invoice.Id)"> onclick="openPdfViewer(@Model.Invoice.Id)">
📄 Ergebnis anzeigen <i class="dx-icon-pdffile"></i> Ergebnis anzeigen
</button> </button>
} }
@@ -60,26 +60,26 @@ else
@* Anhänge-Sektion *@ @* Anhänge-Sektion *@
@if (Model.Invoice.Attachments.Any()) @if (Model.Invoice.Attachments.Any())
{ {
<h4 class="mt-4">📎 Anhänge (@Model.Invoice.Attachments.Count)</h4> <h4 class="mt-4"><i class="dx-icon-attach"></i> Anhänge (@Model.Invoice.Attachments.Count)</h4>
<div class="list-group"> <div class="list-group">
@foreach (var attachment in Model.Invoice.Attachments) @foreach (var attachment in Model.Invoice.Attachments)
{ {
var icon = attachment.IsZugferdXml ? "📋" : "📄"; var icon = "dx-icon-file";
var extension = System.IO.Path.GetExtension(attachment.OriginalFileName).ToLowerInvariant(); var extension = System.IO.Path.GetExtension(attachment.OriginalFileName).ToLowerInvariant();
icon = extension switch icon = extension switch
{ {
".xml" => "📋", ".xml" => "dx-icon-exportxlsx",
".pdf" => "📄", ".pdf" => "dx-icon-pdffile",
".jpg" or ".jpeg" or ".png" or ".gif" => "🖼️", ".jpg" or ".jpeg" or ".png" or ".gif" => "dx-icon-image",
".txt" => "📝", ".txt" => "dx-icon-txtfile",
_ => "📎" _ => "dx-icon-file"
}; };
<a href="javascript:void(0);" <a href="javascript:void(0);"
class="list-group-item list-group-item-action d-flex justify-content-between align-items-center" class="list-group-item list-group-item-action d-flex justify-content-between align-items-center"
onclick="openAttachmentViewer('@attachment.OriginalFileName', '@Uri.EscapeDataString(attachment.SavedFilePath)', '@extension')"> onclick="openAttachmentViewer('@attachment.OriginalFileName', '@Uri.EscapeDataString(attachment.SavedFilePath)', '@extension')">
<div> <div>
<span class="me-2">@icon</span> <i class="@icon me-2"></i>
<strong>@attachment.OriginalFileName</strong> <strong>@attachment.OriginalFileName</strong>
@if (attachment.IsZugferdXml) @if (attachment.IsZugferdXml)
{ {
@@ -98,7 +98,7 @@ else
} }
else else
{ {
<h4 class="mt-4">📎 Anhänge</h4> <h4 class="mt-4"><i class="dx-icon-attach"></i> Anhänge</h4>
<div class="alert alert-info">Keine Anhänge extrahiert.</div> <div class="alert alert-info">Keine Anhänge extrahiert.</div>
} }