feat(notification): add admin rest management and deletion
Add revision-safe service and template APIs, channel mapping, and validated admin controls. Ref: IT-1601
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
@using HrynCo.NotificationService.Web.Controllers.Admin.ViewModels
|
||||
@model NotificationServiceDeleteViewModel
|
||||
@{ ViewData["Title"] = "Delete service"; }
|
||||
<div class="admin-delete-confirmation">
|
||||
<nav aria-label="Breadcrumb"><ol class="breadcrumb"><li class="breadcrumb-item"><a href="/admin/services">Services</a></li><li class="breadcrumb-item active" aria-current="page">Delete service</li></ol></nav>
|
||||
<h2>Delete service @Model.Name?</h2>
|
||||
<div asp-validation-summary="All" class="text-danger" role="alert"></div>
|
||||
@if (Model.DefinitionCount > 0)
|
||||
{
|
||||
<div class="alert alert-warning">This service still has <strong>@Model.DefinitionCount template definition(s)</strong>, including definitions without translations. Remove every definition before deleting the service.</div>
|
||||
<a href="/admin/services/@Model.ServiceId" class="btn btn-primary mb-3">View templates</a>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="alert alert-danger">This permanently deletes the service and its language catalog.</div>
|
||||
}
|
||||
<p>Email channels are retained. Their service names are independent and are not renamed or deleted.</p>
|
||||
<form asp-action="DeleteService" asp-route-serviceId="@Model.ServiceId" method="post">
|
||||
@Html.AntiForgeryToken()
|
||||
<input asp-for="Revision" type="hidden" />
|
||||
<div class="form-check mb-3"><input asp-for="ConfirmDelete" class="form-check-input" disabled="@(Model.DefinitionCount > 0)" /><label asp-for="ConfirmDelete" class="form-check-label">I confirm deletion of service @Model.Name and its language catalog.</label></div>
|
||||
<div class="d-flex flex-wrap gap-2"><button type="submit" class="btn btn-danger" disabled="@(Model.DefinitionCount > 0)">Delete service</button><a class="btn btn-secondary" href="/admin/services">Cancel</a></div>
|
||||
</form>
|
||||
</div>
|
||||
@@ -6,7 +6,7 @@
|
||||
ViewData["EditorTitle"] = ViewData["Title"];
|
||||
}
|
||||
@section Breadcrumbs {
|
||||
<nav aria-label="Breadcrumb"><ol class="breadcrumb"><li class="breadcrumb-item"><a href="/admin/services">Services</a></li>@if (!Model.IsNew) { <li class="breadcrumb-item"><a href="/admin/services/@Model.Id">@Model.Name</a></li> }<li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li></ol></nav>
|
||||
<nav aria-label="Breadcrumb" class="service-editor-breadcrumbs"><ol class="breadcrumb"><li class="breadcrumb-item"><a href="/admin/services">Services</a></li>@if (!Model.IsNew) { <li class="breadcrumb-item"><a href="/admin/services/@Model.Id">@Model.Name</a></li> }<li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li></ol></nav>
|
||||
}
|
||||
<form asp-action="Save" id="serviceForm" method="post">
|
||||
@Html.AntiForgeryToken()
|
||||
@@ -17,7 +17,7 @@
|
||||
<h3 class="h5">Language codes</h3>
|
||||
<p class="text-muted">Codes are case-sensitive and belong to this service. Existing template versions use these codes when sending. Renaming a service or code changes sender lookup; align publishers and email channel service names.</p>
|
||||
<div class="table-responsive">
|
||||
<table class="table service-language-table"><thead><tr><th>Code</th><th>Versions</th><th class="service-language-actions">Actions</th></tr></thead><tbody id="serviceLanguages">
|
||||
<table class="table admin-data-table service-language-table"><thead><tr><th scope="col">Code</th><th scope="col">Versions</th><th scope="col" class="service-language-actions">Actions</th></tr></thead><tbody id="serviceLanguages">
|
||||
@for (var i = 0; i < Model.Languages.Count; i++)
|
||||
{
|
||||
var countUnavailable = ViewData["LanguageCountsUnavailable"] is true && Model.Languages[i].Id != Guid.Empty;
|
||||
|
||||
@@ -2,13 +2,16 @@
|
||||
@model IReadOnlyList<NotificationServiceInfo>
|
||||
@{ ViewData["Title"] = "Services"; }
|
||||
<div class="page-header"><h2>Services</h2><a href="/admin/services/create" class="btn btn-primary">Create service</a></div>
|
||||
@if (Model.Count == 0) { <p>No services yet. Create a service and its language codes before adding templates.</p> }
|
||||
@if (Model.Count == 0)
|
||||
{
|
||||
<div class="card shadow-sm table-card"><div class="empty-state"><i class="bi bi-collection" aria-hidden="true"></i><p class="mt-2 mb-0">No services yet.</p><a href="/admin/services/create" class="btn btn-primary btn-sm mt-3">Create First Service</a></div></div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="table-responsive"><table class="table table-hover"><thead><tr><th>Name</th><th>Language codes</th><th class="service-actions">Action</th></tr></thead><tbody>
|
||||
<div class="table-responsive"><table class="table table-hover admin-data-table"><thead><tr><th scope="col">Name</th><th scope="col">Language codes</th><th scope="col" class="service-actions">Action</th></tr></thead><tbody>
|
||||
@foreach (var service in Model)
|
||||
{
|
||||
<tr><td><a href="/admin/services/@service.Id">@service.Name</a></td><td>@string.Join(", ", service.Languages.Select(l => l.Code))</td><td class="service-actions"><a href="/admin/services/@service.Id/edit" class="btn btn-outline-primary btn-sm" aria-label="Edit service @service.Name">Edit</a></td></tr>
|
||||
<tr><td><a href="/admin/services/@service.Id">@service.Name</a></td><td>@string.Join(", ", service.Languages.Select(l => l.Code))</td><td class="service-actions"><div class="list-action-links"><a href="/admin/services/@service.Id/edit" class="btn btn-outline-primary btn-sm" aria-label="Edit service @service.Name">Edit</a><a href="/admin/services/@service.Id/delete" class="btn btn-outline-danger btn-sm" aria-label="Delete service @service.Name">Delete</a></div></td></tr>
|
||||
}
|
||||
</tbody></table></div>
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user