Compare commits

..

2 Commits

Author SHA1 Message Date
troogs
646ccb0f18 Add identity verification features: display image upload status and update UI elements
All checks were successful
Build And Push Dev Docker Image / docker (push) Successful in 1m30s
2026-04-20 21:20:52 +02:00
troogs
ac52bc6df9 Remove unused CSS files for AuditView, DefaultLayout, NavMenu, and site 2026-04-20 20:24:52 +02:00
8 changed files with 29 additions and 329 deletions

View File

@@ -150,6 +150,11 @@
<div class="flex-grow-1"></div>
@if(Prospect?.Images?.Count > 0)
{<div class="text-center mt-3">
<Badge Color="Color.Info" Style="margin-bottom: 0.5rem;">Perso-Check möglich</Badge></div>
}
<div class="text-center d-flex justify-content-center gap-2 mt-1">
<Button
@@ -186,6 +191,14 @@
}
}
<Button
Color="Color.Info"
Height="Height.Px(35)"
title="Identitätsprüfung"
Clicked="OpenVerificationDialogAsync"
Visibility="@(CurrentUser.IsInGroup(UserGroup.WelcomeTeam, UserGroup.Ambassador) ? Visibility.Default : Visibility.Invisible)"
><i class="fa-solid fa-address-card"></i>
</Button>
@if (Prospect?.RecordState != RecordState.Archived)
{
@@ -209,15 +222,6 @@
><i class="fa-solid fa-recycle"></i>
</Button>
}
<Button
Color="Color.Info"
Height="Height.Px(35)"
title="Identitätsprüfung"
Clicked="OpenVerificationDialogAsync"
Visibility="@(CurrentUser.IsInGroup(UserGroup.WelcomeTeam, UserGroup.Ambassador) ? Visibility.Default : Visibility.Invisible)"
><i class="fa-solid fa-address-card"></i>
</Button>
</div>

View File

@@ -243,6 +243,7 @@ namespace FoodsharingSiegen.Server.Data.Service
{
var prospect = await Context.Prospects!
.Include(x => x.Interactions)
.Include(x => x.Images)
.AsNoTracking()
.FirstOrDefaultAsync(x => x.VerificationToken == token);

View File

@@ -1,3 +0,0 @@
.p-audit > ::deep form {
height: calc(100% - 68px);
}

View File

@@ -3,6 +3,8 @@
@using System.IO
@layout LoginLayout
<PageTitle>Identitätsprüfung - @AppSettings.Value.Terms.Title</PageTitle>
<div class="row min-vh-100 align-items-center justify-content-center p-0 p-md-5 m-0">
<div class="col-12 col-md-10 col-lg-8 col-xl-5 login-form p-2">
<div class="card shadow-sm border-0">
@@ -33,7 +35,15 @@
else
{
<div class="alert alert-info mb-4">
<strong>Hinweis:</strong> Dies ist die Upload-Seite für den Foodsaver <b>@_prospect.FsId</b>.
<strong>Hinweis:</strong> Dies ist die Upload-Seite für Foodsaver <b>@_prospect.FsId</b>.
</div>
<div class="mb-1 text-muted">
Um dich auf der Foodsharing-Plattform als Foodsaver freischalten zu können, muss ein*e Botschafter*in Name, Adresse und Geburtsdatum im Profil des Foodsavers auf Korrektheit durch Vergleich mit einem Ausweisdokument prüfen. Das ist wichtig, damit die <a href="https://wiki.foodsharing.network/wiki/Rechtsvereinbarung" target="_blank">Rechtsvereinbarung</a> Bestand hat und wir die Zusagen erfüllen, die wir den Spenderbetrieben geben.<br>
</div>
<div class="mb-3 text-muted">
<a class="mt-3" href="https://wiki.foodsharing.network/wiki/Foodsaver#3.4_Verifizierung_(der_Daten),_Foodsaver-Ausweis_und_Freischaltung" target="_blank">Mehr dazu im Wiki</a>.
</div>
<div class="mb-4">
@@ -48,7 +58,6 @@
</div>
<div class="mb-4 text-center">
<span class="badge bg-secondary mb-2 text-wrap">Es können noch bis zu @(5 - _uploadedCount) Bilder hochgeladen werden</span>
@if (_uploadedCount >= 5)
{
@@ -56,6 +65,7 @@
}
else
{
<span class="badge bg-secondary mb-2 text-wrap">Es können noch bis zu @(5 - _uploadedCount) Bilder hochgeladen werden</span>
<InputFile id="fileInput" OnChange="OnInputFileChange" class="d-none" accept="image/*" />
<label for="fileInput" class="btn btn-outline-success w-100">
<i class="fa-solid fa-images me-2"></i>Bild auswählen
@@ -81,11 +91,11 @@
</div>
}
@if (_uploadedCount > 0)
@if (_isSuccess)
{
<div class="alert alert-success text-center">
<i class="fa-solid fa-check-circle fa-2x mb-2"></i><br/>
Vielen Dank für den Upload. Du kannst diese Seite nun schließen.
Vielen Dank für den Upload. Wenn du alle benötigten Bilder hochgeladen hast, kannst du die Seite schließen. Du musst nichts weiter tun.
</div>
}
}

View File

@@ -47,6 +47,7 @@ namespace FoodsharingSiegen.Server.Pages
if (result.Success && result.Data != null)
{
_prospect = result.Data;
_uploadedCount = _prospect.Images?.Count ?? 0;
}
else
{

View File

@@ -1,180 +0,0 @@
.page {
display: flex;
height: 100vh;
}
.page aside {
background-color: #f1e7c9;
width: 0;
box-shadow: 5px 5px 5px #acacac;
transition: width 250ms;
overflow: hidden auto;
}
@media screen and (min-width: 992px) {
.page aside {
width: 250px;
min-width: 250px;
}
}
.page main {
flex: 1;
width: 100%;
overflow: hidden auto;
padding: 60px 10px 10px 10px;
}
@media screen and (min-width: 992px) {
.page main {
padding: 20px;
}
}
#menu-toggler {
display: none;
}
#menu-toggler-label {
position: fixed;
top: 15px;
left: 15px;
cursor: pointer;
height: 30px;
width: calc(100% - 40px);
z-index: 1;
}
@media screen and (min-width: 992px) {
#menu-toggler-label {
display: none;
}
}
#menu-toggler-label span {
height: 6px;
background-color: #64ae24;
position: absolute;
border-radius: 3px;
left: 0;
right: 0;
width: 30px;
transition: all 0.25s ease-out;
}
#menu-toggler-label span:nth-child(2) {
top: 12px;
}
#menu-toggler-label span:nth-child(3) {
top: 24px;
}
input:checked ~ aside {
width: 250px;
}
input:checked ~ #menu-toggler-label span:nth-child(1) {
transform: translateY(12px) rotate(45deg);
}
input:checked ~ #menu-toggler-label span:nth-child(2) {
display: none;
}
input:checked ~ #menu-toggler-label span:nth-child(3) {
transform: translateY(-12px) rotate(-45deg);
}
::deep h2 {
font-size: 1.8rem;
}
@media screen and (min-width: 576px) {
::deep h2 {
font-size: 3.2rem;
line-height: 3.2rem;
}
}
@media screen and (min-width: 768px) {
::deep h2 {
font-size: 3.8rem;
line-height: 3.8rem;
}
}
@media screen and (min-width: 992px) {
::deep h2 {
font-size: 3.8rem;
line-height: 3.8rem;
}
}
@media screen and (min-width: 1200px) {
::deep h2 {
font-size: 3.8rem;
line-height: 3.8rem;
}
}
@media screen and (min-width: 1400px) {
::deep h2 {
font-size: 3.8rem;
line-height: 3.8rem;
}
}
@media screen and (min-width: 1950px) {
::deep h2 {
font-size: 3.2rem;
line-height: 3.2rem;
}
}
::deep h3 {
font-size: 1.4rem;
font-weight: 300;
}
@media screen and (min-width: 576px) {
::deep h3 {
font-size: 2.4rem;
line-height: 2.4rem;
}
}
@media screen and (min-width: 768px) {
::deep h3 {
font-size: 2.8rem;
line-height: 2.8rem;
}
}
@media screen and (min-width: 992px) {
::deep h3 {
font-size: 2.8rem;
line-height: 2.8rem;
}
}
@media screen and (min-width: 1200px) {
::deep h3 {
font-size: 2.8rem;
line-height: 2.8rem;
}
}
@media screen and (min-width: 1400px) {
::deep h3 {
font-size: 2.8rem;
line-height: 2.8rem;
}
}
@media screen and (min-width: 1950px) {
::deep h3 {
font-size: 2.4rem;
line-height: 2.4rem;
}
}

