Skip to content

Commit dc05abc

Browse files
authored
Merge pull request #123 from Denis-RZ/fx1uyp-codex/enhance-block-management-interface
Enhance admin block UI
2 parents dee14c4 + 8ddaf46 commit dc05abc

6 files changed

Lines changed: 103 additions & 12 deletions

File tree

website/MyWebApp/Controllers/AdminBlockTemplateController.cs

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,39 +36,53 @@ public async Task<IActionResult> Index()
3636
return View(items);
3737
}
3838

39-
public IActionResult Create()
39+
public async Task<IActionResult> Create()
4040
{
41+
await LoadPagesAsync();
4142
return View(new BlockTemplate());
4243
}
4344

4445
[HttpPost]
4546
[ValidateAntiForgeryToken]
46-
public async Task<IActionResult> Create(BlockTemplate model)
47+
public async Task<IActionResult> Create(BlockTemplate model, List<int>? pageIds, string? zone, string? role)
4748
{
48-
if (!ModelState.IsValid) return View(model);
49+
if (!ModelState.IsValid)
50+
{
51+
await LoadPagesAsync();
52+
return View(model);
53+
}
4954
model.Html = _sanitizer.Sanitize(model.Html);
5055
_db.BlockTemplates.Add(model);
5156
_db.BlockTemplateVersions.Add(new BlockTemplateVersion { Template = model, Html = model.Html });
5257
await _db.SaveChangesAsync();
58+
await AddSectionsAsync(model, pageIds, zone, role);
59+
await _db.SaveChangesAsync();
5360
return RedirectToAction(nameof(Index));
5461
}
5562

5663
public async Task<IActionResult> Edit(int id)
5764
{
5865
var item = await _db.BlockTemplates.FindAsync(id);
5966
if (item == null) return NotFound();
67+
await LoadPagesAsync();
6068
return View(item);
6169
}
6270

6371
[HttpPost]
6472
[ValidateAntiForgeryToken]
65-
public async Task<IActionResult> Edit(BlockTemplate model)
73+
public async Task<IActionResult> Edit(BlockTemplate model, List<int>? pageIds, string? zone, string? role)
6674
{
67-
if (!ModelState.IsValid) return View(model);
75+
if (!ModelState.IsValid)
76+
{
77+
await LoadPagesAsync();
78+
return View(model);
79+
}
6880
model.Html = _sanitizer.Sanitize(model.Html);
6981
_db.Update(model);
7082
_db.BlockTemplateVersions.Add(new BlockTemplateVersion { BlockTemplateId = model.Id, Html = model.Html });
7183
await _db.SaveChangesAsync();
84+
await AddSectionsAsync(model, pageIds, zone, role);
85+
await _db.SaveChangesAsync();
7286
return RedirectToAction(nameof(Index));
7387
}
7488

@@ -208,4 +222,34 @@ public async Task<IActionResult> AddToPage(int id, List<int> pageIds, string zon
208222
return RedirectToAction(nameof(Index));
209223
}
210224

225+
private async Task AddSectionsAsync(BlockTemplate template, List<int>? pageIds, string? zone, string? role)
226+
{
227+
if (pageIds == null || pageIds.Count == 0 || string.IsNullOrWhiteSpace(zone))
228+
return;
229+
var roleEntity = await _db.Roles.FirstOrDefaultAsync(r => r.Name == role);
230+
int? roleId = roleEntity?.Id;
231+
zone = zone!.Trim();
232+
if (pageIds.Contains(0))
233+
{
234+
pageIds = await _db.Pages.Select(p => p.Id).ToListAsync();
235+
}
236+
foreach (var pageId in pageIds)
237+
{
238+
var sort = await _db.PageSections
239+
.Where(s => s.PageId == pageId && s.Zone == zone)
240+
.Select(s => s.SortOrder)
241+
.DefaultIfEmpty(-1)
242+
.MaxAsync() + 1;
243+
var section = new PageSection
244+
{
245+
PageId = pageId,
246+
Zone = zone,
247+
SortOrder = sort,
248+
Html = template.Html,
249+
Type = PageSectionType.Html,
250+
RoleId = roleId
251+
};
252+
_db.PageSections.Add(section);
253+
}
254+
}
211255
}

website/MyWebApp/Views/AdminBlockTemplate/AddToPage.cshtml

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,14 @@
2626
</div>
2727
<div>
2828
<label>Role</label>
29-
<select name="role" required>
30-
<option value="">Select role</option>
31-
<option value="Admin">Admin</option>
32-
<option value="Editor">Editor</option>
33-
<option value="Viewer">Viewer</option>
29+
30+
<select name="role">
31+
<option value="">(none)</option>
32+
@foreach (var r in ViewBag.Roles as List<Role>)
33+
{
34+
<option value="@r.Name">@r.Name</option>
35+
}
36+
3437
</select>
3538
</div>
3639
<button type="submit">Add</button>

website/MyWebApp/Views/AdminBlockTemplate/Create.cshtml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
<select id="section-select" style="display:none"></select>
1818
</div>
1919
</div>
20+
21+
@await Html.PartialAsync("_PageAssignment")
2022
<button type="submit">Save</button>
2123
</form>
2224

website/MyWebApp/Views/AdminBlockTemplate/Edit.cshtml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
<select id="section-select" style="display:none"></select>
1919
</div>
2020
</div>
21+
22+
@await Html.PartialAsync("_PageAssignment")
2123
<button type="submit">Save</button>
2224
</form>
2325

website/MyWebApp/Views/AdminBlockTemplate/Index.cshtml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,14 @@
1010
<button type="submit">Import</button>
1111
</form>
1212
<table>
13-
<thead><tr><th>Name</th><th></th><th></th><th></th></tr></thead>
13+
<thead><tr><th>Name</th><th></th><th></th></tr></thead>
1414
<tbody>
1515
@foreach (var t in Model)
1616
{
1717
<tr>
1818
<td>@t.Name</td>
1919
<td><a asp-action="Edit" asp-route-id="@t.Id">Edit</a></td>
2020
<td><a asp-action="Delete" asp-route-id="@t.Id">Delete</a></td>
21-
<td><a asp-action="AddToPage" asp-route-id="@t.Id">Add to Page</a></td>
2221
</tr>
2322
}
2423
</tbody>
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
@using MyWebApp.Models
2+
<div class="block-assignment">
3+
<h3>Page Assignment</h3>
4+
<div>
5+
<label>Pages</label>
6+
<input type="text" id="page-display" readonly />
7+
<select id="page-select" name="pageIds" multiple size="5">
8+
<option value="0">All Pages</option>
9+
@foreach (var p in ViewBag.Pages as List<Page>)
10+
{
11+
<option value="@p.Id">@p.Slug</option>
12+
}
13+
</select>
14+
</div>
15+
<div>
16+
<label>Zone</label>
17+
<input type="text" name="zone" />
18+
</div>
19+
<div>
20+
<label>Role</label>
21+
<select name="role">
22+
<option value="">(none)</option>
23+
@foreach (var r in ViewBag.Roles as List<Role>)
24+
{
25+
<option value="@r.Name">@r.Name</option>
26+
}
27+
</select>
28+
</div>
29+
</div>
30+
@section Scripts {
31+
<script>
32+
const select = document.getElementById('page-select');
33+
const display = document.getElementById('page-display');
34+
function updateDisplay() {
35+
const names = Array.from(select.selectedOptions).map(o => o.text);
36+
display.value = names.join(', ');
37+
}
38+
select.addEventListener('change', updateDisplay);
39+
updateDisplay();
40+
</script>
41+
}

0 commit comments

Comments
 (0)