| | | 1 | | @using OzonOrdersWeb.Areas.Studio2.ViewModels.Grid |
| | | 2 | | @model OzonOrdersWeb.Areas.Studio2.ViewModels.EmailRouting.EmailRoutingResultsViewModel |
| | | 3 | | |
| | | 4 | | @{ |
| | 0 | 5 | | ViewData["Title"] = "Загруженные файлы — Email → Dropbox"; |
| | | 6 | | } |
| | | 7 | | |
| | | 8 | | <link rel="stylesheet" href="~/css/Studio2/EmailRouting/email-routing-results-index.css" asp-append-version="true"/> |
| | | 9 | | |
| | 0 | 10 | | @await Html.PartialAsync("_BsxGridShell") |
| | | 11 | | |
| | | 12 | | <div class="container-fluid err-page py-3 bsx-surface"> |
| | | 13 | | <div class="app-section-hero app-section-hero--import d-flex flex-wrap justify-content-between align-items-start gap |
| | | 14 | | <div> |
| | | 15 | | <h1><i class="bi bi-cloud-upload-fill text-primary me-2"></i>Загруженные файлы</h1> |
| | | 16 | | <div class="subtitle">Вложения, сохранённые из почты в Dropbox</div> |
| | | 17 | | <div class="subtitle-help">Проверьте отправителя, правило импорта и путь сохранения файла перед повторной об |
| | | 18 | | <div class="app-section-hero__quick-links"> |
| | | 19 | | <a asp-action="Index"><i class="bi bi-list-check"></i>Результаты импорта</a> |
| | | 20 | | <a asp-area="Studio2" asp-controller="EmailRoutingRules" asp-action="Index"><i class="bi bi-funnel"></i> |
| | | 21 | | <a asp-area="Studio2" asp-controller="FileUploadRecords" asp-action="Index"><i class="bi bi-clock-histor |
| | | 22 | | </div> |
| | | 23 | | </div> |
| | | 24 | | <div class="err-hero-actions"> |
| | | 25 | | <a asp-action="Index" class="btn btn-outline-secondary btn-sm"> |
| | | 26 | | <i class="bi bi-arrow-left"></i> К результатам |
| | | 27 | | </a> |
| | 0 | 28 | | <div class="bsx-dir-stats"><span class="bsx-dir-stat">Всего <b>@Model.TotalCount.ToString("N0")</b></span></ |
| | | 29 | | </div> |
| | | 30 | | </div> |
| | | 31 | | |
| | | 32 | | <div class="row g-4"> |
| | | 33 | | |
| | | 34 | | <div class="col-xl-8"> |
| | 0 | 35 | | @await Html.PartialAsync("_BsxDirectoryGrid", new BsxDirectoryGridViewModel("errUploaded", "Загруженные файл |
| | 0 | 36 | | "Фильтры и сортировка — по всем загруженным вложениям на сервере. Двойной клик — подробности.")) |
| | | 37 | | </div> |
| | | 38 | | |
| | | 39 | | <!-- ═══ Правая колонка: дерево папок Dropbox ═══ --> |
| | | 40 | | <div class="col-xl-4"> |
| | | 41 | | <div class="card"> |
| | | 42 | | <div class="card-header fw-semibold"> |
| | | 43 | | <i class="bi bi-folder2-open text-warning"></i> Папки Dropbox |
| | | 44 | | </div> |
| | | 45 | | <div class="card-body"> |
| | | 46 | | <!-- Поле пути к базовой папке --> |
| | | 47 | | <form method="get" asp-action="UploadedFiles" class="mb-3"> |
| | | 48 | | <div class="input-group input-group-sm"> |
| | | 49 | | <span class="input-group-text"><i class="bi bi-folder"></i></span> |
| | | 50 | | <input type="text" name="dropboxFolder" class="form-control font-monospace" |
| | | 51 | | placeholder="/Приложения/Studio2" |
| | | 52 | | value="@Model.DropboxBaseFolder"/> |
| | | 53 | | <button class="btn btn-primary" type="submit"> |
| | | 54 | | <i class="bi bi-arrow-right-circle"></i> Открыть |
| | | 55 | | </button> |
| | | 56 | | </div> |
| | | 57 | | <div class="form-text">Введите путь к корневой папке в Dropbox для просмотра</div> |
| | | 58 | | </form> |
| | | 59 | | |
| | 0 | 60 | | @if (!string.IsNullOrWhiteSpace(Model.DropboxBaseFolder)) |
| | | 61 | | { |
| | 0 | 62 | | @if (!Model.DropboxFolders.Any()) |
| | | 63 | | { |
| | | 64 | | <div class="alert alert-warning small"> |
| | | 65 | | <i class="bi bi-exclamation-triangle"></i> |
| | | 66 | | Папка не найдена или пуста. Проверьте путь. |
| | | 67 | | </div> |
| | | 68 | | } |
| | | 69 | | else |
| | | 70 | | { |
| | | 71 | | <div class="accordion" id="dropboxFolderAccordion"> |
| | 0 | 72 | | @{int folderIdx = 0;} |
| | 0 | 73 | | @foreach (var folder in Model.DropboxFolders) |
| | | 74 | | { |
| | 0 | 75 | | var collapseId = $"dropboxFolder_{folderIdx}"; |
| | 0 | 76 | | folderIdx++; |
| | | 77 | | <div class="accordion-item"> |
| | | 78 | | <h2 class="accordion-header"> |
| | | 79 | | <button class="accordion-button collapsed py-2 small" type="button" |
| | | 80 | | data-bs-toggle="collapse" |
| | 0 | 81 | | data-bs-target="#@collapseId"> |
| | | 82 | | <i class="bi bi-folder-fill text-warning me-2"></i> |
| | 0 | 83 | | <strong>@folder.Key</strong> |
| | 0 | 84 | | <span class="badge bg-secondary ms-2">@folder.Value.Count файлов</span> |
| | | 85 | | </button> |
| | | 86 | | </h2> |
| | | 87 | | <div id="@collapseId" class="accordion-collapse collapse"> |
| | | 88 | | <div class="accordion-body p-2"> |
| | 0 | 89 | | @if (!folder.Value.Any()) |
| | | 90 | | { |
| | | 91 | | <div class="text-muted small">Папка пуста</div> |
| | | 92 | | } |
| | | 93 | | else |
| | | 94 | | { |
| | | 95 | | <ul class="list-group list-group-flush"> |
| | 0 | 96 | | @foreach (var file in folder.Value) |
| | | 97 | | { |
| | | 98 | | <li class="list-group-item list-group-item-action px-2 py-1 |
| | | 99 | | <span class="text-truncate me-2" title="@file.Key"> |
| | | 100 | | <i class="bi bi-file-earmark text-muted"></i> |
| | 0 | 101 | | @file.Key |
| | | 102 | | </span> |
| | | 103 | | <a href="@file.Value" target="_blank" |
| | | 104 | | class="btn btn-xs btn-outline-primary flex-shrink-0" |
| | | 105 | | style="font-size:0.7rem;padding:1px 6px" |
| | | 106 | | title="Скачать"> |
| | | 107 | | <i class="bi bi-download"></i> |
| | | 108 | | </a> |
| | | 109 | | </li> |
| | | 110 | | } |
| | | 111 | | </ul> |
| | | 112 | | } |
| | | 113 | | </div> |
| | | 114 | | </div> |
| | | 115 | | </div> |
| | | 116 | | } |
| | | 117 | | </div> |
| | | 118 | | } |
| | | 119 | | } |
| | | 120 | | else |
| | | 121 | | { |
| | | 122 | | <div class="text-muted small"> |
| | | 123 | | <i class="bi bi-arrow-up-circle"></i> |
| | | 124 | | Введите путь к папке Dropbox выше, чтобы просмотреть её содержимое. |
| | | 125 | | <hr/> |
| | | 126 | | <strong>Примеры правил из базы:</strong> |
| | | 127 | | <ul class="mt-1 mb-0"> |
| | 0 | 128 | | @foreach (var rule in Model.AvailableRules.Take(5)) |
| | | 129 | | { |
| | | 130 | | <li> |
| | | 131 | | <button type="button" class="btn btn-link btn-sm p-0 text-start small" |
| | | 132 | | onclick="document.querySelector('[name=dropboxFolder]').value='@rule.Dro |
| | 0 | 133 | | @rule.DropboxFolderTemplate |
| | | 134 | | </button> |
| | 0 | 135 | | <span class="text-muted">(правило: @rule.Name)</span> |
| | | 136 | | </li> |
| | | 137 | | } |
| | | 138 | | </ul> |
| | | 139 | | </div> |
| | | 140 | | } |
| | | 141 | | </div> |
| | | 142 | | </div> |
| | | 143 | | </div> |
| | | 144 | | </div> |
| | | 145 | | </div> |
| | | 146 | | |
| | | 147 | | @section Scripts { |
| | | 148 | | <script src="~/js/Studio2/Grid/bsx-directory.js" asp-append-version="true"></script> |
| | | 149 | | <script src="~/js/Studio2/EmailRouting/email-routing-results-grids.js" asp-append-version="true"></script> |
| | | 150 | | } |