Skip to content

Commit 24320c1

Browse files
authored
Merge pull request #126 from Denis-RZ/codex/fix-ui-and-backend-issues-in-create-block-page
Fix admin block assignment selection state
2 parents 181dc72 + da0d919 commit 24320c1

File tree

4 files changed

+107
-12
lines changed

4 files changed

+107
-12
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
using Microsoft.Data.Sqlite;
2+
using Microsoft.EntityFrameworkCore;
3+
using Microsoft.AspNetCore.Mvc;
4+
using MyWebApp.Controllers;
5+
using MyWebApp.Data;
6+
using MyWebApp.Models;
7+
using MyWebApp.Services;
8+
using System.Collections.Generic;
9+
using System.Threading.Tasks;
10+
using Xunit;
11+
12+
public class AdminBlockTemplateControllerTests
13+
{
14+
private static (AdminBlockTemplateController controller, ApplicationDbContext ctx, SqliteConnection conn) Create()
15+
{
16+
var conn = new SqliteConnection("DataSource=:memory:");
17+
conn.Open();
18+
var options = new DbContextOptionsBuilder<ApplicationDbContext>()
19+
.UseSqlite(conn)
20+
.Options;
21+
var ctx = new ApplicationDbContext(options);
22+
ctx.Database.EnsureCreated();
23+
var sanitizer = new HtmlSanitizerService();
24+
var controller = new AdminBlockTemplateController(ctx, sanitizer);
25+
return (controller, ctx, conn);
26+
}
27+
28+
[Fact]
29+
public async Task AddToPage_InvalidReturnsViewWithSelections()
30+
{
31+
var tuple = Create();
32+
using var connection = tuple.conn;
33+
var ctx = tuple.ctx;
34+
var controller = tuple.controller;
35+
ctx.BlockTemplates.Add(new BlockTemplate { Id = 1, Name = "b", Html = "x" });
36+
ctx.Pages.Add(new Page { Id = 1, Slug = "home", Title = "Home", Layout = "single-column" });
37+
ctx.Roles.Add(new Role { Id = 1, Name = "Admin" });
38+
ctx.SaveChanges();
39+
40+
var result = await controller.AddToPage(1, new List<int> { 1 }, "", "Admin");
41+
var view = Assert.IsType<ViewResult>(result);
42+
Assert.False(controller.ModelState.IsValid);
43+
var selected = Assert.IsType<List<int>>(controller.ViewBag.SelectedPageIds);
44+
Assert.Contains(1, selected);
45+
Assert.Equal("", controller.ViewBag.SelectedZone as string);
46+
Assert.Equal("Admin", controller.ViewBag.SelectedRole as string);
47+
}
48+
49+
[Fact]
50+
public async Task Create_InvalidModelPreservesSelections()
51+
{
52+
var tuple = Create();
53+
using var connection = tuple.conn;
54+
var ctx = tuple.ctx;
55+
var controller = tuple.controller;
56+
ctx.Pages.Add(new Page { Id = 1, Slug = "home", Title = "Home", Layout = "single-column" });
57+
ctx.Roles.Add(new Role { Id = 1, Name = "Admin" });
58+
ctx.SaveChanges();
59+
60+
var model = new BlockTemplate();
61+
controller.ModelState.AddModelError("Name", "required");
62+
var result = await controller.Create(model, new List<int> { 1 }, "main", "Admin");
63+
var view = Assert.IsType<ViewResult>(result);
64+
Assert.False(controller.ModelState.IsValid);
65+
var selected = Assert.IsType<List<int>>(controller.ViewBag.SelectedPageIds);
66+
Assert.Contains(1, selected);
67+
Assert.Equal("main", controller.ViewBag.SelectedZone as string);
68+
Assert.Equal("Admin", controller.ViewBag.SelectedRole as string);
69+
}
70+
}

