< Summary

Information
Class: AspNetCoreGeneratedDocument.Areas_PartnerOffice_Views_Partners_Edit
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/PartnerOffice/Views/Partners/Edit.cshtml
Line coverage
0%
Covered lines: 0
Uncovered lines: 39
Coverable lines: 39
Total lines: 169
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 48
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
ExecuteAsync()0%1332360%
Has()100%210%
<ExecuteAsync()0%4260%
<ExecuteAsync()100%210%
<ExecuteAsync()0%4260%
<ExecuteAsync()100%210%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/PartnerOffice/Views/Partners/Edit.cshtml

#LineLine coverage
 1@using System.Text.Json
 2@model PartnerEditViewModel
 3@{
 04    var p = Model.Partner;
 05    ViewData["Title"] = $"Партнёр {p.Name}";
 06    bool Has(PartnerPermissionCode c) => p.Permissions.Contains(c);
 07    var boot = JsonSerializer.Serialize(new
 08    {
 09        rules = p.Rules,
 010        lookups = Model.Lookups,
 011        saveUrl = Url.Action("SaveRules", "Partners", new { area = "PartnerOffice", id = p.Id }),
 012        previewUrl = Url.Action("PreviewRules", "Partners", new { area = "PartnerOffice", id = p.Id }),
 013        ordersGridUrl = Url.Content("~/Studio2/OrdersGrid")
 014    }, new JsonSerializerOptions(JsonSerializerDefaults.Web));
 15}
 16
 17<link rel="stylesheet" href="~/css/Studio2/OzonClients/ozon-clients-form.css" asp-append-version="true" />
 18<link rel="stylesheet" href="~/css/partner-office/partner-office.css" asp-append-version="true" />
 019@await Html.PartialAsync("~/Areas/Studio2/Views/Shared/_BsxGridShell.cshtml")
 20
 21<div class="container-fluid py-3 bsx-surface po-form">
 22    <div class="app-section-hero app-section-hero--import d-flex flex-wrap justify-content-between align-items-start gap
 23        <div>
 024            <h1><i class="fas fa-handshake me-2 text-primary"></i>@p.Name</h1>
 25            <div class="subtitle">
 026                @(p.Email is { } mail ? mail : "почта не указана"), создан @p.CreatedAtUtc.ToLocalTime().ToString("dd.MM
 027                последний вход @(p.LastLoginAtUtc is { } d ? d.ToLocalTime().ToString("dd.MM.yyyy HH:mm") : "ещё не вход
 28            </div>
 29            <div class="app-section-hero__quick-links">
 30                <a asp-action="Index"><i class="fas fa-arrow-left"></i>К партнёрам</a>
 031                <a asp-action="Audit" asp-route-partnerId="@p.Id"><i class="fas fa-clipboard-list"></i>Журнал партнёра</
 32                <a href="/swagger/index.html" target="_blank" rel="noopener"><i class="fas fa-code"></i>Swagger API парт
 33            </div>
 34        </div>
 35    </div>
 36
 037    @if (TempData["Success"] is string ok)
 38    {
 39        <div class="alert alert-success alert-dismissible fade show py-2 small" role="alert">
 040            <i class="fas fa-check-circle me-2"></i>@ok
 41            <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Закрыть"></button>
 42        </div>
 43    }
 044    @if (TempData["Error"] is string err)
 45    {
 46        <div class="alert alert-danger alert-dismissible fade show py-2 small" role="alert">
 047            <i class="fas fa-exclamation-circle me-2"></i>@err
 48            <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Закрыть"></button>
 49        </div>
 50    }
 51
 52    <div class="oc-form-section">
 53        <div class="oc-form-card-header"><h2><i class="fas fa-user me-2 text-muted"></i>Основное и уведомления</h2></div
 054        <form asp-area="PartnerOffice" asp-controller="Partners" asp-action="UpdateMain" asp-route-id="@p.Id" method="po
 055            @Html.AntiForgeryToken()
 56            <div class="oc-form-grid">
 57                <div>
 58                    <label class="form-label">Название компании</label>
 59                    <input name="Name" value="@p.Name" class="form-control form-control-sm" maxlength="200" required />
 60                </div>
 61                <div>
 62                    <label class="form-label">Почта для входа</label>
 63                    <input name="Email" value="@p.Email" type="email" class="form-control form-control-sm" maxlength="32
 64                           autocomplete="off" autocapitalize="none" spellcheck="false" />
 65                    <div class="oc-field-hint">Коды входа и приглашения приходят сюда. Смена почты завершает сессии парт
 66                </div>
 67                <div>
 68                    <label class="form-label">Google-почта</label>
 69                    <input name="GoogleEmail" value="@p.GoogleEmail" type="email" class="form-control form-control-sm" /
 70                    <div class="oc-field-hint">Вход через Google только с этой почтой. Пусто — только вход по коду из пи
 71                </div>
 72                <div>
 73                    <div class="form-check form-switch mt-4">
 074                        <input class="form-check-input" type="checkbox" name="IsActive" value="true" id="isActive" @(p.I
 75                        <label class="form-check-label" for="isActive">Активен</label>
 76                    </div>
 77                    <div class="oc-field-hint">Отключение сразу обрывает сессии партнёра.</div>
 78                </div>
 79                <div>
 80                    <label class="form-label">Уведомлять партнёра о новых заказах</label>
 81                    <div class="form-check">
 082                        <input class="form-check-input" type="checkbox" name="NotifyEmail" value="true" id="nEmail" @(p.
 83                        <label class="form-check-label" for="nEmail">Email</label>
 84                    </div>
 85                    <input name="NotificationEmail" value="@p.NotificationEmail" type="email" class="form-control form-c
 86                    <div class="form-check">
 087                        <input class="form-check-input" type="checkbox" name="NotifyTelegram" value="true" id="nTg" @(p.
 88                        <label class="form-check-label" for="nTg">Telegram</label>
 89                    </div>
 90                    <input name="TelegramChatId" value="@p.TelegramChatId" class="form-control form-control-sm" placehol
 91                    <div class="oc-field-hint">Отправка уведомлений подключается на следующем этапе, настройки сохраняют
 92                </div>
 93            </div>
 94            <button type="submit" class="btn btn-primary btn-sm mt-2"><i class="fas fa-check me-1"></i>Сохранить</button
 95        </form>
 96    </div>
 97
 98    <div class="oc-form-section">
 99        <div class="oc-form-card-header"><h2><i class="fas fa-envelope me-2 text-muted"></i>Приглашение</h2></div>
 0100        @if (string.IsNullOrEmpty(p.Email))
 101        {
 102            <div class="oc-field-hint text-danger">Почта не указана: партнёр не сможет войти. Укажите её выше и сохранит
 103        }
 104        else
 105        {
 0106            <form asp-area="PartnerOffice" asp-controller="Partners" asp-action="SendInvite" asp-route-id="@p.Id" method
 0107                @Html.AntiForgeryToken()
 108                <button type="submit" class="btn btn-outline-primary btn-sm"><i class="fas fa-paper-plane me-1"></i>Отпр
 109            </form>
 0110            <div class="oc-field-hint">Письмо со ссылкой и готовым кодом уйдёт на @p.Email. Ссылка действует 7 дней, пре
 111        }
 112    </div>
 113
 114    <div class="oc-form-section">
 115        <div class="oc-form-card-header"><h2><i class="fas fa-toggle-on me-2 text-muted"></i>Возможности</h2></div>
 0116        <form asp-area="PartnerOffice" asp-controller="Partners" asp-action="SetPermissions" asp-route-id="@p.Id" method
 0117            @Html.AntiForgeryToken()
 118            <div class="oc-field-hint mb-2">Просмотр заказов, попавших под правила, доступен всегда.</div>
 119            <div class="form-check">
 0120                <input class="form-check-input" type="checkbox" name="LabelPrint" value="true" id="pLabel" @(Has(Partner
 121                <label class="form-check-label" for="pLabel">Печать и скачивание этикетки</label>
 122            </div>
 123            <div class="form-check">
 0124                <input class="form-check-input" type="checkbox" name="Assemble" value="true" id="pAsm" @(Has(PartnerPerm
 125                <label class="form-check-label" for="pAsm">Сборка и отгрузка</label>
 126            </div>
 127            <div class="form-check">
 0128                <input class="form-check-input" type="checkbox" name="TrackNumber" value="true" id="pTrack" @(Has(Partne
 129                <label class="form-check-label" for="pTrack">Ввод трек-номера</label>
 130            </div>
 131            <button type="submit" class="btn btn-primary btn-sm mt-2"><i class="fas fa-check me-1"></i>Сохранить возможн
 132        </form>
 133    </div>
 134
 135    <div class="oc-form-section">
 136        <div class="oc-form-card-header"><h2><i class="fas fa-filter me-2 text-muted"></i>Какие заказы видит партнёр</h2
 137        <div class="oc-intro">
 138            <i class="fas fa-circle-info"></i>
 139            <div class="oc-intro-text">
 140                Заказ виден, если подходит под <strong>любое</strong> из правил. Внутри правила все условия действуют вм
 141                а несколько значений одного условия — «или». <strong>Без правил партнёр не видит ни одного заказа.</stro
 142                Правило без условий сохранить нельзя.
 143            </div>
 144        </div>
 0145        <div id="rulesEditor" data-boot="@boot"></div>
 146        <div class="d-flex flex-wrap gap-2 align-items-center mt-2">
 147            <button type="button" class="btn btn-outline-primary btn-sm" id="addRuleBtn"><i class="fas fa-plus me-1"></i
 148            <button type="button" class="btn btn-outline-secondary btn-sm" id="previewRulesBtn"><i class="fas fa-eye me-
 149            <button type="button" class="btn btn-primary btn-sm" id="saveRulesBtn"><i class="fas fa-check me-1"></i>Сохр
 150            <span id="rulesStatus" class="small"></span>
 151        </div>
 0152        @Html.AntiForgeryToken()
 153    </div>
 154
 155    <div class="oc-form-section po-danger">
 156        <div class="oc-form-card-header"><h2 class="po-danger-title"><i class="fas fa-trash me-2"></i>Удаление</h2></div
 0157        <form asp-area="PartnerOffice" asp-controller="Partners" asp-action="Delete" asp-route-id="@p.Id" method="post"
 0158              data-st2-confirm="Удалить партнёра «@p.Name» вместе с правилами и правами? Журнал останется."
 159              data-st2-confirm-variant="danger" data-st2-confirm-text="Удалить">
 0160            @Html.AntiForgeryToken()
 161            <div class="oc-field-hint mb-2">Чтобы только закрыть доступ, лучше отключите партнёра: его настройки сохраня
 162            <button type="submit" class="btn btn-outline-danger btn-sm">Удалить партнёра</button>
 163        </form>
 164    </div>
 165</div>
 166
 167@section Scripts {
 168    <script src="~/js/partner-office/rules-editor.js" asp-append-version="true"></script>
 169}