Commit: 736a0cc
Parent: d9c21a8

Add types to questions

Mårten Åsberg committed on 2026-05-28 at 13:03
MatDenDagen/Components/Pages/Admin/Questions.razor +19 -1
diff --git a/MatDenDagen/Components/Pages/Admin/Questions.razor b/MatDenDagen/Components/Pages/Admin/Questions.razor
index f15816e..aaf7121 100644
@@ -13,6 +13,14 @@
{
<li>
<span>@question.Text</span>
<span>
@(question.Type switch
{
QuestionType.LongText => "Långt svar",
QuestionType.ShortText => "Kort svar",
_ => "Okänd frågetyp",
})
</span>
<EditForm FormName="@($"RemoveQuestion-{question.Id}")" Model="@removeQuestionModel" OnSubmit="@RemoveQuestion"
Enhance>
<input type="hidden" name="removeQuestionModel.QuestionId" value="@question.Id" />
@@ -32,6 +40,15 @@
</label>
</p>
<p>
<label>
<span>Typ:</span>
<select name="addQuestionModel.Type">
<option value="LongText">Långt svar</option>
<option value="ShortText">Kort svar</option>
</select>
</label>
</p>
<p>
<input type="submit" value="Lägg till" />
</p>
</EditForm>
@@ -55,7 +72,7 @@
{
return;
}
var question = new Question { Id = Guid.CreateVersion7(timeProvider.GetUtcNow()), Text = text };
var question = new Question { Id = Guid.CreateVersion7(timeProvider.GetUtcNow()), Text = text, Type = addQuestionModel.Type };
questionnaireContext.Questions.Add(question);
await questionnaireContext.SaveChangesAsync();
}
@@ -78,6 +95,7 @@
private sealed class AddQuestionModel
{
public string? Text { get; set; }
public QuestionType Type { get; set; } = QuestionType.LongText;
}
private sealed class RemoveQuestionModel
MatDenDagen/Components/Pages/Admin/Questions.razor.css +12 -18
diff --git a/MatDenDagen/Components/Pages/Admin/Questions.razor.css b/MatDenDagen/Components/Pages/Admin/Questions.razor.css
index 7f88ff7..666ffe4 100644
@@ -1,24 +1,18 @@
ul {
list-style: none;
}
li {
display: flex;
justify-content: space-between;
align-items: center;
background-color: var(--paper-color);
border: 1px solid var(--wood-medium);
border-radius: var(--border-radius);
padding: 1em 1.5em;
margin: 1em 0;
}
span {
font-weight: 500;
}
display: grid;
grid-template-columns: 1fr auto auto;
gap: 1em;
.EditForm {
margin-left: 1em;
li {
display: grid;
grid-template-columns: subgrid;
grid-column: span 3;
background-color: var(--paper-color);
border: 1px solid var(--wood-medium);
border-radius: var(--border-radius);
padding: 1em 1.5em;
}
}
input[type="submit"] {
MatDenDagen/Components/Pages/Submission.razor +8 -1
diff --git a/MatDenDagen/Components/Pages/Submission.razor b/MatDenDagen/Components/Pages/Submission.razor
index 264305c..48b9022 100644
@@ -56,7 +56,14 @@
<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>
@if (question.Type == QuestionType.ShortText)
{
<input type="text" name="answer[@question.Id]" class="form-input" placeholder="Ditt svar här..." />
}
else
{
<textarea name="answer[@question.Id]" class="form-textarea" placeholder="Ditt svar här..."></textarea>
}
</label>
</div>
}
MatDenDagen/Infrastructure/Storage/Database/Migrations/20260528095336_AddQuestionType.Designer.cs +178 -0
diff --git a/MatDenDagen/Infrastructure/Storage/Database/Migrations/20260528095336_AddQuestionType.Designer.cs b/MatDenDagen/Infrastructure/Storage/Database/Migrations/20260528095336_AddQuestionType.Designer.cs
new file mode 100644
index 0000000..9e5dfa3
@@ -0,0 +1,178 @@
// <auto-generated />
using System;
using MatDenDagen.Infrastructure.Storage.Database;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace MatDenDagen.Infrastructure.Storage.Database.Migrations
{
[DbContext(typeof(QuestionnaireContext))]
[Migration("20260528095336_AddQuestionType")]
partial class AddQuestionType
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "10.0.7");
modelBuilder.Entity("MatDenDagen.Models.Answer", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT");
b.Property<Guid>("QuestionId")
.HasColumnType("TEXT");
b.Property<Guid?>("SubmissionId")
.HasColumnType("TEXT");
b.Property<string>("Text")
.IsRequired()
.HasColumnType("TEXT");
b.HasKey("Id");
b.HasIndex("QuestionId");
b.HasIndex("SubmissionId");
b.ToTable("Answer");
});
modelBuilder.Entity("MatDenDagen.Models.Config", b =>
{
b.Property<string>("Key")
.HasColumnType("TEXT");
b.Property<string>("Value")
.IsRequired()
.HasColumnType("TEXT");
b.HasKey("Key");
b.ToTable("Configs");
});
modelBuilder.Entity("MatDenDagen.Models.Participant", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("TEXT");
b.Property<int?>("NotificationMinutesOffset")
.HasColumnType("INTEGER");
b.Property<string>("PhoneNumber")
.IsRequired()
.HasColumnType("TEXT");
b.HasKey("Id");
b.HasIndex("PhoneNumber")
.IsUnique();
b.ToTable("Participants");
});
modelBuilder.Entity("MatDenDagen.Models.Question", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT");
b.Property<string>("Text")
.IsRequired()
.HasColumnType("TEXT");
b.Property<int>("Type")
.HasColumnType("INTEGER");
b.HasKey("Id");
b.ToTable("Questions");
});
modelBuilder.Entity("MatDenDagen.Models.Submission", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT");
b.Property<Guid>("Participant")
.HasColumnType("TEXT");
b.HasKey("Id");
b.HasIndex("Participant");
b.ToTable("Submissions");
});
modelBuilder.Entity("MatDenDagen.Models.Upload", b =>
{
b.Property<string>("Id")
.HasColumnType("TEXT");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("TEXT");
b.Property<Guid?>("SubmissionId")
.HasColumnType("TEXT");
b.HasKey("Id");
b.HasIndex("SubmissionId");
b.ToTable("Upload");
});
modelBuilder.Entity("MatDenDagen.Models.Answer", b =>
{
b.HasOne("MatDenDagen.Models.Question", null)
.WithMany()
.HasForeignKey("QuestionId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("MatDenDagen.Models.Submission", null)
.WithMany("Answers")
.HasForeignKey("SubmissionId");
});
modelBuilder.Entity("MatDenDagen.Models.Submission", b =>
{
b.HasOne("MatDenDagen.Models.Participant", null)
.WithMany()
.HasForeignKey("Participant")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("MatDenDagen.Models.Upload", b =>
{
b.HasOne("MatDenDagen.Models.Submission", null)
.WithMany("Uploads")
.HasForeignKey("SubmissionId");
});
modelBuilder.Entity("MatDenDagen.Models.Submission", b =>
{
b.Navigation("Answers");
b.Navigation("Uploads");
});
#pragma warning restore 612, 618
}
}
}
MatDenDagen/Infrastructure/Storage/Database/Migrations/20260528095336_AddQuestionType.cs +28 -0
diff --git a/MatDenDagen/Infrastructure/Storage/Database/Migrations/20260528095336_AddQuestionType.cs b/MatDenDagen/Infrastructure/Storage/Database/Migrations/20260528095336_AddQuestionType.cs
new file mode 100644
index 0000000..1778de9
@@ -0,0 +1,28 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace MatDenDagen.Infrastructure.Storage.Database.Migrations
{
/// <inheritdoc />
public partial class AddQuestionType : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<int>(
name: "Type",
table: "Questions",
type: "INTEGER",
nullable: false,
defaultValue: 0
);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(name: "Type", table: "Questions");
}
}
}
MatDenDagen/Infrastructure/Storage/Database/Migrations/QuestionnaireContextModelSnapshot.cs +3 -0
diff --git a/MatDenDagen/Infrastructure/Storage/Database/Migrations/QuestionnaireContextModelSnapshot.cs b/MatDenDagen/Infrastructure/Storage/Database/Migrations/QuestionnaireContextModelSnapshot.cs
index c886c0b..356c324 100644
@@ -91,6 +91,9 @@ namespace MatDenDagen.Infrastructure.Storage.Database.Migrations
.IsRequired()
.HasColumnType("TEXT");
b.Property<int>("Type")
.HasColumnType("INTEGER");
b.HasKey("Id");
b.ToTable("Questions");
MatDenDagen/Models/Question.cs +7 -0
diff --git a/MatDenDagen/Models/Question.cs b/MatDenDagen/Models/Question.cs
index 4a87dc6..c0c5872 100644
@@ -2,8 +2,15 @@ using System;
namespace MatDenDagen.Models;
public enum QuestionType
{
LongText,
ShortText,
}
public sealed class Question
{
public required Guid Id { get; init; }
public required string Text { get; init; }
public required QuestionType Type { get; init; }
}
MatDenDagen/wwwroot/app.css +4 -1
diff --git a/MatDenDagen/wwwroot/app.css b/MatDenDagen/wwwroot/app.css
index 8f30ec1..844d010 100644
@@ -106,9 +106,12 @@ h4 {
}
p {
margin-bottom: 1.2em;
font-size: 1.1rem;
line-height: 1.8;
&:not(:last-of-type) {
margin-block-end: 1.2em;
}
}
a {