Задача 040: название в UI — «IPAM Manager»

В web/app.js три вхождения «ipam_manager» (шапка, экран входа и шаг 2FA) заменены
на «IPAM Manager». Атомарная правка отдельным коммитом.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ayurishchevandClaude Opus 5.5 committed 2026-09-27 18:01:58 +03:00
1 parent a6e70ffd1a
commit aeb89dbded
4 files changed
+23 -3

No files matched your search

+1
View File
@@ -205,6 +205,7 @@ docker compose -p ipam_control_006 up -d --build && venv/bin/python -m pytest -q
| 036 | Меню пользователя в шапке: логин с выпадающим списком | [план](docs/changes/036-user-menu/PLAN.md) · [итог](docs/changes/036-user-menu/SUMMARY.md) | | 036 | Меню пользователя в шапке: логин с выпадающим списком | [план](docs/changes/036-user-menu/PLAN.md) · [итог](docs/changes/036-user-menu/SUMMARY.md) |
| 037 | Двухфакторная аутентификация TOTP, по выбору пользователя | [план](docs/changes/037-totp-2fa/PLAN.md) · [итог](docs/changes/037-totp-2fa/SUMMARY.md) | | 037 | Двухфакторная аутентификация TOTP, по выбору пользователя | [план](docs/changes/037-totp-2fa/PLAN.md) · [итог](docs/changes/037-totp-2fa/SUMMARY.md) |
| 038 | Тёмная тема UI | [план](docs/changes/038-dark-theme/PLAN.md) · [итог](docs/changes/038-dark-theme/SUMMARY.md) | | 038 | Тёмная тема UI | [план](docs/changes/038-dark-theme/PLAN.md) · [итог](docs/changes/038-dark-theme/SUMMARY.md) |
| 040 | Название в UI: «IPAM Manager» | [план](docs/changes/040-brand-name/PLAN.md) · [итог](docs/changes/040-brand-name/SUMMARY.md) |
## Отчёты ревью ## Отчёты ревью
- [Ревью кодовой базы](docs/reviews/2026-09-26-codebase-review.md) (находки → изменения 011–023) - [Ревью кодовой базы](docs/reviews/2026-09-26-codebase-review.md) (находки → изменения 011–023)
+11
View File
@@ -0,0 +1,11 @@
# Название в UI: «IPAM Manager» (изменение 040)
## Context
В `web/app.js` название приложения выводится как `ipam_manager` — в шапке и на экране входа (шаг пароля и шаг 2FA), всего 3 строки.
Нужно «IPAM Manager», как в `<title>`, README и issuer TOTP. Атомарная правка, отдельный коммит.
## Изменения
- `web/app.js`: `ipam_manager` → `IPAM Manager` во всех трёх местах; в `web/` и `app/` других вхождений нет.
## Проверка
- `grep -c ipam_manager web/app.js` → 0; `node --check`; стенд отдаёт новый `app.js`.
+8
View File
@@ -0,0 +1,8 @@
# Итог: название в UI — «IPAM Manager» (изменение 040)
План: `PLAN.md`. В `web/app.js` три вхождения `ipam_manager` (шапка, экран входа — шаг пароля и шаг 2FA) заменены на «IPAM Manager».
Других вхождений в `web/` и `app/` не было.
## Проверки
- `grep -c ipam_manager web/app.js` → 0; `node --check web/app.js` — чисто.
- На стенде появится при ближайшей пересборке (вместе с изменением 039).
+3 -3
View File
@@ -160,7 +160,7 @@ function shell(active, content) {
{ label: "Светлая", value: "light", cls: curTheme === "light" ? "sel" : "" }, { label: "Светлая", value: "light", cls: curTheme === "light" ? "sel" : "" },
{ label: "Тёмная", value: "dark", cls: curTheme === "dark" ? "sel" : "" }, { label: "Тёмная", value: "dark", cls: curTheme === "dark" ? "sel" : "" },
], "row-pop")}</span>`; ], "row-pop")}</span>`;
return `<div class="appbar"><div class="brand"><span class="brand-logo">${I.globe()}</span>ipam_manager</div> return `<div class="appbar"><div class="brand"><span class="brand-logo">${I.globe()}</span>IPAM Manager</div>
<nav class="nav">${nav.map(([k, l]) => `<a href="#/${k}" class="${k === active ? "active" : ""}">${l}</a>`).join("")}</nav> <nav class="nav">${nav.map(([k, l]) => `<a href="#/${k}" class="${k === active ? "active" : ""}">${l}</a>`).join("")}</nav>
<div class="grow"></div><span style="display:flex;align-items:center;gap:8px">${themeBtn}${userMenu}</span></div> <div class="grow"></div><span style="display:flex;align-items:center;gap:8px">${themeBtn}${userMenu}</span></div>
<div class="page">${content}</div>`; <div class="page">${content}</div>`;
@@ -872,13 +872,13 @@ ${fInput("code", "Код из приложения или код восстан
// ---- login // ---- login
function loginScreen(err = "") { function loginScreen(err = "") {
if (pendingMfa) { if (pendingMfa) {
return `<div class="card login"><div class="brand"><span class="brand-logo">${I.globe()}</span>ipam_manager</div><h1>Вход</h1> return `<div class="card login"><div class="brand"><span class="brand-logo">${I.globe()}</span>IPAM Manager</div><h1>Вход</h1>
<form id="mfa-form"><div class="err-banner" style="margin-top:12px" ${err ? "" : "hidden"}>${esc(err)}</div> <form id="mfa-form"><div class="err-banner" style="margin-top:12px" ${err ? "" : "hidden"}>${esc(err)}</div>
<label class="field"><span>Код из приложения или код восстановления</span><input class="input mono" name="code" autocomplete="one-time-code" autofocus></label> <label class="field"><span>Код из приложения или код восстановления</span><input class="input mono" name="code" autocomplete="one-time-code" autofocus></label>
<button class="btn primary" type="submit">Подтвердить</button> <button class="btn primary" type="submit">Подтвердить</button>
<button class="btn ghost" type="button" data-action="mfa-back" style="margin-top:8px;width:100%">Назад</button></form></div>`; <button class="btn ghost" type="button" data-action="mfa-back" style="margin-top:8px;width:100%">Назад</button></form></div>`;
} }
return `<div class="card login"><div class="brand"><span class="brand-logo">${I.globe()}</span>ipam_manager</div><h1>Вход</h1> return `<div class="card login"><div class="brand"><span class="brand-logo">${I.globe()}</span>IPAM Manager</div><h1>Вход</h1>
<form id="login-form"><div class="err-banner" style="margin-top:12px" ${err ? "" : "hidden"}>${esc(err)}</div> <form id="login-form"><div class="err-banner" style="margin-top:12px" ${err ? "" : "hidden"}>${esc(err)}</div>
<label class="field"><span>Логин</span><input class="input" name="username" autocomplete="username" autofocus></label> <label class="field"><span>Логин</span><input class="input" name="username" autocomplete="username" autofocus></label>
<label class="field"><span>Пароль</span><input class="input" type="password" name="password" autocomplete="current-password"></label> <label class="field"><span>Пароль</span><input class="input" type="password" name="password" autocomplete="current-password"></label>