📄
MatDenDagen/Components/Pages/Submission.razor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
@page "/submission"
@using MatDenDagen.Infrastructure.Storage.BlobStorage
@using MatDenDagen.Infrastructure.Storage.Database
@using MatDenDagen.Models
@using Microsoft.AspNetCore.Http
@using Microsoft.EntityFrameworkCore
@inject TimeProvider timeProvider
@inject BlobStorageService blobService
@inject QuestionnaireContext questionnaireContext
@inject NavigationManager navigationManager
@layout MainLayout
<div class="submission-page">
<h1>Skicka in ditt svar</h1>
<div class="cookbook-intro card">
<p>Fyll i dina svar på frågorna nedan, skriv så mycket eller lite du vill på varje fråga, eller skippa frågor du
inte har något svar till.</p>
</div>
@if (success)
{
<div class="success-message card">
<h2>Tack för ditt svar!</h2>
<p>Ditt svar har skickats in och vi ser fram emot att planera en underbar matupplevelse tillsammans.</p>
</div>
}
@if (errorMessage is not null)
{
<div class="error-message card">
<h3>Ett fel uppstod</h3>
<p>@errorMessage</p>
</div>
}
@if (questions.Count == 0)
{
<div class="card">
<p>Inga frågor hittades. Var god kontakta administratören.</p>
</div>
}
else
{
<form method="post" enctype="multipart/form-data" @formname="Submission" class="submission-form">
<div class="form-group card">
<label>
<span class="form-label">Telefonnummer (obligatoriskt)</span>
<input type="text" name="phoneNumber" required placeholder="072XXXXXXX" class="form-input" />
</label>
</div>
<div class="form-questions">
@foreach (var question in questions)
{
<div class="form-group card">
<label>
<span class="question-text">@question.Text</span>
<textarea name="answer[@question.Id]" class="form-textarea" placeholder="Ditt svar här..."></textarea>
</label>
</div>
}
</div>
<div class="form-group card">
<span class="form-label">Bilagor</span>
<label class="file-upload-button">
<input type="file" name="files" multiple class="form-file-hidden" />
<span class="btn file-upload-text">Välj filer att ladda upp</span>
</label>
<p class="form-hint">Du kan ladda upp bilder eller dokument som kan vara relevanta.</p>
</div>
<div class="form-actions">
<button type="submit" class="btn submit-btn">Skicka in svar</button>
</div>
</form>
}
</div>
@code {
[CascadingParameter]
private HttpContext? HttpContext { get; set; }
private bool success = false;
private List<Question> questions = [];
private string? errorMessage = null;
protected override async Task OnInitializedAsync()
{
questions = await questionnaireContext.Questions.ToListAsync(HttpContext.RequestAborted);
if (HttpContext?.Request.Method != "POST")
return;
var form = HttpContext.Request.Form;
var phoneNumber = form["phoneNumber"].ToString();
var participant = await questionnaireContext.Participants
.SingleOrDefaultAsync(p => p.PhoneNumber == phoneNumber, HttpContext.RequestAborted);
if (participant is null)
{
errorMessage = "Okänt telefonnummer. Var god kontakta administratören för att registrera ditt telefonnummer.";
return;
}
var uploads = new List<Upload>();
foreach (var file in form.Files)
{
await using var stream = file.OpenReadStream();
var result = await blobService.SaveBlob(stream, HttpContext.RequestAborted);
uploads.Add(new Upload { Id = result.Id, Name = file.FileName });
}
questionnaireContext.Submissions.Add(new()
{
Id = Guid.CreateVersion7(timeProvider.GetUtcNow()),
Answers = questions.Select(q => new Answer
{
Id = Guid.CreateVersion7(timeProvider.GetUtcNow()),
QuestionId = q.Id,
Text = form[$"answer[{q.Id}]"].ToString()
}).ToList(),
Uploads = uploads,
Participant = participant.Id
});
await questionnaireContext.SaveChangesAsync(HttpContext.RequestAborted);
success = true;
}
}