fix: невалидное имя варианта проекта — предупреждение вместо ошибки

Имя варианта "main" или с недопустимыми символами больше не отклоняет
запрос ошибкой 400 — теперь автоматически конвертируется в валидное
(sanitizeProjectVariantName), а API/UI показывают variant_warning вместо
блокировки создания/переименования варианта.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Mikhail Chusavitin
2026-09-17 11:56:55 +03:00
co-authored by Claude Sonnet 5
parent 006d7e87c5
commit 2f3bdc609a
6 changed files with 140 additions and 80 deletions
+10 -17
View File
@@ -681,8 +681,8 @@ function closeVariantActionModal() {
function findUniqueVariantActionName(baseName, targetCode, excludeProjectUUID) {
const cleanedBase = (baseName || '').trim();
if (!cleanedBase || normalizeVariantLabel(cleanedBase).toLowerCase() === 'main') {
return {error: 'Имя варианта не должно быть пустым и не может быть main'};
if (!cleanedBase) {
return {error: 'Имя варианта не должно быть пустым'};
}
const code = (targetCode || '').trim();
@@ -805,10 +805,6 @@ async function saveVariantAction() {
})
});
if (!createResp.ok) {
if (createResp.status === 400) {
notify('Имя варианта не может быть main', 'error');
return;
}
if (createResp.status === 409) {
notify('Вариант с таким кодом и значением уже существует', 'error');
return;
@@ -829,7 +825,7 @@ async function saveVariantAction() {
return;
}
closeVariantActionModal();
notify('Копия варианта создана', 'success');
notify(created.variant_warning ? 'Копия варианта создана. ' + created.variant_warning : 'Копия варианта создана', 'success');
window.location.href = '/projects/' + created.uuid;
return;
}
@@ -846,10 +842,6 @@ async function saveVariantAction() {
body: JSON.stringify({code: code, variant: name})
});
if (!updateResp.ok) {
if (updateResp.status === 400) {
notify('Имя варианта не может быть main', 'error');
return;
}
if (updateResp.status === 409) {
notify('Вариант с таким кодом и значением уже существует', 'error');
return;
@@ -857,12 +849,13 @@ async function saveVariantAction() {
notify('Не удалось сохранить вариант', 'error');
return;
}
const updated = await updateResp.json().catch(() => null);
closeVariantActionModal();
await loadProject();
await loadConfigs();
updateDeleteVariantButton();
notify('Вариант обновлён', 'success');
notify(updated && updated.variant_warning ? 'Вариант обновлён. ' + updated.variant_warning : 'Вариант обновлён', 'success');
}
async function createNewVariant() {
@@ -874,10 +867,6 @@ async function createNewVariant() {
showToast('Укажите вариант', 'error');
return;
}
if (!/^[A-Za-z0-9._-]+$/.test(variant)) {
showToast('Имя варианта содержит недопустимые символы. Разрешены: буквы, цифры, дефис, точка, подчёркивание.', 'error');
return;
}
const payload = {
code: code,
variant: variant,
@@ -895,7 +884,11 @@ async function createNewVariant() {
}
const created = await resp.json().catch(() => null);
closeNewVariantModal();
showToast('Вариант создан', 'success');
if (created && created.variant_warning) {
showToast('Вариант создан. ' + created.variant_warning, 'info');
} else {
showToast('Вариант создан', 'success');
}
if (created && created.uuid) {
window.location.href = '/projects/' + created.uuid;
return;