Мастер: «Настроить позже» и единый расчёт шагов для мастера и главной

- Необязательные шаги «Модули», «Оповещения и копии», «Учётные записи» и каждый
  модуль отдельно можно отложить кнопкой «Настроить позже»: мастер считает их
  завершёнными, глава «Запуск» закрывается. Отметку можно снять («Вернуть в
  мастер»); как только шаг настроен по-настоящему, отметка не показывается.
  Хранится в /var/lib/bj/.bj/wizard-deferred.json (wizdefer.go).
- Шаг «Оповещения и копии» показывает, что уже настроено: почта, Zabbix,
  резервные копии — видно частичную настройку, сделанную в «Настройке».
- Плашка «Требуется настройка — N из M» на главной считалась по старому списку
  из 9 шагов и расходилась с мастером. Теперь и мастер, и главная используют одну
  функцию wizDone и путь wizPath — те же шаги, лицензия и отметки «отложено».

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
fontvielle
2026-10-21 19:23:29 +03:00
parent 551448216c
commit efe56bdde1
7 changed files with 175 additions and 29 deletions
+12 -7
View File
@@ -56,6 +56,7 @@ func registerSetup(mux *http.ServeMux, a *admin, rc *RuntimeConfig, svc *Service
h.renderSetup(w, r, "")
})
mux.HandleFunc("/admin/setup/postgres", h.savePostgres)
registerWizDefer(mux) // «Настроить позже» в мастере
mux.HandleFunc("/admin/setup/postgres/quick-start", h.quickStartPostgres)
h.registerPGMove(mux)
h.registerFancy(mux) // вкладка «Обмен Fancy (MSSQL)»
@@ -200,8 +201,9 @@ type WizardData struct {
StepRequired bool
StepTitle string
ChapterTitle string
ChaptersLine string // «Четыре главы: сервер, организация, НРД, запуск.»
Modules []WizModule // глава «Запуск»: модули по лицензии
ChaptersLine string // «Четыре главы: сервер, организация, НРД, запуск.»
Modules []WizModule // глава «Запуск»: модули по лицензии
Deferred map[int]bool // шаги, отложенные кнопкой «Настроить позже» (и ещё не настроенные)
Done struct {
License bool
Depo bool
@@ -279,18 +281,21 @@ func (h *setupHandlers) renderWizard(w http.ResponseWriter, r *http.Request) {
d.Modules = wizModuleViews(h.rc, s)
d.Done.Server, _ = timeStatus(r.Context())
d.Done.Server = d.Done.Server && !s.WorkHours.SavedAt.IsZero() // и рабочее время организации задано
def := loadWizDeferred()
d.Done.Modules = true
for _, m := range d.Modules {
if !m.Ready {
for i := range d.Modules {
d.Modules[i].Deferred = !d.Modules[i].Ready && def.Modules[d.Modules[i].Key]
if !d.Modules[i].Ready {
d.Done.Modules = false
}
}
// Главы (wizchapters.go): в пути только шаги, нужные этой установке — по лицензии и без сделанного
// установщиком. Без ?step — первый несделанный обязательный шаг, а если всё сделано — проверка.
d.Done.Users = doneUsers()
_, wizUpdAvail := updateComponentRows(h.rc) // шаг 14 «Обновление»: зелёный, пока нет версии новее
done := map[int]bool{1: d.Done.License, 2: d.Done.Postgres, 3: d.Done.Depo, 4: d.Done.Org, 5: d.Done.Quik, 6: d.Done.Crypto,
7: d.Done.NSD, 8: d.Done.Certs || h.keyWiz.installed(), 9: d.Done.Alerts, 10: d.Done.TestRun, 11: d.Done.Modules, 12: d.Done.Server, 13: d.Done.Users, 14: !wizUpdAvail}
// Выполнено ли — одно правило с плашкой на главной (wizDone), с учётом «Настроить позже».
done := wizDone(r.Context(), h.rc, d.ValidataVer, d.Done.Certs || h.keyWiz.installed())
// «отложено» показываем, только пока шаг не настроен по-настоящему
d.Deferred = map[int]bool{9: def.Steps[9] && !d.Done.Alerts, 11: def.Steps[11] && !d.Done.Modules, 13: def.Steps[13] && !d.Done.Users}
path, _ := wizPath(h.rc, done, 0)
step := wizDefaultStep(path, done)
if v := r.URL.Query().Get("step"); v != "" {