diff --git a/internal/services/project.go b/internal/services/project.go index 3d67188..d5f3421 100644 --- a/internal/services/project.go +++ b/internal/services/project.go @@ -21,6 +21,7 @@ var ( ErrProjectCodeExists = errors.New("project code and variant already exist") ErrCannotDeleteMainVariant = errors.New("cannot delete main variant") ErrReservedMainVariant = errors.New("variant name 'main' is reserved") + ErrCannotRenameMainVariant = errors.New("cannot rename main variant") ) type ProjectService struct { @@ -108,7 +109,12 @@ func (s *ProjectService) Update(projectUUID, ownerUsername string, req *UpdatePr localProject.Code = code } if req.Variant != nil { - localProject.Variant = strings.TrimSpace(*req.Variant) + newVariant := strings.TrimSpace(*req.Variant) + // Block renaming of the main variant (empty Variant) — there must always be a main. + if strings.TrimSpace(localProject.Variant) == "" && newVariant != "" { + return nil, ErrCannotRenameMainVariant + } + localProject.Variant = newVariant if err := validateProjectVariantName(localProject.Variant); err != nil { return nil, err } diff --git a/web/templates/index.html b/web/templates/index.html index 7a9c025..0434dc6 100644 --- a/web/templates/index.html +++ b/web/templates/index.html @@ -477,6 +477,7 @@ function updateConfigBreadcrumbs() { configEl.textContent = truncateBreadcrumbSpecName(fullConfigName); configEl.title = fullConfigName; versionEl.textContent = 'main'; + document.title = code + ' / ' + variant + ' / ' + fullConfigName + ' — QuoteForge'; const configNameLinkEl = document.getElementById('breadcrumb-config-name-link'); if (configNameLinkEl && configUUID) { configNameLinkEl.href = '/configs/' + configUUID + '/revisions'; diff --git a/web/templates/project_detail.html b/web/templates/project_detail.html index b59b457..b060214 100644 --- a/web/templates/project_detail.html +++ b/web/templates/project_detail.html @@ -363,6 +363,7 @@ function renderVariantSelect() { if (item.uuid === projectUUID) { option.className += ' font-semibold text-gray-900'; label.textContent = variantLabel; + document.title = (project && project.code ? project.code : '—') + ' / ' + variantLabel + ' — QuoteForge'; } option.textContent = variantLabel; option.onclick = function() {