Files
agrynco 8e81572386 feat(notification): add admin rest management and deletion
Add revision-safe service and template APIs, channel mapping, and validated admin controls.

Ref: IT-1601
2026-10-17 22:51:01 +03:00

91 lines
4.5 KiB
Plaintext

@using HrynCo.NotificationService.Web.Controllers.Admin.ViewModels
@model ServiceTemplatesViewModel
@{
ViewData["Title"] = Model.Service.Name;
var serviceId = Model.Service.Id;
var keyFilter = Model.KeyFilter;
}
<nav aria-label="Breadcrumb" class="service-template-breadcrumbs"><ol class="breadcrumb"><li class="breadcrumb-item"><a href="/admin/services">Services</a></li><li class="breadcrumb-item active" aria-current="page">@Model.Service.Name</li></ol></nav>
<div class="page-header">
<h2 class="service-template-service-name">@Model.Service.Name</h2>
<a href="/admin/services/@serviceId/edit" class="btn btn-outline-primary">Edit Service</a>
</div>
<div class="service-template-catalog mb-3" aria-label="Configured service languages">
<span class="fw-semibold">Configured languages:</span>
@if (Model.Service.Languages.Count == 0)
{
<span>No languages configured for this service.</span>
}
else
{
@foreach (var language in Model.Service.Languages)
{
<span class="service-template-language-code">@language.Code</span>
}
}
</div>
<div class="page-header">
<h3 class="h4">Email Templates</h3>
<a asp-action="Create" asp-route-serviceId="@serviceId" asp-route-keyFilter="@keyFilter" class="btn btn-primary">Create template</a>
</div>
<div asp-validation-summary="All" class="text-danger mb-3" role="alert"></div>
<div class="table-responsive"><table class="table table-hover admin-data-table service-template-grid"><thead><tr>
<th scope="col">
<form method="get" action="/admin/services/@serviceId" class="template-key-filter">
<label for="key" class="form-label fw-semibold">Template Key</label>
<div class="template-key-filter-controls">
<input id="key" name="key" value="@keyFilter" class="form-control form-control-sm" placeholder="Filter by key" />
<button type="submit" class="btn btn-primary btn-sm">Filter</button>
<a href="/admin/services/@serviceId" class="btn btn-outline-secondary btn-sm">Clear</a>
</div>
</form>
</th>
<th scope="col">Languages</th>
<th scope="col" class="template-actions">Action</th>
</tr></thead><tbody>
@if (Model.Definitions.Count == 0)
{
<tr><td colspan="3"><div class="empty-state">
@if (!ViewData.ModelState.IsValid)
{
<p class="mb-0">Templates are unavailable. Review the error and try again.</p>
}
else if (!string.IsNullOrWhiteSpace(keyFilter))
{
<i class="bi bi-search" aria-hidden="true"></i><p class="mt-2 mb-0">No templates match this key.</p><a href="/admin/services/@serviceId" class="btn btn-primary btn-sm mt-3">Clear filter</a>
}
else
{
<i class="bi bi-envelope" aria-hidden="true"></i><p class="mt-2 mb-0">No email templates for this service yet.</p><a asp-action="Create" asp-route-serviceId="@serviceId" class="btn btn-primary btn-sm mt-3">Create First Template</a>
}
</div></td></tr>
}
@foreach (var template in Model.Definitions)
{
var editUrl = Url.Action("Edit", "AdminTemplates", new { serviceId, definitionId = template.Id, keyFilter });
var presentCodes = template.Languages.Select(l => l.LanguageCode).ToHashSet(StringComparer.Ordinal);
<tr>
<td>@template.Key</td>
<td>
@if (Model.Service.Languages.Count == 0)
{
<span>No configured languages</span>
}
else
{
<ul class="template-language-statuses">
@foreach (var language in Model.Service.Languages)
{
var present = presentCodes.Contains(language.Code);
<li class="template-language-status @(present ? "template-language-present" : "template-language-missing")" data-language-code="@language.Code" data-state="@(present ? "present" : "missing")">
<span>@language.Code:</span><span>@(present ? "Present" : "Missing")</span>
</li>
}
</ul>
}
</td>
<td class="template-actions"><div class="list-action-links"><a href="@editUrl" class="btn btn-outline-primary btn-sm" aria-label="Edit template @template.Key">Edit</a><a asp-action="ConfirmDefinitionDelete" asp-route-serviceId="@serviceId" asp-route-definitionId="@template.Id" asp-route-keyFilter="@keyFilter" class="btn btn-outline-danger btn-sm" aria-label="Delete template @template.Key">Delete</a></div></td>
</tr>
}
</tbody></table></div>