diff --git a/DOCS/ARCHITECTURE.md b/DOCS/ARCHITECTURE.md index 7efbfbc..4e9008b 100644 --- a/DOCS/ARCHITECTURE.md +++ b/DOCS/ARCHITECTURE.md @@ -1,6 +1,6 @@ # Архитектура app-autotest — полный документ -v1.0.63, 27.07.2026 +v1.0.64, 27.07.2026 --- @@ -351,6 +351,8 @@ def detect_endpoint(token): | 18 | v1.0.59 | После F5 список терял tracked-инстанс | `api_operations()` не добирал tracked-сирот обратно из трекера | `tracked_by_uid` + добавление отсутствующих tracked-инстансов | | 19 | v1.0.60 | CREATE не появлялся сразу в списке после OK | UI делал diff и мог не перерисовать список целиком | Полная перерисовка `inst-list` в `refreshInstances()` | | 20 | v1.0.63 | Дубли и чужие инстансы | Принадлежность определялась не по namespace | `autotest-` prefix + уникализация `displayName` при CREATE | +| 21 | v1.0.64 | Версия не показывалась в шапке | `load_config()` затирал VERSION | `config["VERSION"] = current_app.config["VERSION"]` | +| 22 | v1.0.64 | displayName был editable value, а не placeholder | CREATE подставлял имя в value | Placeholder `autotest-...`, значение вводит пользователь | ### ✅ Закрыто в v1.0.56 diff --git a/DOCS/HISTORY.md b/DOCS/HISTORY.md index cd0beea..b0df14a 100644 --- a/DOCS/HISTORY.md +++ b/DOCS/HISTORY.md @@ -1,5 +1,17 @@ # История разработки app-autotest +## v1.0.64 (27.07.2026) — header version + editable displayName placeholder + +### Что изменилось +- В `site/routes/main.py` версия теперь гарантированно попадает в `config.VERSION` даже после `load_config()`. +- В `site/templates/index.html` поле `displayName` остаётся редактируемым, но автотест-имя показывается как placeholder. +- При CREATE пользователь может ввести своё имя, а backend всё равно добавит `autotest-` и проверит уникальность. +- В `DOCS/ARCHITECTURE.md` зафиксированы оба изменения. + +### Что это чинит +- Пропадающую версию в шапке. +- Неправильное поведение поля `displayName`, когда оно выглядело как готовое значение вместо подсказки. + ## v1.0.63 (27.07.2026) — autotest namespace for instances ### Что изменилось diff --git a/site/app.py b/site/app.py index 7e76a32..39d7d74 100644 --- a/site/app.py +++ b/site/app.py @@ -6,7 +6,7 @@ from routes.main import bp as main_bp from routes.api import bp as api_bp from routes.api_test import bp as api_test_bp -VERSION = "1.0.63" +VERSION = "1.0.64" app = Flask(__name__, template_folder="templates", static_folder="static") app.config["NUBES_API_ENDPOINT"] = os.getenv("NUBES_API_ENDPOINT", "https://lk-api-gateway-dev.ngcloud.ru/api/v1/svc") diff --git a/site/routes/main.py b/site/routes/main.py index ca52096..dfb4942 100644 --- a/site/routes/main.py +++ b/site/routes/main.py @@ -116,7 +116,8 @@ def index(): for i in instances: svc_name = i.get("svc", "Прочее") instance_groups.setdefault(svc_name, []).append(i) - config = load_config() + config = dict(load_config() or {}) + config["VERSION"] = current_app.config["VERSION"] except Exception as e: error = str(e) else: diff --git a/site/templates/index.html b/site/templates/index.html index 298bc45..f5c1055 100644 --- a/site/templates/index.html +++ b/site/templates/index.html @@ -189,8 +189,8 @@ function showParams(opId,opName){ fetch('/api/params/'+opId).then(r=>r.json()).then(params=>{ const form=document.getElementById('params-form'); - const displayName=opName==='create'?makeCreateDisplayName():''; - form.innerHTML=(opName==='create'?`
`:'') + const displayNameHint=opName==='create'?makeCreateDisplayName():''; + form.innerHTML=(opName==='create'?`
`:'') + params.map(p=>{ const req=p.isRequired; const hasDfl=p.defaultValue!==null&&p.defaultValue!==undefined&&p.defaultValue!==''; @@ -242,7 +242,8 @@ function setRunningState(opName, displayName){ async function executeOp(params){ stopPoll(); // Захватить displayName ДО очистки формы - const displayName=document.getElementById('param-displayname')?.value||'autotest-1'; + const displayNameInput=document.getElementById('param-displayname'); + const displayName=(displayNameInput?.value||'').trim() || displayNameInput?.placeholder || 'autotest'; document.getElementById('params-card').style.display='block'; document.getElementById('params-form').innerHTML=''; const btn=document.getElementById('btn-test');