Files
hrynco-notification-service/HrynCo.NotificationService.Web/Views/AdminTemplates/Index.cshtml
T
agrynco 81654c0d33 feat(templates): add service language template management
Add normalized service and template catalogs, scoped administration, migration, validation, and regression coverage.

Ref: IT-1601
2026-10-17 22:02:43 +03:00

78 lines
3.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"><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>@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 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">No email templates found for this service.</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"><a href="@editUrl" class="btn btn-outline-primary btn-sm" aria-label="Edit template @template.Key">Edit</a></td>
</tr>
}
</tbody></table></div>