Интерфейс: единые термины, названия разделов и шагов, узкий экран
- клиенту — «шлюз НРД» вместо «ИШ» (установка, статусы, этапы, ключ, переводы); расшифровка «(ИШ)» — только в заголовке окна обновления - контур — «тестовый (TEST3)»; в строке шлюза — «работает · версия …» - меню = заголовки разделов: «Обмен с DEPO», «Пользователи и вход», «Оформление отчётов» - мастер: заголовок шага = его название в колонке шагов - вторичная кнопка — классом btn-secondary, а не стилями в разметке - узкий экран: поля и сетки с жёсткой шириной не вылезают, таблицы прокручиваются, анкета участника — по высоте экрана Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
@@ -43,7 +43,7 @@
|
||||
</div>{{end}}
|
||||
{{with .Fail}}<div class="card" style="background:var(--err-weak,#fbe9e7);margin:8px 0">
|
||||
<b>Перевод не доставлен в НРД</b> — {{sendFailText .}}.<br>
|
||||
<span class="muted">Попытка {{.At.Format "02.01.2006 15:04:05"}}{{if .PackageID}}, пакет ИШ {{.PackageID}}{{end}}{{if gt .Attempts 1}}, попыток: {{.Attempts}}{{end}}. Отправка в DEPO не отмечена, блокировка в QUIK МНП сохраняется. {{if .GaveUp}}Сутки прошли — автоповтор остановлен: отправьте вручную или удалите заявку.{{else}}Ничего нажимать не нужно: как только НРД снова ответит, bj сам отправит тот же запрос с тем же GUID (повтор — в течение суток). Кнопка «Отправить повторно» — если нужно попробовать прямо сейчас.{{end}}</span>
|
||||
<span class="muted">Попытка {{.At.Format "02.01.2006 15:04:05"}}{{if .PackageID}}, пакет {{.PackageID}}{{end}}{{if gt .Attempts 1}}, попыток: {{.Attempts}}{{end}}. Отправка в DEPO не отмечена, блокировка в QUIK МНП сохраняется. {{if .GaveUp}}Сутки прошли — автоповтор остановлен: отправьте вручную или удалите заявку.{{else}}Ничего нажимать не нужно: как только НРД снова ответит, bj сам отправит тот же запрос с тем же GUID (повтор — в течение суток). Кнопка «Отправить повторно» — если нужно попробовать прямо сейчас.{{end}}</span>
|
||||
</div>{{end}}
|
||||
{{if and .Claim.RequestRawXML (not .SentToNSD) (not .Fail)}}<div class="card" style="background:var(--warn-weak,#fbf3d9);margin:8px 0">
|
||||
<b>⛔ В НРД ничего не отправлено — отмена до отправки.</b><br>
|
||||
@@ -237,7 +237,7 @@
|
||||
</div>
|
||||
|
||||
{{if .Depo.Submitted}}
|
||||
<div class="muted" style="font-size:12px;margin-top:10px">Подано {{msk .Depo.OrderAt}} · пакет ИШ <code>{{.Depo.Pkgs}}</code></div>
|
||||
<div class="muted" style="font-size:12px;margin-top:10px">Подано {{msk .Depo.OrderAt}} · пакет <code>{{.Depo.Pkgs}}</code></div>
|
||||
{{if .Depo.Responses}}
|
||||
<table style="margin-top:8px">
|
||||
<thead><tr><th style="width:150px">Время</th><th>Ответ НРД</th></tr></thead>
|
||||
@@ -276,9 +276,9 @@
|
||||
<div class="dq-warn" style="margin:0 0 10px;padding:12px 14px;border-radius:8px;background:var(--warn-weak,#fbf3d9)">
|
||||
<b>⚠ В НРД отправлены ПОДМЕНЁННЫЕ данные, не эти.</b> Режим эмуляции «Подмена личности»: в пакете, ушедшем в НРД, блок инвестора заменён на тест-инвестора <b>{{.SubstAs}}</b>. XML ниже — наша запись с <b>реальными данными клиента</b> (так заявка пришла из ЛК); в НРД реальные данные клиента НЕ отправлялись.
|
||||
</div>
|
||||
<p class="muted">XML ниже — исходная заявка клиента (наша запись). В НРД ушла её копия с подменённым блоком инвестора ({{.SubstAs}}), подписанная ИШ. Тип пакета <code>#M2MTR</code>.</p>
|
||||
<p class="muted">XML ниже — исходная заявка клиента (наша запись). В НРД ушла её копия с подменённым блоком инвестора ({{.SubstAs}}), подписанная шлюзом НРД. Тип пакета <code>#M2MTR</code>.</p>
|
||||
{{else}}
|
||||
<p class="muted">Точный XML, который bj-server сформировал и ИШ подписал ключом и отправил в НРД. Тип пакета <code>#M2MTR</code>.</p>
|
||||
<p class="muted">Точный XML, который bj-server сформировал и шлюз НРД подписал ключом и отправил в НРД. Тип пакета <code>#M2MTR</code>.</p>
|
||||
{{end}}
|
||||
<a class="btn btn-ok" href="/admin/claims/{{.Claim.ID}}/request.xml" download style="margin-right:8px">⤓ Скачать XML запроса</a>
|
||||
<button type="button" class="btn" onclick="copyReq(this)">Скопировать</button>
|
||||
|
||||
@@ -275,7 +275,7 @@
|
||||
</div>
|
||||
|
||||
{{if .It.OrderSubmitted}}
|
||||
<div class="muted" style="font-size:12px;margin-top:10px">Подано {{msk .It.OrderAt}} · пакет ИШ <code>{{.It.OrderPkgs}}</code>{{if .It.OrderContrDID}} · № поручения <code>{{.It.OrderContrDID}}</code>{{end}}</div>
|
||||
<div class="muted" style="font-size:12px;margin-top:10px">Подано {{msk .It.OrderAt}} · пакет <code>{{.It.OrderPkgs}}</code>{{if .It.OrderContrDID}} · № поручения <code>{{.It.OrderContrDID}}</code>{{end}}</div>
|
||||
{{if .OrderResponses}}
|
||||
<table style="margin-top:8px">
|
||||
<thead><tr><th style="width:150px">Время</th><th>Ответ НРД</th></tr></thead>
|
||||
@@ -294,7 +294,7 @@
|
||||
{{end}}
|
||||
|
||||
<details style="margin-top:12px"><summary style="cursor:pointer;font-size:12px;color:var(--muted)">Как это работает</summary>
|
||||
<p class="muted" style="font-size:12px;margin-top:6px">После нашего согласия на прием НРД формирует <b>черновик поручения 16/1</b> (MF010). Депозитарий подаёт его в НРД (тип ЭД <code>ORDXM</code>) — НРД сматчит со встречным поручением 16 контрагента, проведёт зачисление и выпустит отчёт <code>XMLRP</code> = <b>MS010</b>. Кнопка «Подать» отправляет черновик через ИШ (подпись ГОСТ ставит ИШ); пока Fancy-DEPO не подключена, можно скачать черновик и обработать вручную.</p>
|
||||
<p class="muted" style="font-size:12px;margin-top:6px">После нашего согласия на прием НРД формирует <b>черновик поручения 16/1</b> (MF010). Депозитарий подаёт его в НРД (тип ЭД <code>ORDXM</code>) — НРД сматчит со встречным поручением 16 контрагента, проведёт зачисление и выпустит отчёт <code>XMLRP</code> = <b>MS010</b>. Кнопка «Подать» отправляет черновик через шлюз НРД (подпись ставит шлюз); пока Fancy-DEPO не подключена, можно скачать черновик и обработать вручную.</p>
|
||||
</details>
|
||||
{{end}}
|
||||
</div>
|
||||
@@ -316,7 +316,7 @@
|
||||
<div class="st st-gw">
|
||||
<div class="tm">{{msk .It.ReceivedAt}}</div>
|
||||
<div class="ti">Получено нами</div>
|
||||
<div class="de">забрали из шлюза ИШ{{if not .It.RequestCreated.IsZero}} · прохождение {{transit .It.RequestCreated .It.ReceivedAt}}{{end}}</div>
|
||||
<div class="de">забрали из шлюза НРД{{if not .It.RequestCreated.IsZero}} · прохождение {{transit .It.RequestCreated .It.ReceivedAt}}{{end}}</div>
|
||||
</div>
|
||||
{{if .DraftReceived}}
|
||||
<div class="st st-gw">
|
||||
@@ -336,7 +336,7 @@
|
||||
<div class="st st-ord">
|
||||
<div class="tm">{{msk .It.OrderAt}}</div>
|
||||
<div class="ti">Поручение 16/1 подано</div>
|
||||
<div class="de">тип ORDXM · пакет ИШ {{.It.OrderPkgs}}</div>
|
||||
<div class="de">тип ORDXM · пакет {{.It.OrderPkgs}}</div>
|
||||
</div>
|
||||
{{end}}
|
||||
{{range .OrderResponses}}
|
||||
|
||||
@@ -7,10 +7,10 @@
|
||||
<a href="/admin/wizard" class="snav-wiz" style="display:block;margin:0 0 10px;padding:8px 12px;border:1px dashed var(--border-strong,#c9cdd8);border-radius:10px;font-size:13.5px;text-decoration:none;color:var(--accent)">↺ Мастер настройки — пройти по шагам</a>
|
||||
<button data-sec="overview" class="active"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><circle cx="12" cy="12" r="3"/></svg></span>Обзор</button>
|
||||
<button data-sec="db"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><ellipse cx="12" cy="5.5" rx="7" ry="2.6"/><path d="M5 5.5v13c0 1.4 3.1 2.6 7 2.6s7-1.2 7-2.6v-13"/><path d="M5 12c0 1.4 3.1 2.6 7 2.6s7-1.2 7-2.6"/></svg></span>База данных<span class="ind {{if .Settings.Postgres.DSN}}ok{{else}}err{{end}}"></span></button>
|
||||
{{if mod "quik-mnp"}}<button data-sec="fancy"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M4 8h12M12 4l4 4-4 4"/><path d="M20 16H8M12 20l-4-4 4-4"/></svg></span>Обмен Fancy<span class="ind {{if .Settings.Fancy.DepoTablesCheckOK}}ok{{else if .Settings.Fancy.Server}}warn{{end}}"></span></button>
|
||||
{{if mod "quik-mnp"}}<button data-sec="fancy"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M4 8h12M12 4l4 4-4 4"/><path d="M20 16H8M12 20l-4-4 4-4"/></svg></span>Обмен с DEPO<span class="ind {{if .Settings.Fancy.DepoTablesCheckOK}}ok{{else if .Settings.Fancy.Server}}warn{{end}}"></span></button>
|
||||
<button data-sec="quik"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M4 20V4M4 20h16"/><rect x="7" y="12" width="2.6" height="5"/><rect x="12" y="8" width="2.6" height="9"/><rect x="17" y="14" width="2.6" height="3"/></svg></span>QUIK МНП<span class="ind {{if .Settings.Quik.Verified}}ok{{else if .Settings.Quik.Server}}warn{{end}}"></span></button>{{end}}
|
||||
{{if or (mod "quik-export") (mod "npr")}}<button data-sec="quikexport"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M4 17l5-5 4 4 7-8"/><path d="M14 8h6v6"/></svg></span>Экспорт QUIK<span class="ind {{.QuikExport.Ind}}"></span></button>{{end}}
|
||||
<button data-sec="users"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><circle cx="9" cy="8" r="3.5"/><path d="M3 20c0-3.3 2.7-6 6-6s6 2.7 6 6"/><circle cx="17" cy="9" r="2.5"/><path d="M15.5 14.5c2.8.3 5.5 2.5 5.5 5.5"/></svg></span>Пользователи<span class="ind {{if .Users.Open}}warn{{else}}ok{{end}}"></span></button>
|
||||
<button data-sec="users"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><circle cx="9" cy="8" r="3.5"/><path d="M3 20c0-3.3 2.7-6 6-6s6 2.7 6 6"/><circle cx="17" cy="9" r="2.5"/><path d="M15.5 14.5c2.8.3 5.5 2.5 5.5 5.5"/></svg></span>Пользователи и вход<span class="ind {{if .Users.Open}}warn{{else}}ok{{end}}"></span></button>
|
||||
<button data-sec="crypto"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><rect x="5" y="11" width="14" height="9" rx="2"/><path d="M8 11V8a4 4 0 0 1 8 0v3"/></svg></span>Криптография<span class="ind {{if cryptoReady}}ok{{else}}warn{{end}}"></span></button>
|
||||
<button data-sec="nsd"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M3 21h18M4 21V10M20 21V10M3 10l9-6 9 6M8 21v-7M12 21v-7M16 21v-7"/></svg></span>НРД<span class="ind {{if .Settings.NSD.IGWBaseURL}}ok{{else}}warn{{end}}"></span></button>
|
||||
{{if mod "web-cabinet"}}<button data-sec="cabinet"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="9" r="3.2"/><path d="M6 19c.6-3 3-4.6 6-4.6s5.4 1.6 6 4.6"/><rect x="3" y="4" width="18" height="16" rx="2"/></svg></span>Кабинет клиента<span class="ind {{if .Settings.LK.APIKey}}ok{{else}}warn{{end}}"></span></button>{{end}}
|
||||
@@ -22,7 +22,7 @@
|
||||
<button data-sec="backup"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><ellipse cx="12" cy="6" rx="7" ry="2.5"/><path d="M5 6v6c0 1.4 3.1 2.5 7 2.5s7-1.1 7-2.5V6"/><path d="M12 17v4M9 19l3 2 3-2"/></svg></span>Резервное копирование{{$bs := backupStatus}}{{if and .Settings.Backup.Enabled $bs}}{{if not $bs.OK}}<span class="ind err"></span>{{end}}{{else if not .Settings.Backup.Enabled}}<span class="ind warn"></span>{{end}}</button>
|
||||
<button data-sec="server"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="7" rx="1.5"/><rect x="3" y="13" width="18" height="7" rx="1.5"/><path d="M7 7.5h.01M7 16.5h.01"/></svg></span>Сервер: HTTPS, время, сеть{{if or (not .Settings.HTTPS.RedirectOn) (not timeSynced)}}<span class="ind warn"></span>{{end}}</button>
|
||||
<button data-sec="license"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><circle cx="8" cy="12" r="4"/><path d="M12 12h9M18 12v3M15 12v2"/></svg></span>Лицензия{{if .License.Present}}<span class="ind {{if .License.Valid}}ok{{else}}err{{end}}"></span>{{end}}</button>
|
||||
<button data-sec="branding"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="5" width="18" height="14" rx="2"/><circle cx="8.5" cy="10" r="1.5"/><path d="M21 16l-5-5L5 19"/></svg></span>Оформление{{if .Settings.Branding.LogoDataURI}}<span class="ind ok"></span>{{end}}</button>
|
||||
<button data-sec="branding"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="5" width="18" height="14" rx="2"/><circle cx="8.5" cy="10" r="1.5"/><path d="M21 16l-5-5L5 19"/></svg></span>Оформление отчётов{{if .Settings.Branding.LogoDataURI}}<span class="ind ok"></span>{{end}}</button>
|
||||
{{if devOn}} <button data-sec="advanced"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><rect x="5" y="11" width="14" height="9" rx="2"/><path d="M8 11V8a4 4 0 0 1 8 0v3"/></svg></span>Перспективные{{if .AdvancedUnlocked}}<span class="ind ok"></span>{{end}}</button>{{end}}
|
||||
</nav>
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
{{if mod "quik-mnp"}}
|
||||
{{/* ============ ОБМЕН FANCY (MSSQL) — перспективный модуль ============ */}}
|
||||
<section class="settings-section" id="sec-fancy">
|
||||
<h1>Обмен с DEPO (Fancy)</h1>
|
||||
<h1>Обмен с DEPO</h1>
|
||||
{{template "verline" (.Versions.Get "depo")}}
|
||||
{{template "fancyStatus" .}}
|
||||
{{$fok := and .Settings.Fancy.Server .Settings.Fancy.DepoTablesCheckOK .Settings.Fancy.DepoJobCheckOK}}
|
||||
@@ -296,7 +296,7 @@
|
||||
</table>
|
||||
<div style="display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-top:10px">
|
||||
<form method="post" action="/admin/setup/nsdcerts/check" style="margin:0"><input type="hidden" name="section" value="sec-nsdcerts"><button type="submit" class="btn">↻ Сверить со справочником</button></form>
|
||||
<form method="post" action="/admin/setup/nsdcerts/apply" style="margin:0" onsubmit="return confirm('Применить изменения в справочнике ИШ сейчас? Будет сделан бэкап, ИШ перезапустится на несколько секунд.');"><input type="hidden" name="section" value="sec-nsdcerts"><button type="submit" class="btn btn-ok" {{if not .NSDCerts.Pending}}disabled{{end}}>▶ Применить сейчас{{if .NSDCerts.Pending}} ({{.NSDCerts.Pending}}){{end}}</button></form>
|
||||
<form method="post" action="/admin/setup/nsdcerts/apply" style="margin:0" onsubmit="return confirm('Применить изменения в справочнике шлюза НРД сейчас? Будет сделана резервная копия, шлюз перезапустится на несколько секунд.');"><input type="hidden" name="section" value="sec-nsdcerts"><button type="submit" class="btn btn-ok" {{if not .NSDCerts.Pending}}disabled{{end}}>▶ Применить сейчас{{if .NSDCerts.Pending}} ({{.NSDCerts.Pending}}){{end}}</button></form>
|
||||
<form method="post" action="/admin/setup/nsdcerts" style="margin:0;display:flex;align-items:center;gap:8px"><input type="hidden" name="section" value="sec-nsdcerts"><label style="display:flex;align-items:center;gap:6px;cursor:pointer;margin:0"><input type="checkbox" name="auto" {{if not .NSDCerts.Manual}}checked{{end}} style="width:auto" onchange="this.form.submit()"> автоматически (при старте и каждые 6 ч)</label></form>
|
||||
{{if not .NSDCerts.LastRun.IsZero}}<span class="muted" style="font-size:12px">сверено {{.NSDCerts.LastRun.Format "02.01.2006 15:04"}}</span>{{end}}
|
||||
</div>
|
||||
@@ -881,7 +881,7 @@
|
||||
|
||||
{{if devOn}} <div class="card">
|
||||
<h2>Тестовый пакет роботу НРД</h2>
|
||||
<p class="muted">Робот <code>MC0012500000</code> эмулирует вторую сторону перевода. Выберите сценарий — bj-server отправит эталонный запрос через ИШ, ответ придёт во входящие. Требуется настроенный ИШ + профиль Валидаты.</p>
|
||||
<p class="muted">Робот <code>MC0012500000</code> эмулирует вторую сторону перевода. Выберите сценарий — bj-server отправит эталонный запрос через шлюз НРД, ответ придёт во входящие. Требуется настроенный шлюз НРД и ключ подписи.</p>
|
||||
<form method="post" action="/admin/setup/test-nsd" style="margin-top:12px;display:flex;gap:8px;flex-wrap:wrap;align-items:center">
|
||||
<select name="scenario">
|
||||
<option value="2001">2001 — Принять все бумаги</option>
|
||||
@@ -891,7 +891,7 @@
|
||||
</select>
|
||||
<button type="submit" class="btn">Отправить роботу</button>
|
||||
</form>
|
||||
<p class="muted" style="margin-top:6px;font-size:12px">Ответ робота — асинхронно (~30-60 сек) во входящие ИШ.</p>
|
||||
<p class="muted" style="margin-top:6px;font-size:12px">Ответ робота — асинхронно (~30-60 сек) во входящие шлюза НРД.</p>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
@@ -1125,7 +1125,7 @@
|
||||
<div class="tw" style="margin-top:10px"><table>
|
||||
<tbody>
|
||||
<tr><td style="width:34%"><strong>QUIK — Модуль неторговых поручений</strong></td><td class="muted">Блокировка/разблокировка и проверка количества бумаг в торговой системе — для собственного ЛК.</td></tr>
|
||||
<tr><td><strong>Обмен Fancy</strong></td><td class="muted">Проверка заявки по учёту клиента через БД («кран») перед отправкой в НРД — для фирм без ЕСИА Финанс.</td></tr>
|
||||
<tr><td><strong>Обмен с DEPO</strong></td><td class="muted">Проверка заявки по учёту клиента через БД («кран») перед отправкой в НРД — для фирм без ЕСИА Финанс.</td></tr>
|
||||
</tbody>
|
||||
</table></div>
|
||||
</div>
|
||||
@@ -1133,7 +1133,7 @@
|
||||
{{if .AdvancedUnlocked}}
|
||||
<div class="card" style="border-color:var(--ok,#16a34a)">
|
||||
<h2><span class="dot ok"></span>Доступ открыт</h2>
|
||||
<p class="muted">Разделы <strong>«Обмен Fancy»</strong> и <strong>«QUIK МНП»</strong> появились в меню слева. Это незавершённые модули — меняйте настройки, только если понимаете последствия.</p>
|
||||
<p class="muted">Разделы <strong>«Обмен с DEPO»</strong> и <strong>«QUIK МНП»</strong> появились в меню слева. Это незавершённые модули — меняйте настройки, только если понимаете последствия.</p>
|
||||
<form method="post" action="/admin/setup/advanced-lock" style="margin-top:12px"><button type="submit" class="btn">Скрыть снова</button></form>
|
||||
</div>
|
||||
{{else}}
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
{{if eq .Step 1}}
|
||||
{{/* восстановление из резервной копии — только на первой странице (/first-run), в мастере его нет */}}
|
||||
<div class="card">
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}err{{end}}"></span>Лицензия</h2>
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}err{{end}}"></span>{{.StepTitle}}</h2>
|
||||
{{if .Done.License}}<p>Ключ продукта открывает модули bj и обновления.</p>
|
||||
<dl class="wiz-kv">
|
||||
<dt>Организация</dt><dd>{{.Lic.Tenant}}</dd>
|
||||
@@ -133,7 +133,7 @@
|
||||
{{/* ============= ШАГ 3: Учёт DEPO (Fancy) — по экранам ============= */}}
|
||||
{{if eq .Step 3}}
|
||||
<div class="card">
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}err{{end}}"></span>Учётная система DEPO (Fancy)</h2>
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}err{{end}}"></span>{{.StepTitle}}</h2>
|
||||
{{if not .DepoLicensed}}
|
||||
<p class="muted">Модуль обмена с DEPO и QUIK не входит в текущую лицензию — шаг пропускается.</p>
|
||||
{{else}}
|
||||
@@ -332,7 +332,7 @@
|
||||
</table>
|
||||
{{if .Settings.Fancy.Server}}{{template "accPrefix" .}}{{end}}
|
||||
{{if .Done.Depo}}<p>Учёт DEPO подключён и проверен. Дальше — «Организация»: bj предложит реквизиты вашей организации из DEPO.</p>{{else}}<p class="muted" style="font-size:13px">Не всё проверено — можно продолжить настройку (шаг «Организация» и дальше) и вернуться сюда позже. Пока обработка не работает, записи bj ждут в таблицах обмена со статусом TODO и будут обработаны, когда она заработает.</p>{{end}}
|
||||
<form method="post" action="/admin/setup/wizard-depo/recheck" style="margin:0"><button type="submit" class="btn" style="background:var(--card);color:var(--text);border:1px solid var(--border-strong,#c9cdd8)">Перепроверить всё</button></form>
|
||||
<form method="post" action="/admin/setup/wizard-depo/recheck" style="margin:0"><button type="submit" class="btn btn-secondary">Перепроверить всё</button></form>
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{template "wizNav" .}}
|
||||
@@ -341,7 +341,7 @@
|
||||
{{/* ============= ШАГ 2: База bj (PostgreSQL) ============= */}}
|
||||
{{if eq .Step 2}}
|
||||
<div class="card">
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}err{{end}}"></span>База данных bj (PostgreSQL)</h2>
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}err{{end}}"></span>{{.StepTitle}}</h2>
|
||||
<p>База самого bj: журнал заявок и поручений, история обмена с НРД и DEPO, пользователи.</p>
|
||||
{{if and .Done.Postgres (pgLocal .Settings.Postgres.DSN)}}<div class="wiz-ok"><i class="wiz-ic"></i><span>База готова{{if .PGSummary}}: {{.PGSummary}}{{end}}. Её создал установщик — ничего делать не нужно.</span></div>
|
||||
<details style="margin-top:14px" {{if .Flash}}open{{end}}><summary style="cursor:pointer;color:var(--accent)">Хранить базу bj на своём сервере PostgreSQL (необязательно)</summary>
|
||||
@@ -423,7 +423,7 @@
|
||||
{{/* ============= ШАГ 4: Наша организация ============= */}}
|
||||
{{if eq .Step 4}}
|
||||
<div class="card">
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}err{{end}}"></span>Наша организация</h2>
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}err{{end}}"></span>{{.StepTitle}}</h2>
|
||||
<p>От имени вашей организации bj отправляет и принимает переводы. {{if .DepoLicensed}}Реквизиты bj берёт из DEPO — проверьте и сохраните.{{else}}Найдите себя в справочнике участников НРД.{{end}}</p>
|
||||
{{if .Suggest}}{{if .Suggest.OrgName}}{{if not .Done.Org}}<div class="wiz-ok" style="margin:0 0 14px"><i class="wiz-ic"></i><span><strong>Определено из DEPO</strong>: {{.Suggest.OrgName}}, ИНН {{.Suggest.OrgINN}}, код {{.Suggest.OrgCode}}{{if .Suggest.AccountID}}, счёт НРД {{.Suggest.AccountID}}{{end}}. Поля ниже заполнены — проверьте и нажмите «Сохранить».</span></div>{{end}}{{end}}{{end}}
|
||||
{{with .Fancy}}{{template "orgSection" .}}{{end}}
|
||||
@@ -435,7 +435,7 @@
|
||||
{{/* ============= ШАГ 5: QUIK МНП ============= */}}
|
||||
{{if eq .Step 5}}
|
||||
<div class="card">
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}err{{end}}"></span>QUIK</h2>
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}err{{end}}"></span>{{.StepTitle}}</h2>
|
||||
<p>Адрес и логин модуля неторговых поручений — у вашего администратора QUIK. Если модуля ещё нет, его подключает ARQA Technologies — письмо для них готово ниже.</p>
|
||||
{{if .DepoLicensed}}{{template "letterCard" (letter "arqa")}}{{end}}
|
||||
{{if not .DepoLicensed}}<p class="muted">Модуль неторговых поручений не входит в текущую лицензию — шаг пропускается.</p>
|
||||
@@ -452,7 +452,7 @@
|
||||
{{/* ============= ШАГ 6: Валидата ============= */}}
|
||||
{{if eq .Step 6}}
|
||||
<div class="card">
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}err{{end}}"></span>СКЗИ «Валидата Клиент L»</h2>
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}err{{end}}"></span>{{.StepTitle}}</h2>
|
||||
<p>СКЗИ «Валидата Клиент L» проверяет подписи НРД на квитанциях и сообщениях и нужно для работы с ключами и сертификатами (раздел «Ключ»).</p>
|
||||
{{if .ValidataVer}}
|
||||
<dl class="wiz-kv"><dt>Версия</dt><dd>{{.ValidataVer}}</dd>{{if devOn}}<dt>Каталог</dt><dd><code>/opt/Validata/VDCSP</code></dd>{{end}}</dl>
|
||||
@@ -465,7 +465,7 @@
|
||||
</div>
|
||||
{{if devOn}}<form method="post" action="/admin/setup/crypto" style="margin-top:12px">
|
||||
<input type="hidden" name="provider" value="stub">
|
||||
<button type="submit" class="btn" style="background:var(--card);color:var(--text);border:1px solid var(--border-strong,#c9cdd8)">Режим разработки: работать без криптографии (stub)</button>
|
||||
<button type="submit" class="btn btn-secondary">Режим разработки: работать без криптографии (stub)</button>
|
||||
</form>{{end}}
|
||||
{{end}}
|
||||
|
||||
@@ -476,7 +476,7 @@
|
||||
{{/* ============= ШАГ 7: Шлюз НРД (до ключа: ключ ставится в профиль ИШ) ============= */}}
|
||||
{{if eq .Step 7}}
|
||||
<div class="card">
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}err{{end}}"></span>Шлюз НРД</h2>
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}err{{end}}"></span>{{.StepTitle}}</h2>
|
||||
<p class="muted" style="font-size:13.5px;margin:4px 0 0">bj сам ставит и настраивает шлюз (ИШ) и обменивается через него переводами с НРД. Доступ к контурам НРД — по заявке (как подать — ниже).</p>
|
||||
{{template "igateInstall" .}}
|
||||
<div class="wiz-info" style="margin:12px 0 0"><span><b>Доступ к контурам НРД</b> — заявкой на сайте НРД, письмами НРД не подключает. Страница сервиса <a href="https://www.nsd.ru/services/novye-servisy/moex-most-dlya-m2m/" target="_blank" rel="noopener">MOEX МОСТ для M2M</a>, раздел «Как подключиться»: заявка на тестирование — система МОСТ, тип «M2M Автотестирование», затем «M2M Подключение»; после тестирования — договор с НРД и боевой контур.</span></div>
|
||||
@@ -489,7 +489,7 @@
|
||||
<input type="hidden" name="profile" value="{{if .Settings.NSD.Profile}}{{.Settings.NSD.Profile}}{{else}}test3-gost{{end}}">
|
||||
<label style="margin:0">Адрес веб-API шлюза НРД
|
||||
<input type="text" name="igw_base_url" value="{{if .Settings.NSD.IGWBaseURL}}{{.Settings.NSD.IGWBaseURL}}{{else}}http://localhost:8090{{end}}" placeholder="http://localhost:8090" style="width:100%;margin-top:4px"></label>
|
||||
<p id="igw-onyx" style="display:none;color:var(--err);font-size:13px;margin:0">Это адрес веб-сервиса НРД (ONYX), а не шлюза: bj работает через ИШ на этом сервере. Укажите адрес шлюза — обычно <a href="#" id="igw-def">http://localhost:8090</a>.</p>
|
||||
<p id="igw-onyx" style="display:none;color:var(--err);font-size:13px;margin:0">Это адрес веб-сервиса НРД (ONYX), а не шлюза: bj работает через шлюз НРД на этом сервере. Укажите адрес шлюза — обычно <a href="#" id="igw-def">http://localhost:8090</a>.</p>
|
||||
<script>(function(){var u=document.querySelector('[name=igw_base_url]'),w=document.getElementById('igw-onyx');
|
||||
function chk(){w.style.display=/onyx|nsd\.ru/i.test(u.value)?'block':'none'} u.addEventListener('input',chk); chk();
|
||||
document.getElementById('igw-def').onclick=function(e){e.preventDefault();u.value='http://localhost:8090';chk()};})();</script>
|
||||
@@ -504,7 +504,7 @@
|
||||
{{/* ============= ШАГ 8: Ключ и сертификаты (после шлюза: ключ ставится в профиль ИШ) ============= */}}
|
||||
{{if eq .Step 8}}
|
||||
<div class="card">
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}err{{end}}"></span>Ключ и сертификаты</h2>
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}err{{end}}"></span>{{.StepTitle}}</h2>
|
||||
<p>Ключ электронной подписи организации для обмена с НРД. Его выдаёт Удостоверяющий центр Московской биржи: вам передадут архив ключа и пароль.</p>
|
||||
{{if not .IgateOK}}<div class="wiz-info"><span>Ключ ставится в шлюз НРД — сначала установите <a href="/admin/wizard?step=7">шлюз</a>.</span></div>
|
||||
{{else if .KeyWiz}}<div class="keywiz">{{template "keyWizBody" .KeyWiz}}</div>{{end}}
|
||||
@@ -515,7 +515,7 @@
|
||||
</div>
|
||||
<details style="margin-top:6px;font-size:13px"><summary style="cursor:pointer;color:var(--accent)">Как это работает</summary>
|
||||
<p style="margin:6px 0 0">Действующие сертификаты НРД и удостоверяющих центров Московской биржи приезжают вместе с bj и его обновлениями. Каждые 6 часов bj сверяет их со справочником шлюза: добавляет недостающие, а заменённые убирает строго после срока, объявленного НРД. Перед изменением — резервная копия и проверка подписи, при ошибке всё откатывается. Тестовые сертификаты попадают только к тестовому ключу, боевые — только к боевому.</p></details>
|
||||
{{if .Settings.NSDCerts.LastRows}}<p class="muted" style="font-size:13px">Последняя сверка: {{.Settings.NSDCerts.LastRun.Format "02.01.2006 15:04"}}{{if .Settings.NSDCerts.LastProfile}}, профиль ИШ {{.Settings.NSDCerts.LastProfile}}{{end}}.</p>{{else}}{{end}}
|
||||
{{if .Settings.NSDCerts.LastRows}}<p class="muted" style="font-size:13px">Последняя сверка: {{.Settings.NSDCerts.LastRun.Format "02.01.2006 15:04"}}{{if and devOn .Settings.NSDCerts.LastProfile}}, профиль {{.Settings.NSDCerts.LastProfile}}{{end}}.</p>{{else}}{{end}}
|
||||
|
||||
{{if .Certs}}
|
||||
<details style="margin-top:18px">
|
||||
@@ -546,7 +546,7 @@
|
||||
{{/* ============= ШАГ 12: Время и сеть (глава «Сервер») ============= */}}
|
||||
{{if eq .Step 12}}
|
||||
<div class="card">
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}warn{{end}}"></span>Время и сеть</h2>
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}warn{{end}}"></span>{{.StepTitle}}</h2>
|
||||
<p>Часовой пояс, точное время и адрес сервера в сети.</p>
|
||||
{{$tz := serverTimeZone}}
|
||||
<form method="post" action="/admin/setup/timezone" id="wiz-tz" class="wiz-row">
|
||||
@@ -613,7 +613,7 @@
|
||||
{{/* ============= ШАГ 14: Обновление (глава «Обновление») ============= */}}
|
||||
{{if eq .Step 14}}
|
||||
<div class="card">
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}warn{{end}}"></span>Обновление</h2>
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}warn{{end}}"></span>{{.StepTitle}}</h2>
|
||||
<p>Проверка и установка обновлений bj. Это первый пункт мастера — сюда можно вернуться в любой момент.</p>
|
||||
{{with .Fancy}}{{template "updateSection" .}}{{end}}
|
||||
{{template "wizNav" .}}
|
||||
@@ -623,17 +623,17 @@
|
||||
{{/* ============= ШАГ 11: Модули по лицензии (глава «Запуск») ============= */}}
|
||||
{{if eq .Step 11}}
|
||||
<div class="card">
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}warn{{end}}"></span>Модули</h2>
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}warn{{end}}"></span>{{.StepTitle}}</h2>
|
||||
<p>Модули вашей лицензии уже установлены. Каждый настраивается в своём разделе — сейчас или позже.</p>
|
||||
{{range .Modules}}
|
||||
<div style="border:1px solid var(--border);border-radius:8px;padding:10px 12px;margin:8px 0">
|
||||
<div style="display:flex;justify-content:space-between;gap:8px;align-items:center;flex-wrap:wrap">
|
||||
<b><span class="dot {{if .Ready}}ok{{else}}warn{{end}}"></span>{{.Title}}</b>
|
||||
<a href="{{.Link}}" class="btn" style="text-decoration:none;padding:5px 12px;background:var(--card);color:var(--text);border:1px solid var(--border-strong,#c9cdd8)">{{if .Ready}}Открыть{{else}}Настроить{{end}}</a>
|
||||
<a href="{{.Link}}" class="btn btn-secondary" style="text-decoration:none;padding:5px 12px">{{if .Ready}}Открыть{{else}}Настроить{{end}}</a>
|
||||
</div>
|
||||
<p class="muted" style="font-size:13px;margin:6px 0 2px">{{.What}}</p>
|
||||
<p style="font-size:13px;margin:0;color:var({{if .Ready}}--ok{{else}}--warn{{end}})">{{if .Ready}}✓{{else}}⚠{{end}} {{.Status}}</p>
|
||||
{{if not .Ready}}<form method="post" action="/admin/setup/wizard-defer" style="margin:8px 0 0;display:flex;gap:8px;align-items:center;flex-wrap:wrap"><input type="hidden" name="step" value="11"><input type="hidden" name="module" value="{{.Key}}">{{if .Deferred}}<span class="muted" style="font-size:12.5px">⏸ отложено — мастер считает модуль завершённым</span><button type="submit" name="undo" value="1" class="btn" style="padding:3px 10px;font-size:12.5px;background:var(--card);color:var(--text);border:1px solid var(--border-strong,#c9cdd8)">Вернуть</button>{{else}}<button type="submit" class="btn" style="padding:3px 10px;font-size:12.5px;background:var(--card);color:var(--text);border:1px solid var(--border-strong,#c9cdd8)">Настроить позже</button>{{end}}</form>{{end}}
|
||||
{{if not .Ready}}<form method="post" action="/admin/setup/wizard-defer" style="margin:8px 0 0;display:flex;gap:8px;align-items:center;flex-wrap:wrap"><input type="hidden" name="step" value="11"><input type="hidden" name="module" value="{{.Key}}">{{if .Deferred}}<span class="muted" style="font-size:12.5px">⏸ отложено — мастер считает модуль завершённым</span><button type="submit" name="undo" value="1" class="btn btn-secondary" style="padding:3px 10px;font-size:12.5px">Вернуть</button>{{else}}<button type="submit" class="btn btn-secondary" style="padding:3px 10px;font-size:12.5px">Настроить позже</button>{{end}}</form>{{end}}
|
||||
</div>
|
||||
{{end}}
|
||||
{{template "wizDefer" .}}
|
||||
@@ -644,7 +644,7 @@
|
||||
{{/* ============= ШАГ 9: Оповещения и резервные копии ============= */}}
|
||||
{{if eq .Step 9}}
|
||||
<div class="card">
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}warn{{end}}"></span>Оповещения и резервные копии</h2>
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}warn{{end}}"></span>{{.StepTitle}}</h2>
|
||||
<p>bj напишет на почту, если НРД не отвечает, перевод застрял{{if .DepoLicensed}}, DEPO не обработал поручение{{end}} или истекает ключ, — и будет сам делать копии сервера. Настройте почтовый сервер, затем кому писать: администратору системы — о сбоях и обновлениях, отделам — о переводах и поручениях. Обмен работает и без этого, но о сбое тогда никто не узнает вовремя.</p>
|
||||
<div class="wiz-info" style="margin:10px 0"><span>Сейчас: почта — {{if and .Settings.Alerts.SMTP.Enabled .Settings.Alerts.SMTP.Host .Settings.Alerts.SMTP.To}}<b style="color:var(--ok)">✓ настроена</b>{{else}}<b style="color:var(--warn)">не настроена</b>{{end}}; Zabbix — {{if .Settings.Alerts.Zabbix.Enabled}}<b style="color:var(--ok)">✓ включён</b>{{else}}выключен{{end}}; резервные копии — {{if .Settings.Backup.Enabled}}<b style="color:var(--ok)">✓ включены</b>{{else}}<b style="color:var(--warn)">выключены</b>{{end}}. Шаг закрывается, когда есть оповещения (почта или Zabbix) и включены копии.</span></div>
|
||||
<style>.wiz9 label:not(:has(input[type=checkbox])){display:block;margin:0}.wiz9 label input:not([type=checkbox]),.wiz9 label select,.wiz9 .grid input,.wiz9 .grid select{width:100%;box-sizing:border-box;margin-top:4px}</style>
|
||||
@@ -663,7 +663,7 @@
|
||||
{{/* ============= ШАГ 13: Учётные записи (глава «Запуск», перед проверкой) ============= */}}
|
||||
{{if eq .Step 13}}
|
||||
<div class="card">
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}warn{{end}}"></span>Учётные записи</h2>
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}warn{{end}}"></span>{{.StepTitle}}</h2>
|
||||
<p>У каждого, кто работает с bj, — своя учётная запись: свой пароль и свои права, а в журнале видно, кто что сделал. Заведите сотрудников по ролям; права, пароли и вход через Active Directory меняются позже в разделе Настройка → Пользователи.</p>
|
||||
{{with .Fancy}}{{template "accountsAdd" (withRet . "/admin/wizard?step=13")}}{{template "accountsAD" (withRet . "/admin/wizard?step=13")}}
|
||||
{{end}}
|
||||
@@ -676,11 +676,11 @@
|
||||
{{if eq .Step 10}}
|
||||
<div class="card">
|
||||
{{if devOn}}
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}err{{end}}"></span>Тестовая заявка</h2>
|
||||
<h2><span class="dot {{if .StepDone}}ok{{else}}err{{end}}"></span>{{.StepTitle}}</h2>
|
||||
<p>Прогон полного цикла: создание заявки → валидация → подпись → отправка в НРД (или mock) → ожидание Decision → подтверждение.</p>
|
||||
|
||||
<div class="help-block">
|
||||
<strong>Что произойдёт?</strong> Система создаст тестовую M2M-сделку, проведёт её через всю стейт-машину, и покажет результат каждого этапа. Если ИШ НРД не настроен — сработает mock (синтетический Decision через 3 секунды).
|
||||
<strong>Что произойдёт?</strong> Система создаст тестовую M2M-сделку, проведёт её через всю стейт-машину, и покажет результат каждого этапа. Если шлюз НРД не настроен — сработает mock (синтетический Decision через 3 секунды).
|
||||
</div>
|
||||
|
||||
<form method="post" action="/admin/setup/test-run" style="margin-top:12px">
|
||||
@@ -701,7 +701,7 @@
|
||||
<p class="muted" style="margin:4px 0 10px">bj проверяет всё, что нужно для обмена с НРД, прямо сейчас. Красное — обмен работать не будет, жёлтое — работать будет, но лучше исправить. У каждой строки — ссылка туда, где это исправляется.</p>
|
||||
<div id="rd-sum" style="font-weight:600;margin:6px 0">Проверяю…</div>
|
||||
<table id="rd-tab" style="width:100%"><tbody></tbody></table>
|
||||
<p style="margin-top:8px"><button type="button" class="btn" id="rd-again" style="background:var(--card);color:var(--text);border:1px solid var(--border-strong,#c9cdd8)">Проверить ещё раз</button> <span class="muted" id="rd-at" style="font-size:12px"></span></p>
|
||||
<p style="margin-top:8px"><button type="button" class="btn btn-secondary" id="rd-again">Проверить ещё раз</button> <span class="muted" id="rd-at" style="font-size:12px"></span></p>
|
||||
<script>
|
||||
(function(){
|
||||
var tb=document.querySelector('#rd-tab tbody'), sum=document.getElementById('rd-sum'), dot=document.getElementById('rd-dot');
|
||||
|
||||
@@ -418,6 +418,14 @@ label { font-size:13px; font-weight:500; }
|
||||
.kv dd{margin:0;overflow-wrap:anywhere}
|
||||
.kv-ok{color:var(--ok);font-weight:700} .kv-no{color:var(--err);font-weight:700} .kv-warn{color:var(--warn);font-weight:700}
|
||||
@media (max-width:600px){.kv{grid-template-columns:minmax(0,1fr);gap:2px 0}.kv dd{margin-bottom:8px}}
|
||||
/* Узкий экран: поля и сетки с жёсткой шириной в разметке не вылезают за экран, широкие таблицы прокручиваются */
|
||||
@media (max-width:600px){
|
||||
.settings-section [style*="min-width"],.wiz-card [style*="min-width"]{min-width:0!important}
|
||||
.settings-section input:not([type=checkbox]):not([type=radio]),.settings-section select,.wiz-card input:not([type=checkbox]):not([type=radio]),.wiz-card select{max-width:100%}
|
||||
.settings-section [style*="grid-template-columns"],.wiz-card [style*="grid-template-columns"]{grid-template-columns:minmax(0,1fr)!important}
|
||||
.settings-section .card > table,.settings-section details > table,.wiz-card > table{display:block;overflow-x:auto}
|
||||
#pf-frame{height:80vh!important}
|
||||
}
|
||||
@media (max-width:700px){.org-grid{grid-template-columns:minmax(0,1fr)}}
|
||||
@media (max-width:820px) {
|
||||
.settings { grid-template-columns:1fr; }
|
||||
@@ -1031,7 +1039,7 @@ button.dq-link, .dq-link { background:none !important; border:0 !important; padd
|
||||
</div>
|
||||
<p id="upd-detail" style="margin:8px 0 0;font-size:13px;color:var(--muted,#667);min-height:18px"></p>
|
||||
<ol id="upd-ig" style="display:none;list-style:none;padding:0;margin:12px 0 0;font-size:14px;line-height:1.9"></ol>
|
||||
<details id="upd-ig-logw" style="display:none;margin-top:8px"><summary class="muted" style="font-size:12.5px;cursor:pointer">Журнал установки ИШ</summary>
|
||||
<details id="upd-ig-logw" style="display:none;margin-top:8px"><summary class="muted" style="font-size:12.5px;cursor:pointer">Журнал установки шлюза</summary>
|
||||
<pre id="upd-ig-log" style="max-height:200px;overflow:auto;font-size:11.5px;white-space:pre-wrap;background:var(--card-2,#eef0f4);padding:8px;border-radius:8px;margin:6px 0 0"></pre></details>
|
||||
<div id="upd-done" style="display:none;margin-top:14px;text-align:right"><button type="button" class="btn" onclick="location.reload()">Готово</button></div>
|
||||
</div>
|
||||
@@ -1061,8 +1069,8 @@ button.dq-link, .dq-link { background:none !important; border:0 !important; padd
|
||||
/* Обновление шлюза НРД (ИШ): с обновлением bj пришёл дистрибутив ИШ — bj ставит его сам после перезапуска.
|
||||
Окно не закрывается, пока новый ИШ не установлен и не проверен; на любой странице, пока идёт, —
|
||||
то же окно (страницы не показывают полуобновлённое состояние). Ошибка — текст, журнал и автооткат. */
|
||||
var IGS=[['prep','Загрузка и проверка дистрибутива ИШ'],['stop','Остановка старого ИШ'],['backup','Резервная копия старого ИШ'],
|
||||
['install','Установка нового ИШ'],['start','Запуск нового ИШ'],['verify','Проверка: версия, каналы, ключ, обмен с НРД']];
|
||||
var IGS=[['prep','Загрузка и проверка нового шлюза'],['stop','Остановка прежнего шлюза'],['backup','Резервная копия прежнего шлюза'],
|
||||
['install','Установка нового шлюза'],['start','Запуск нового шлюза'],['verify','Проверка: версия, каналы, ключ, обмен с НРД']];
|
||||
function igKey(s){ var g=s.stage||''; if(/^(queued|deps|dist|user|db|package)$/.test(g)) return 'prep';
|
||||
if(g==='config'||g==='schema') return 'install'; return g; }
|
||||
var ig={on:false,t0:0,seen:false,rb:false,idx:-1};
|
||||
@@ -1088,14 +1096,14 @@ button.dq-link, .dq-link { background:none !important; border:0 !important; padd
|
||||
var fresh=run||ig.seen||(s.elapsed!==undefined&&s.elapsed<since+5); // итог именно этой установки, не прошлой
|
||||
if(run) ig.seen=true;
|
||||
if(s.stage==='rollback'||(ig.rb&&run)){ ig.rb=true; igDraw(s,false);
|
||||
stageEl.innerHTML='<span style="color:var(--warn,#b7791f)">⟲ Обновление не прошло — возвращаю прежнюю версию ИШ</span>'; detail.textContent=s.msg||''; bar.style.width='90%'; }
|
||||
stageEl.innerHTML='<span style="color:var(--warn,#b7791f)">⟲ Обновление не прошло — возвращаю прежнюю версию шлюза</span>'; detail.textContent=s.msg||''; bar.style.width='90%'; }
|
||||
else if(run){ igDraw(s,false); stageEl.textContent='Идёт обновление шлюза НРД. Не закрывайте страницу: обмен с НРД на 1–3 минуты приостановлен.';
|
||||
bar.style.width=Math.max(8,Math.round((ig.idx+1)/(IGS.length+1)*100))+'%'; }
|
||||
else if(fresh&&s.stage==='done'&&!p.igate_to){ igDraw(s,false); finishIg(s.msg,true); return; }
|
||||
else if(fresh&&s.stage==='error'){ igDraw(s,false); finishIg(s.msg,false); return; }
|
||||
else { igDraw(null,true);
|
||||
if(since>15*60){ finishIg('bj не начал обновление шлюза за 15 минут. Шлюз работает на прежней версии; обновить можно на странице НРД → «Перенастроить» → «Шлюз».',false); return; }
|
||||
stageEl.textContent='Получен новый ИШ'+(p.igate_to?' '+p.igate_to:'')+' — bj начнёт обновление шлюза через несколько секунд.'; }
|
||||
stageEl.textContent='Получена новая версия шлюза НРД'+(p.igate_to?' '+p.igate_to:'')+' — bj начнёт обновление шлюза через несколько секунд.'; }
|
||||
setTimeout(tick,2500);
|
||||
}).catch(function(){ setTimeout(tick,3000); });
|
||||
})();
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
<h3 style="margin:0 0 4px">Шлюз на этом сервере</h3>
|
||||
<div id="ig-head" class="muted">Проверяю…</div>
|
||||
<p class="muted" style="font-size:12px;margin:4px 0 0">Новые версии шлюза приходят с обновлением bj и ставятся сами.</p>
|
||||
<div id="ig-reinst" style="display:none;margin-top:10px"><button type="button" class="btn" id="ig-bnd">Установить ИШ</button> <span class="muted" id="ig-bnd-v" style="font-size:12.5px"></span></div>
|
||||
<div id="ig-reinst" style="display:none;margin-top:10px"><button type="button" class="btn" id="ig-bnd">Установить шлюз НРД</button> <span class="muted" id="ig-bnd-v" style="font-size:12.5px"></span></div>
|
||||
<div id="ig-ov" style="display:none;position:fixed;inset:0;z-index:9999;background:rgba(20,24,35,.55);align-items:center;justify-content:center">
|
||||
<div class="card" style="max-width:600px;width:92%;margin:0;box-shadow:0 10px 40px rgba(0,0,0,.25)">
|
||||
<h3 id="ig-ov-h" style="margin:0 0 8px">Обновление шлюза НРД</h3>
|
||||
@@ -60,7 +60,7 @@
|
||||
<div id="ig-ov-btns" style="display:none;margin-top:12px"><button type="button" class="btn" id="ig-ov-close">Закрыть</button></div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="ig-rb" style="display:none;margin-top:8px"><button type="button" class="btn" id="ig-rb-btn" style="background:var(--card);color:var(--text);border:1px solid var(--border-strong,#c9cdd8)">Откатить ИШ к <span id="ig-rb-v"></span></button> <span class="muted" style="font-size:12.5px">вернуть версию, которая стояла до последнего обновления (программа, данные, база ИШ)</span></div>
|
||||
<div id="ig-rb" style="display:none;margin-top:8px"><button type="button" class="btn btn-secondary" id="ig-rb-btn">Откатить шлюз НРД к <span id="ig-rb-v"></span></button> <span class="muted" style="font-size:12.5px">вернуть версию, которая стояла до последнего обновления (программа, данные, база шлюза)</span></div>
|
||||
<ol class="ig-steps" id="ig-steps" hidden></ol>
|
||||
<div id="ig-out" style="margin-top:8px;font-size:13px"></div>
|
||||
<details id="ig-logbox" hidden style="margin-top:6px;font-size:12.5px"><summary style="cursor:pointer;color:var(--accent)">Журнал установки</summary>
|
||||
@@ -261,21 +261,21 @@
|
||||
var ri=document.getElementById('ig-reinst'), bb=document.getElementById('ig-bnd'), bv=document.getElementById('ig-bnd-v');
|
||||
var running=d.installed&&d.engine==='Running';
|
||||
var rb=document.getElementById('ig-rb'); if(rb){ var can=d.rollback&&d.rollback!==d.version; rb.style.display=can?'block':'none'; if(can) document.getElementById('ig-rb-v').textContent=d.rollback; }
|
||||
if(!d.installed) head.innerHTML=bad('ИШ на этом сервере не установлен');
|
||||
else head.innerHTML=(running?ok('ИШ '+d.version+' установлен и работает'):bad('Шлюз НРД установлен, но не работает'+(IGDEV?': движок '+(d.engine||'не отвечает')+', служба '+d.service:'')));
|
||||
if(!d.installed) head.innerHTML=bad('Шлюз НРД на этом сервере не установлен');
|
||||
else head.innerHTML=(running?ok('Шлюз НРД '+d.version+' установлен и работает'):bad('Шлюз НРД установлен, но не работает'+(IGDEV?': движок '+(d.engine||'не отвечает')+', служба '+d.service:'')));
|
||||
if(d.busy) head.innerHTML='<span style="color:var(--accent)">⟳ Шлюз перезапускается — '+esc(d.busy)+'; состояние — последнее известное</span>';
|
||||
if(!running && d.keymedia==='missing'){ head.innerHTML='<span style="color:var(--warn)">⚠ ИШ '+esc(d.version)+' ждёт флешку с ключом подписи — её нет в сервере. Вставьте флешку: bj перезапустит шлюз сам. Переустанавливать ИШ не нужно.</span>'; }
|
||||
if(!running && d.keymedia==='missing'){ head.innerHTML='<span style="color:var(--warn)">⚠ Шлюз НРД ждёт флешку с ключом подписи — её нет в сервере. Вставьте флешку: bj перезапустит шлюз сам. Переустанавливать шлюз не нужно.</span>'; }
|
||||
// не стоит или не работает — одна кнопка: поставить заново проверенную версию с сервера (систему переставлять не нужно)
|
||||
ri.style.display=(running||d.keymedia==='missing')?'none':'block'; // без флешки переустановка не поможет
|
||||
if(d.installing){ // bj сам ставит/обновляет ИШ: остановка шлюза — штатная, переустанавливать не нужно
|
||||
head.innerHTML='<span style="color:var(--accent)">⟳ Идёт установка ИШ'+(d.upgrade_to?' '+esc(d.upgrade_to):'')+' — '+esc(d.installing)+'. Шлюз недоступен 1–3 минуты; настройки и каналы сохраняются.</span>'; ri.style.display='none';
|
||||
head.innerHTML='<span style="color:var(--accent)">⟳ Идёт установка шлюза НРД'+(d.upgrade_to?' '+esc(d.upgrade_to):'')+' — '+esc(d.installing)+'. Шлюз недоступен 1–3 минуты; настройки и каналы сохраняются.</span>'; ri.style.display='none';
|
||||
} else if(d.upgrade_to){
|
||||
head.innerHTML+='<div class="muted" style="font-size:13px;margin-top:4px">⟳ Получена версия ИШ '+esc(d.upgrade_to)+' — bj обновит шлюз сам в ближайшие минуты; настройки и каналы сохранятся.</div>';
|
||||
head.innerHTML+='<div class="muted" style="font-size:13px;margin-top:4px">⟳ Получена новая версия шлюза НРД '+esc(d.upgrade_to)+' — bj обновит шлюз сам в ближайшие минуты; настройки и каналы сохранятся.</div>';
|
||||
}
|
||||
if(d.installing||d.upgrade_to) ovStart(); // обновление идёт или вот-вот начнётся — страница перекрыта ходом
|
||||
if(!running){
|
||||
if(d.bundled){ bb.style.display=''; bb.textContent=d.installed?'Установить ИШ заново':'Установить ИШ'; bv.textContent='версия '+d.bundled; }
|
||||
else { bb.style.display='none'; bv.textContent='Дистрибутива ИШ на сервере нет — он приходит с обновлением bj («Настройка → Обновления»).'; }
|
||||
if(d.bundled){ bb.style.display=''; bb.textContent=d.installed?'Установить шлюз НРД заново':'Установить шлюз НРД'; bv.textContent='версия '+d.bundled; }
|
||||
else { bb.style.display='none'; bv.textContent='Дистрибутива шлюза НРД на сервере нет — он приходит с обновлением bj («Настройка → Обновления»).'; }
|
||||
}
|
||||
var dep=d.deponent||'', cr=document.getElementById('ig-crypto').value;
|
||||
var rows=[['test3','Тестовый TEST3','проверка переводов до боевой работы'],['prod','Боевой','настоящие переводы']].map(function(x){
|
||||
@@ -308,7 +308,7 @@
|
||||
tb.innerHTML=rows.join('');
|
||||
document.getElementById('ig-depo').placeholder=d.depo_db_prod||d.depo_db||'как сейчас';
|
||||
tb.querySelectorAll('button[data-act]').forEach(function(b){ b.onclick=function(){ act(b.dataset.act,b.dataset.c,b); }; });
|
||||
}).catch(function(){ head.textContent='Состояние ИШ не получено.'; });
|
||||
}).catch(function(){ head.textContent='Состояние шлюза НРД не получено.'; });
|
||||
}
|
||||
function act(a,c,b){
|
||||
if(a==='showprod'){ document.getElementById('ig-prod').style.display='block'; return; }
|
||||
@@ -329,9 +329,9 @@
|
||||
};
|
||||
document.getElementById('ig-crypto').onchange=load;
|
||||
// этапы установщика (bj-igate-admin) по порядку и сколько каждый обычно длится, секунд
|
||||
var STAGES=[['queued','Запуск установки',15],['deps','Системные пакеты для работы без графики',120],['dist','Дистрибутив ИШ',30],
|
||||
['user','Пользователь igate и хранилище паролей',15],['db','База ИШ в PostgreSQL',20],['install','Установка пакета ИШ',90],
|
||||
['config','Настройка для работы без графики',15],['schema','Создание схемы базы ИШ',90],['start','Запуск ИШ и движка',120]];
|
||||
var STAGES=[['queued','Запуск установки',15],['deps','Системные компоненты',120],['dist','Дистрибутив шлюза',30],
|
||||
['user','Служебный пользователь шлюза',15],['db','База шлюза',20],['install','Установка шлюза',90],
|
||||
['config','Настройка шлюза',15],['schema','Подготовка базы шлюза',90],['start','Запуск шлюза',120]];
|
||||
var stepsEl=document.getElementById('ig-steps'), logbox=document.getElementById('ig-logbox'), cur={key:'',since:0,s:null}, tick=0;
|
||||
function stageKey(s){ // прежний установщик называл два этапа «package», а первый и последний — «start»
|
||||
if(s.stage==='package') return /дистрибутив/.test(s.msg||'')?'dist':'install';
|
||||
@@ -360,7 +360,7 @@
|
||||
function ovTick(){
|
||||
fetch('/admin/setup/igate/install-status',{cache:'no-store'}).then(function(r){return r.json()}).then(function(s){
|
||||
var run=s.stage&&s.stage!=='done'&&s.stage!=='error';
|
||||
if(run){ ov.seen=true; ovSet(s.stage==='rollback'?'<span style="color:var(--warn)">⟲ Обновление не прошло — возвращаю прежнюю версию ИШ</span>':'⟳ Идёт установка шлюза НРД',
|
||||
if(run){ ov.seen=true; ovSet(s.stage==='rollback'?'<span style="color:var(--warn)">⟲ Обновление не прошло — возвращаю прежнюю версию шлюза</span>':'⟳ Идёт установка шлюза НРД',
|
||||
(s.msg||s.stage)+' · '+(s.elapsed||0)+' с на этапе. Не закрывайте страницу: обмен с НРД на 1–3 минуты приостановлен, настройки и каналы сохраняются.', s.log, false); return; }
|
||||
if(!ov.seen){
|
||||
if(Date.now()-ov.t0>15*60000){ clearInterval(ov.iv); ov.on=false; document.getElementById('ig-ov').style.display='none'; return; }
|
||||
@@ -381,7 +381,7 @@
|
||||
cur.s=s; draw(); out.textContent='';
|
||||
if(s.log){ logbox.hidden=false; lg.textContent=s.log; lg.scrollTop=lg.scrollHeight; }
|
||||
if(s.stage==='done'){ clearInterval(iv); clearInterval(tick); btn.disabled=false; out.innerHTML=ok(s.msg); load(); }
|
||||
if(s.stage==='error'){ clearInterval(iv); clearInterval(tick); btn.disabled=false; out.innerHTML=bad(s.msg)+' — можно нажать «Установить ИШ заново»'; logbox.open=true; load(); }
|
||||
if(s.stage==='error'){ clearInterval(iv); clearInterval(tick); btn.disabled=false; out.innerHTML=bad(s.msg)+' — можно нажать «Установить шлюз НРД заново»'; logbox.open=true; load(); }
|
||||
}).catch(function(){});
|
||||
if(Date.now()-t0>2700000){ clearInterval(iv); clearInterval(tick); } },3000); }
|
||||
document.getElementById('ig-bnd').onclick=function(){
|
||||
@@ -389,7 +389,7 @@
|
||||
var p=new URLSearchParams(); p.set('bundled','1');
|
||||
out.textContent='Запускаю…'; cur={key:'',since:0,s:null}; post('/admin/setup/igate/install',p).then(function(d){ if(!d.ok){out.innerHTML=bad(d.error);return} out.textContent=d.output; poll(); }); };
|
||||
document.getElementById('ig-rb-btn').onclick=function(){ var v=document.getElementById('ig-rb-v').textContent;
|
||||
if(!confirm('Откатить ИШ к версии '+v+'? Шлюз остановится на 1–3 минуты; программа, данные и база ИШ вернутся к состоянию до обновления. Пришедшую версию bj сам ставить больше не будет, пока не выйдет следующая.')) return;
|
||||
if(!confirm('Откатить шлюз НРД к версии '+v+'? Шлюз остановится на 1–3 минуты; программа, данные и база шлюза вернутся к состоянию до обновления. Пришедшую версию bj сам ставить больше не будет, пока не выйдет следующая.')) return;
|
||||
out.textContent='Запускаю откат…'; cur={key:'',since:0,s:null}; post('/admin/setup/igate/rollback',new URLSearchParams()).then(function(d){ if(!d.ok){out.innerHTML=bad(d.error);return} out.textContent=d.output; poll(); }); };
|
||||
if(document.getElementById('ig-dl')) document.getElementById('ig-dl').onclick=function(){ var p=new URLSearchParams(); p.set('version',document.getElementById('ig-ver').value.trim());
|
||||
out.textContent='Запускаю…'; cur={key:'',since:0,s:null}; post('/admin/setup/igate/install',p).then(function(d){ if(!d.ok){out.innerHTML=bad(d.error);return} out.textContent=d.output; poll(); }); };
|
||||
|
||||
@@ -133,7 +133,7 @@
|
||||
<div class="card">
|
||||
<h2>Шаг 2 — использовать ключ с флешки</h2>
|
||||
<p class="muted">На флешке уже подготовленный ключ: <code>{{fallbackTpl $s.VDK "—"}}</code>{{if $s.MediaProfile}}, профиль <code>{{$s.MediaProfile}}</code>{{end}}.
|
||||
bj подключит его к шлюзу НРД <b>как есть</b>: на флешку ничего не записывается — справочник для ИШ собирается на диске сервера, флешка подключается только для чтения.</p>
|
||||
bj подключит его к шлюзу НРД <b>как есть</b>: на флешку ничего не записывается — справочник для шлюза собирается на диске сервера, флешка подключается только для чтения.</p>
|
||||
<form method="post" action="/admin/setup/keywizard/install" style="margin-top:12px;display:grid;gap:12px;max-width:640px"
|
||||
onsubmit="this.querySelector('button[type=submit]').disabled=true;this.querySelector('button[type=submit]').textContent='Подключаю… (до пары минут)';">
|
||||
{{template "keyWizRet" .}}
|
||||
@@ -161,7 +161,7 @@
|
||||
<h2>Шаг 2 — вставьте новую флешку и запишите ключ</h2>
|
||||
<p class="muted">Архив распакован. Ключ: <code>{{fallbackTpl $s.VDK "—"}}</code>.
|
||||
Вставьте в сервер чистую флешку — на неё запишется ключ и справочник сертификатов, затем bj
|
||||
подключит её к шлюзу и перезапустит ИШ. Копия прежнего содержимого флешки сохраняется на сервере.
|
||||
подключит её к шлюзу и перезапустит шлюз. Копия прежнего содержимого флешки сохраняется на сервере.
|
||||
Не используйте флешку с рабочим ключом другого сервера.</p>
|
||||
{{if not .Drives}}<p style="margin:10px 0 0">Флешка не найдена — вставьте её в сервер и <a href="javascript:location.reload()">обновите страницу</a>.</p>{{else}}
|
||||
<form method="post" action="/admin/setup/keywizard/install" style="margin-top:12px;display:grid;gap:12px;max-width:640px"
|
||||
@@ -178,7 +178,7 @@
|
||||
<b>{{fallbackTpl $d.Model "USB-носитель"}}</b> · {{$d.Size}} · {{$d.FSType}}
|
||||
{{if $d.Label}}· метка «{{$d.Label}}»{{end}}<br>
|
||||
<span class="muted" style="font-size:12px">{{$d.Device}}{{if $d.Mountpoint}} · {{$d.Mountpoint}}{{end}}
|
||||
{{if $d.IsKeymedia}}<b style="color:var(--accent)">← текущий ключевой носитель ИШ (рекомендуется)</b>{{end}}</span>
|
||||
{{if $d.IsKeymedia}}<b style="color:var(--accent)">← текущий ключевой носитель шлюза (рекомендуется)</b>{{end}}</span>
|
||||
</span>
|
||||
</label>
|
||||
{{end}}
|
||||
@@ -191,7 +191,7 @@
|
||||
{{if .SuggestIssuer}}<p class="muted" style="font-size:12px;margin:0 0 4px">В архиве сертификат от «{{.SuggestIssuer}}» — это {{if eq .SuggestContour "test3"}}тестовый{{else}}боевой{{end}} ключ.</p>{{end}}
|
||||
<label style="display:flex;gap:8px;align-items:center;font-weight:400"><input type="radio" name="contour" value="test3" style="width:auto" {{if ne $c "prod"}}checked{{end}}> Тестовый TEST3 <span class="muted" style="font-size:12px">— сертификат от «Тестовый УЦ»</span></label>
|
||||
<label style="display:flex;gap:8px;align-items:center;font-weight:400"><input type="radio" name="contour" value="prod" style="width:auto" {{if eq $c "prod"}}checked{{end}}> Боевой <span class="muted" style="font-size:12px">— выдан УЦ Московской биржи для работы</span></label>
|
||||
<span class="muted" style="font-size:12px">У тестового и боевого контуров разные ключи: ключ подключается только к каналу ИШ своего контура.</span>
|
||||
<span class="muted" style="font-size:12px">У тестового и боевого контуров разные ключи: ключ подключается только к каналу шлюза своего контура.</span>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
@@ -234,7 +234,7 @@
|
||||
<label class="kw-drive">
|
||||
<input type="radio" name="source_device" value="{{$d.Device}}" {{if eq $i 0}}checked{{end}} style="margin-top:3px;width:auto">
|
||||
<span><b>{{fallbackTpl $d.Model "USB-носитель"}}</b> · {{$d.Size}} · {{$d.FSType}}{{if $d.Label}} · метка «{{$d.Label}}»{{end}}<br>
|
||||
<span class="muted" style="font-size:12px">{{$d.Device}}{{if $d.IsKeymedia}} · <b style="color:var(--accent)">сейчас ключевой носитель ИШ</b>{{end}}</span></span>
|
||||
<span class="muted" style="font-size:12px">{{$d.Device}}{{if $d.IsKeymedia}} · <b style="color:var(--accent)">сейчас ключевой носитель шлюза</b>{{end}}</span></span>
|
||||
</label>
|
||||
{{end}}
|
||||
<div style="display:flex;gap:10px;flex-wrap:wrap;align-items:center">
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<p class="muted" style="font-size:12px;margin:4px 0 8px">В квадратных скобках — то, чего bj не знает: впишите перед отправкой.</p>
|
||||
<div style="display:flex;gap:8px;flex-wrap:wrap">
|
||||
<a class="btn" href="/admin/setup/letters/{{.Key}}.txt" style="text-decoration:none">Скачать текст</a>
|
||||
<a class="btn" href="{{mailtoLink .}}" style="text-decoration:none;background:var(--card);color:var(--text);border:1px solid var(--border-strong,#c9cdd8)">Открыть в почте</a>
|
||||
<a class="btn btn-secondary" href="{{mailtoLink .}}" style="text-decoration:none">Открыть в почте</a>
|
||||
</div>
|
||||
</details>
|
||||
{{end}}{{end}}
|
||||
|
||||
@@ -53,8 +53,8 @@
|
||||
window.addEventListener('bj-igate-status',function(e){ var d=e.detail||{}; if(!gw) return;
|
||||
if(!d.ok){ gw.innerHTML='<span class="kv-no">✗</span> состояние не получено'; return; }
|
||||
if(!d.installed){ gw.innerHTML='<span class="kv-no">✗</span> шлюз на этом сервере не установлен'; return; }
|
||||
var run=d.engine==='Running', c=d.active_contour==='prod'?'боевой':'тестовый TEST3', code=(d.active_contour==='prod'?'PROD':'TEST3')+(d.deponent||''), ch=(d.channels||[]).filter(function(x){return x.code===code})[0];
|
||||
gw.innerHTML=(run?'<span class="kv-ok">✓</span> ИШ '+esc(d.version)+' работает':'<span class="kv-no">✗</span> ИШ '+esc(d.version)+' не работает'+(d.keymedia==='missing'?' — ждёт флешку с ключом':''))+' · активный контур <b>'+c+'</b>'+(ch?(' · канал '+(ch.enabled?'включён':'выключен')+(ch.profile?(dev?' · ключ '+esc(ch.profile):' · ключ установлен'):' · <span style="color:var(--err)">ключ не установлен</span>')):'');
|
||||
var run=d.engine==='Running', c=d.active_contour==='prod'?'боевой':'тестовый (TEST3)', code=(d.active_contour==='prod'?'PROD':'TEST3')+(d.deponent||''), ch=(d.channels||[]).filter(function(x){return x.code===code})[0];
|
||||
gw.innerHTML=(run?'<span class="kv-ok">✓</span> работает · версия '+esc(d.version):'<span class="kv-no">✗</span> не работает'+(d.keymedia==='missing'?' — ждёт флешку с ключом':''))+' · активный контур <b>'+c+'</b>'+(ch?(' · канал '+(ch.enabled?'включён':'выключен')+(ch.profile?(dev?' · ключ '+esc(ch.profile):' · ключ установлен'):' · <span style="color:var(--err)">ключ не установлен</span>')):'');
|
||||
});
|
||||
window.addEventListener('bj-igate-share',function(e){ var d=e.detail||{}; if(!sh) return;
|
||||
if(d.manual){ sh.textContent='открыты вручную (smb.conf)'; return; }
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{{/* Низ карточки шага мастера: «Назад» слева, «Далее» справа (несделанный обязательный шаг — «Пропустить пока»). */}}
|
||||
{{/* «Настроить позже» для необязательного шага (9, 11, 13): шаг считается завершённым, вернуть можно. */}}
|
||||
{{define "wizDefer"}}{{if index .Deferred .Step}}<div class="wiz-info" style="margin-top:14px;align-items:center;flex-wrap:wrap"><span>⏸ Шаг отложен — мастер считает его завершённым. Настроить можно в любой момент в «Настройке».</span>
|
||||
<form method="post" action="/admin/setup/wizard-defer" style="display:inline;margin:0"><input type="hidden" name="step" value="{{.Step}}"><button type="submit" name="undo" value="1" class="btn" style="padding:4px 10px;font-size:13px;background:var(--card);color:var(--text);border:1px solid var(--border-strong,#c9cdd8)">Вернуть в мастер</button></form></div>
|
||||
{{else if not .StepDone}}<form method="post" action="/admin/setup/wizard-defer" style="margin:14px 0 0;display:flex;gap:10px;align-items:center;flex-wrap:wrap"><input type="hidden" name="step" value="{{.Step}}"><button type="submit" class="btn" style="padding:6px 14px;background:var(--card);color:var(--text);border:1px solid var(--border-strong,#c9cdd8)">Настроить позже</button><span class="muted" style="font-size:13px">шаг будет считаться завершённым; вернуться можно в любой момент</span></form>{{end}}{{end}}
|
||||
<form method="post" action="/admin/setup/wizard-defer" style="display:inline;margin:0"><input type="hidden" name="step" value="{{.Step}}"><button type="submit" name="undo" value="1" class="btn btn-secondary" style="padding:4px 10px;font-size:13px">Вернуть в мастер</button></form></div>
|
||||
{{else if not .StepDone}}<form method="post" action="/admin/setup/wizard-defer" style="margin:14px 0 0;display:flex;gap:10px;align-items:center;flex-wrap:wrap"><input type="hidden" name="step" value="{{.Step}}"><button type="submit" class="btn btn-secondary" style="padding:6px 14px">Настроить позже</button><span class="muted" style="font-size:13px">шаг будет считаться завершённым; вернуться можно в любой момент</span></form>{{end}}{{end}}
|
||||
|
||||
{{define "wizNav"}}
|
||||
<div class="wiz-nav">
|
||||
|
||||
@@ -22,8 +22,8 @@ var wizChapters = []struct {
|
||||
|
||||
// wizStepTitles — короткие названия шагов (подзаголовки внутри главы).
|
||||
var wizStepTitles = map[int]string{
|
||||
1: "Лицензия", 2: "База bj", 6: "Валидата", 12: "Время и сеть", 14: "Обновление",
|
||||
3: "Учёт DEPO", 4: "Организация", 5: "QUIK МНП",
|
||||
1: "Лицензия", 2: "База данных bj", 6: "СКЗИ «Валидата»", 12: "Время и сеть", 14: "Обновление",
|
||||
3: "Учёт DEPO (Fancy)", 4: "Организация", 5: "QUIK МНП",
|
||||
7: "Шлюз НРД", 8: "Ключ подписи",
|
||||
11: "Модули", 9: "Оповещения и копии", 13: "Учётные записи", 10: "Проверка",
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user