81654c0d33
Add normalized service and template catalogs, scoped administration, migration, validation, and regression coverage. Ref: IT-1601
78 lines
3.5 KiB
Plaintext
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>
|