8e81572386
Add revision-safe service and template APIs, channel mapping, and validated admin controls. Ref: IT-1601
91 lines
4.5 KiB
Plaintext
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>
|