website/MyWebApp/Controllers/AdminBlockTemplateController.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ public async Task<IActionResult> Create(BlockTemplate model, List<int>? pageIds,
5454
if (!ModelState.IsValid)
5555
{
5656
await LoadPagesAsync();
57+
ViewBag.SelectedPageIds = pageIds ?? new List<int>();
58+
ViewBag.SelectedZone = zone;
59+
ViewBag.SelectedRole = role;
5760
return View(model);
5861
}
5962
model.Html = _sanitizer.Sanitize(model.Html);
@@ -80,6 +83,9 @@ public async Task<IActionResult> Edit(BlockTemplate model, List<int>? pageIds, s
8083
if (!ModelState.IsValid)
8184
{
8285
await LoadPagesAsync();
86+
ViewBag.SelectedPageIds = pageIds ?? new List<int>();
87+
ViewBag.SelectedZone = zone;
88+
ViewBag.SelectedRole = role;
8389
return View(model);
8490
}
8591
model.Html = _sanitizer.Sanitize(model.Html);
@@ -175,6 +181,9 @@ public async Task<IActionResult> AddToPage(int id)
175181
if (item == null) return NotFound();
176182
await LoadPagesAsync();
177183
ViewBag.BlockId = id;
184+
ViewBag.SelectedPageIds = new List<int>();
185+
ViewBag.SelectedZone = string.Empty;
186+
ViewBag.SelectedRole = string.Empty;
178187
return View();
179188
}
180189

@@ -188,6 +197,9 @@ public async Task<IActionResult> AddToPage(int id, List<int> pageIds, string zon
188197
{
189198
await LoadPagesAsync();
190199
ViewBag.BlockId = id;
200+
ViewBag.SelectedPageIds = pageIds ?? new List<int>();
201+
ViewBag.SelectedZone = zone;
202+
ViewBag.SelectedRole = role;
191203
ModelState.AddModelError("pageIds", "Page selection required");
192204
return View();
193205
}
@@ -198,6 +210,9 @@ public async Task<IActionResult> AddToPage(int id, List<int> pageIds, string zon
198210
{
199211
await LoadPagesAsync();
200212
ViewBag.BlockId = id;
213+
ViewBag.SelectedPageIds = pageIds;
214+
ViewBag.SelectedZone = zone;
215+
ViewBag.SelectedRole = role;
201216
ModelState.AddModelError("zone", "Zone required");
202217
return View();
203218
}

website/MyWebApp/Views/AdminBlockTemplate/AddToPage.cshtml

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
@using MyWebApp.Models
2+
@{
3+
var selectedPages = ViewBag.SelectedPageIds as List<int> ?? new List<int>();
4+
var selectedZone = ViewBag.SelectedZone as string ?? string.Empty;
5+
var selectedRole = ViewBag.SelectedRole as string ?? string.Empty;
6+
}
27
@{
38
ViewData["Title"] = "Add Block To Page";
49
Layout = "../Admin/_AdminLayout";
@@ -13,10 +18,10 @@
1318
<div>
1419
<label>Assign To Pages</label>
1520
<select id="page-select" name="pageIds" multiple size="5">
16-
<option value="0">All Pages</option>
21+
<option value="0" selected="@(selectedPages.Contains(0))">All Pages</option>
1722
@foreach (var p in ViewBag.Pages as List<Page>)
1823
{
19-
<option value="@p.Id">@p.Slug</option>
24+
<option value="@p.Id" selected="@(selectedPages.Contains(p.Id))">@p.Slug</option>
2025
}
2126
</select>
2227
</div>
@@ -25,20 +30,20 @@
2530
<select id="zone-select" name="zone">
2631
@foreach (var z in ViewBag.Zones as List<string>)
2732
{
28-
<option value="@z">@z</option>
33+
<option value="@z" selected="@(selectedZone == z)">@z</option>
2934
}
3035
</select>
3136
</div>
3237
<div>
3338
<label>Role</label>
34-
39+
3540
<select name="role">
36-
<option value="">(none)</option>
41+
<option value="" selected="@(string.IsNullOrEmpty(selectedRole))">(none)</option>
3742
@foreach (var r in ViewBag.Roles as List<Role>)
3843
{
39-
<option value="@r.Name">@r.Name</option>
44+
<option value="@r.Name" selected="@(selectedRole == r.Name)">@r.Name</option>
4045
}
41-
46+
4247
</select>
4348
</div>
4449
<button type="submit">Add</button>

website/MyWebApp/Views/AdminBlockTemplate/_PageAssignment.cshtml

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
@using MyWebApp.Models
2+
@{
3+
var selectedPages = ViewBag.SelectedPageIds as List<int> ?? new List<int>();
4+
var selectedZone = ViewBag.SelectedZone as string ?? string.Empty;
5+
var selectedRole = ViewBag.SelectedRole as string ?? string.Empty;
6+
}
27
<div class="block-assignment">
38
<h3>Page Assignment</h3>
49
<div>
510
<label>Pages</label>
611
<input type="text" id="page-display" readonly />
712
<select id="page-select" name="pageIds" multiple size="5">
8-
<option value="0">All Pages</option>
13+
<option value="0" selected="@(selectedPages.Contains(0))">All Pages</option>
914
@foreach (var p in ViewBag.Pages as List<Page>)
1015
{
11-
<option value="@p.Id">@p.Slug</option>
16+
<option value="@p.Id" selected="@(selectedPages.Contains(p.Id))">@p.Slug</option>
1217
}
1318
</select>
1419
</div>
@@ -17,17 +22,17 @@
1722
<select id="zone-select" name="zone">
1823
@foreach (var z in ViewBag.Zones as List<string>)
1924
{
20-
<option value="@z">@z</option>
25+
<option value="@z" selected="@(selectedZone == z)">@z</option>
2126
}
2227
</select>
2328
</div>
2429
<div>
2530
<label>Role</label>
2631
<select name="role">
27-
<option value="">(none)</option>
32+
<option value="" selected="@(string.IsNullOrEmpty(selectedRole))">(none)</option>
2833
@foreach (var r in ViewBag.Roles as List<Role>)
2934
{
30-
<option value="@r.Name">@r.Name</option>
35+
<option value="@r.Name" selected="@(selectedRole == r.Name)">@r.Name</option>
3136
}
3237
</select>
3338
</div>

0 commit comments

Comments
 (0)