From 79d20bc2cf450ba99b4dbbe88a8df7ec6204187f Mon Sep 17 00:00:00 2001 From: zuevav Date: Mon, 5 Oct 2026 19:07:41 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=B0=D1=81=D1=82=D0=B5=D1=80=20=D0=B1?= =?UTF-8?q?=D0=B5=D0=B7=20=D0=BB=D0=B8=D1=86=D0=B5=D0=BD=D0=B7=D0=B8=D0=B8?= =?UTF-8?q?=20=D1=83=D1=87=D1=91=D1=82=D0=B0:=20=D0=B3=D0=BB=D0=B0=D0=B2?= =?UTF-8?q?=D0=B0=202=20=D0=BD=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5=D1=82?= =?UTF-8?q?=D1=81=D1=8F=20=C2=AB=D0=9E=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=C2=BB,=20=D0=BF=D0=BE=D0=B4=D0=B7?= =?UTF-8?q?=D0=B0=D0=B3=D0=BE=D0=BB=D0=BE=D0=B2=D0=BE=D0=BA=20=D0=BC=D0=B0?= =?UTF-8?q?=D1=81=D1=82=D0=B5=D1=80=D0=B0=20=D1=81=D0=BE=D0=B1=D0=B8=D1=80?= =?UTF-8?q?=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=B8=D0=B7=20=D0=B3=D0=BB?= =?UTF-8?q?=D0=B0=D0=B2=20=D1=8D=D1=82=D0=BE=D0=B9=20=D1=83=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA=D0=B8;=20=D0=B2=20=D1=88=D0=B0?= =?UTF-8?q?=D0=BF=D0=BA=D0=B5=20=C2=AB=D0=9D=D0=A0=D0=94=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D1=91=D0=BD=C2=BB=20?= =?UTF-8?q?=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20=C2=AB=D0=9D=D0=B5=D1=82?= =?UTF-8?q?=20=D1=81=D0=B2=D1=8F=D0=B7=D0=B8=20=D1=81=20=D0=9D=D0=A0=D0=94?= =?UTF-8?q?=C2=BB,=20=D0=BF=D0=BE=D0=BA=D0=B0=20=D0=BE=D0=B1=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BD=D0=B5=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B5=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi --- internal/lkgateway/onboarding_test.go | 6 +++++ internal/lkgateway/setup.go | 2 ++ .../lkgateway/web/templates/admin_wizard.html | 2 +- internal/lkgateway/web/templates/layout.html | 2 +- internal/lkgateway/wizchapters.go | 23 +++++++++++++++++++ 5 files changed, 33 insertions(+), 2 deletions(-) diff --git a/internal/lkgateway/onboarding_test.go b/internal/lkgateway/onboarding_test.go index 208a735..5b10248 100644 --- a/internal/lkgateway/onboarding_test.go +++ b/internal/lkgateway/onboarding_test.go @@ -212,6 +212,12 @@ func TestWizardChaptersWithoutLicense(t *testing.T) { if len(wizModuleViews(rc, rc.Snapshot())) != 0 { t.Fatal("без лицензии модулей в мастере быть не должно") } + if chapters[1].Title != "Организация" { + t.Fatalf("без учёта DEPO и QUIK глава 2 — «Организация», а не %q", chapters[1].Title) + } + if l := wizChaptersLine(chapters); l != "Четыре главы: сервер, организация, НРД, запуск." { + t.Fatalf("подзаголовок: %q", l) + } } func TestLettersFill(t *testing.T) { diff --git a/internal/lkgateway/setup.go b/internal/lkgateway/setup.go index b566158..ecbbc5e 100644 --- a/internal/lkgateway/setup.go +++ b/internal/lkgateway/setup.go @@ -187,6 +187,7 @@ type WizardData struct { StepRequired bool StepTitle string ChapterTitle string + ChaptersLine string // «Четыре главы: сервер, организация, НРД, запуск.» Modules []WizModule // глава «Запуск»: модули по лицензии Done struct { License bool @@ -289,6 +290,7 @@ func (h *setupHandlers) renderWizard(w http.ResponseWriter, r *http.Request) { d.ChapterTitle = c.Title } } + d.ChaptersLine = wizChaptersLine(d.Chapters) if done[2] { d.AutoDone = append(d.AutoDone, "База bj создана установщиком"+pickStr(" — "+d.PGSummary, "")) } diff --git a/internal/lkgateway/web/templates/admin_wizard.html b/internal/lkgateway/web/templates/admin_wizard.html index d0d9cf4..deb625a 100644 --- a/internal/lkgateway/web/templates/admin_wizard.html +++ b/internal/lkgateway/web/templates/admin_wizard.html @@ -31,7 +31,7 @@ a.wstep:hover .bub { box-shadow:0 0 0 4px var(--accent-weak); }

Настройка Bridge&Join

-

Четыре главы: сервер, учёт и организация, НРД, запуск. Всё сохраняется сразу — можно прерваться и вернуться

+

{{.ChaptersLine}} Всё сохраняется сразу — можно прерваться и вернуться.

diff --git a/internal/lkgateway/web/templates/layout.html b/internal/lkgateway/web/templates/layout.html index 9fbb605..9fa620a 100644 --- a/internal/lkgateway/web/templates/layout.html +++ b/internal/lkgateway/web/templates/layout.html @@ -361,7 +361,7 @@ details:has(> pre.copyable) { min-width:0; max-width:100%; }
{{if and .NSDLink.Configured (not .IsMockMode)}}Шлюз НРД{{else}} - {{if .IsMockMode}}{{if devOn}}Эмуляция{{else}}Нет связи с НРД{{end}}{{else}}НРД на связи{{end}}{{end}} + {{if .IsMockMode}}{{if devOn}}Эмуляция{{else}}НРД не подключён{{end}}{{else}}НРД на связи{{end}}{{end}} {{.Now}} diff --git a/internal/lkgateway/wizchapters.go b/internal/lkgateway/wizchapters.go index 058f9ce..a9bbab4 100644 --- a/internal/lkgateway/wizchapters.go +++ b/internal/lkgateway/wizchapters.go @@ -7,6 +7,8 @@ package lkgateway // - сделан установщиком без участия человека (база bj, Валидата) — шага нет в пути, в главе «Сервер» // это показано строкой «сделано автоматически». +import "strings" + // wizChapters — главы мастера: название и шаги по порядку. var wizChapters = []struct { Title string @@ -91,6 +93,9 @@ func wizPath(rc *RuntimeConfig, done map[int]bool, current int) (path []int, cha if len(c.Steps) == 0 { continue } + if len(c.Steps) == 1 { // в главе один шаг (остальные не в лицензии) — глава называется по нему: «Организация» + c.Title = c.Steps[0].Title + } // переход по главе — на первый несделанный шаг главы for _, s := range c.Steps { if !s.Done { @@ -103,6 +108,24 @@ func wizPath(rc *RuntimeConfig, done map[int]bool, current int) (path []int, cha return path, chapters } +// wizChaptersLine — подзаголовок мастера: «Четыре главы: сервер, организация, НРД, запуск». +func wizChaptersLine(chapters []WizChapter) string { + words := []string{"", "Одна глава", "Две главы", "Три главы", "Четыре главы"} + var names []string + for _, c := range chapters { + t := c.Title + if t != "НРД" && t != "" { + r := []rune(t) + t = strings.ToLower(string(r[:1])) + string(r[1:]) + } + names = append(names, t) + } + if len(chapters) == 0 || len(chapters) >= len(words) { + return "" + } + return words[len(chapters)] + ": " + strings.Join(names, ", ") + "." +} + // wizNeighbours — предыдущий и следующий шаг в пути (0 — нет). func wizNeighbours(path []int, current int) (prev, next int) { for i, n := range path {