| | | 1 | | @using OzonDomains.Models |
| | | 2 | | @using OzonOrdersWeb.Areas.Studio2.ViewModels.Grid |
| | | 3 | | @model List<Manufacturer> |
| | | 4 | | @{ |
| | 0 | 5 | | ViewData["Title"] = $"Производители Ozon ({Model.Count} шт.)"; |
| | 0 | 6 | | Layout = "~/Views/Shared/_Layout.cshtml"; |
| | 0 | 7 | | var rows = Model.Select(m => new { id = m.Id, code = m.Code, name = m.Name, etProduserId = m.EtProduserId }); |
| | | 8 | | } |
| | | 9 | | |
| | 0 | 10 | | @await Html.PartialAsync("_BsxGridShell") |
| | | 11 | | |
| | | 12 | | <div class="container-fluid 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="fas fa-tag me-2 text-primary"></i>Производители (Ozon код)</h1> |
| | | 16 | | <div class="subtitle">Справочник кодов производителей для формирования offer_id в Ozon</div> |
| | | 17 | | <div class="subtitle-help"> |
| | | 18 | | Краткий <strong>код</strong> (MHL, KNT…) подставляется в артикул/offer_id при выгрузке на Ozon. |
| | | 19 | | <strong>ET ID</strong> связывает запись с каталогом Etalon. Код, название и ET ID правятся прямо в табли |
| | | 20 | | клик по ячейке, затем «Сохранить» в строке. |
| | | 21 | | </div> |
| | | 22 | | <div class="app-section-hero__quick-links"> |
| | | 23 | | <a asp-area="Studio2" asp-controller="Producers" asp-action="Index"><i class="fas fa-industry"></i>Произ |
| | | 24 | | <a asp-area="Studio2" asp-controller="Supplier" asp-action="Index"><i class="fas fa-truck-loading"></i>П |
| | | 25 | | <a asp-area="Studio2" asp-controller="BitrixStock" asp-action="Index"><i class="fas fa-boxes"></i>Синхро |
| | | 26 | | </div> |
| | | 27 | | </div> |
| | | 28 | | <div class="d-flex flex-wrap gap-2 align-items-center"> |
| | | 29 | | <div class="bsx-dir-stats"> |
| | 0 | 30 | | <span class="bsx-dir-stat">Всего <b>@Model.Count</b></span> |
| | 0 | 31 | | <span class="bsx-dir-stat">Без кода <b>@Model.Count(m => string.IsNullOrWhiteSpace(m.Code))</b></span> |
| | 0 | 32 | | <span class="bsx-dir-stat">Без ET ID <b>@Model.Count(m => m.EtProduserId == null)</b></span> |
| | | 33 | | </div> |
| | | 34 | | <a asp-action="Create" class="btn btn-primary btn-sm"><i class="fas fa-plus me-1"></i>Создать</a> |
| | | 35 | | </div> |
| | | 36 | | </div> |
| | | 37 | | |
| | 0 | 38 | | @if (TempData["ErrorMessage"] is string errorMessage) |
| | | 39 | | { |
| | | 40 | | <div class="alert alert-danger alert-dismissible fade show" role="alert"> |
| | 0 | 41 | | <i class="fas fa-exclamation-triangle me-2"></i>@errorMessage |
| | | 42 | | <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button> |
| | | 43 | | </div> |
| | | 44 | | } |
| | | 45 | | |
| | 0 | 46 | | @await Html.PartialAsync("_BsxDirectoryGrid", new BsxDirectoryGridViewModel("manufacturer", "Производители", "fa-tag |
| | 0 | 47 | | "Двойной клик по ID — страница изменения.")) |
| | | 48 | | </div> |
| | | 49 | | |
| | | 50 | | @section Scripts { |
| | | 51 | | <script src="~/js/Studio2/Grid/bsx-directory.js" asp-append-version="true"></script> |
| | | 52 | | <script> |
| | | 53 | | (function () { |
| | | 54 | | const D = window.BsxDirectory; |
| | 0 | 55 | | const editUrl = id => '@Url.Action("Edit", "Manufacturers", new { area = "Studio2" })/' + id; |
| | | 56 | | D.grid({ |
| | | 57 | | key: 'dirManufacturer', |
| | | 58 | | prefix: 'manufacturer', |
| | 0 | 59 | | rows: @Json.Serialize(rows), |
| | | 60 | | rowUrl: r => editUrl(r.id), |
| | | 61 | | onSave: r => D.submit(editUrl(r.id), { Id: r.id, Code: r.code ?? '', Name: r.name ?? '', EtProduserId: r.etP |
| | | 62 | | columnDefs: [ |
| | | 63 | | { field: 'code', headerName: 'Код', width: 150, editable: true, cellClass: 'fw-semibold', valueFormatter |
| | | 64 | | { field: 'name', headerName: 'Название', flex: 1, minWidth: 260, sort: 'asc', editable: true }, |
| | | 65 | | D.numCol({ field: 'id', headerName: 'ID', width: 90 }), |
| | | 66 | | D.numCol({ field: 'etProduserId', headerName: 'ET ID', headerTooltip: 'ID производителя в базе ET', widt |
| | | 67 | | cellEditor: 'agNumberCellEditor', valueFormatter: p => p.value ?? '—' }), |
| | | 68 | | D.setCol({ colId: 'hasEt', headerName: 'Связан с ET', width: 130, hide: true, valueGetter: p => p.data.e |
| | | 69 | | filterParams: { labels: D.YES_NO_LABELS }, cellRenderer: p => D.yesNo(p.value) }), |
| | | 70 | | D.actionsCol(r => [{ icon: 'fa-pencil-alt', title: 'Изменить', href: editUrl(r.id) }], { width: 160 }) |
| | | 71 | | ] |
| | | 72 | | }); |
| | | 73 | | })(); |
| | | 74 | | </script> |
| | | 75 | | } |