View File

@@ -1,65 +0,0 @@
nav {
padding-top: 50px;
}
@media screen and (min-width: 992px) {
nav {
padding: 0;
}
}
nav .nav-logo {
background-image: url(img/logo_text.png);
height: 55px;
width: 200px;
margin: auto;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}
@media screen and (min-width: 992px) {
nav .nav-logo {
height: 220px;
background-image: url(img/logo.png);
}
}
.oi {
width: 2rem;
font-size: 1.1rem;
vertical-align: text-top;
top: -2px;
}
.nav-item {
font-size: 0.9rem;
padding-bottom: 0.5rem;
}
.nav-item:first-of-type {
padding-top: 1rem;
}
.nav-item:last-of-type {
padding-bottom: 1rem;
}
.nav-item ::deep a {
color: #533a20;
border-radius: 4px;
height: 3rem;
display: flex;
align-items: center;
line-height: 3rem;
}
.nav-item ::deep a.active {
background-color: rgba(255, 255, 255, 0.25);
color: #64ae24;
}
.nav-item ::deep a:hover {
background-color: rgba(255, 255, 255, 0.1);
color: #64ae24;
}

View File

@@ -1,68 +0,0 @@
@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');
html, body {
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
}
h1:focus {
outline: none;
}
hr {
height: initial !important;
}
a, .btn-link {
color: green;
}
.btn-primary {
color: #fff;
background-color: #1b6ec2;
border-color: #1861ac;
}
.content {
padding-top: 1.1rem;
}
.valid.modified:not([type=checkbox]) {
outline: 1px solid #26b050;
}
.invalid {
outline: 1px solid red;
}
.validation-message {
color: red;
}
#blazor-error-ui {
background: lightyellow;
bottom: 0;
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
display: none;
left: 0;
padding: 0.6rem 1.25rem 0.7rem 1.25rem;
position: fixed;
width: 100%;
z-index: 1000;
}
#blazor-error-ui .dismiss {
cursor: pointer;
position: absolute;
right: 0.75rem;
top: 0.5rem;
}
.blazor-error-boundary {
background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121;
padding: 1rem 1rem 1rem 3.7rem;
color: white;
}
.blazor-error-boundary::after {
content: "An error has occurred."
}