fix: slug duplicado
All checks were successful
BCards Deployment Pipeline / Run Tests (push) Successful in 3s
BCards Deployment Pipeline / PR Validation (push) Has been skipped
BCards Deployment Pipeline / Build and Push Image (push) Successful in 16m8s
BCards Deployment Pipeline / Deploy to Production (ARM - OCI) (push) Successful in 2m25s
BCards Deployment Pipeline / Deploy to Staging (x86 - Local) (push) Has been skipped
BCards Deployment Pipeline / Cleanup Old Resources (push) Has been skipped
BCards Deployment Pipeline / Deployment Summary (push) Successful in 0s

This commit is contained in:
Ricardo Carneiro 2025-09-14 13:16:50 -03:00
parent 4bad39ec85
commit 2eada5f44c
2 changed files with 71 additions and 4 deletions

View File

@ -93,8 +93,7 @@ public class UserPageRepository : IUserPageRepository
{
var filter = Builders<UserPage>.Filter.And(
Builders<UserPage>.Filter.Eq(x => x.Category, category),
Builders<UserPage>.Filter.Eq(x => x.Slug, slug),
Builders<UserPage>.Filter.Eq(x => x.IsActive, true)
Builders<UserPage>.Filter.Eq(x => x.Slug, slug)
);
if (!string.IsNullOrEmpty(excludeId))

View File

@ -94,9 +94,12 @@
<span class="input-group-text" id="categorySlug">@SlugHelper.CreateCategorySlug(Model.Category)</span>
<span class="input-group-text">/</span>
<input type="text" class="form-control" id="slugPreview" value="@Model.Slug" readonly>
<span class="input-group-text" id="slugValidationIcon" style="display: none;">
<i id="slugIcon" class=""></i>
</span>
<input asp-for="Slug" type="hidden">
</div>
<small class="form-text text-muted">URL gerada automaticamente</small>
<small class="form-text" id="slugValidationMessage">URL gerada automaticamente</small>
</div>
</div>
</div>
@ -975,6 +978,11 @@
updateProgress();
});
// Validar slug inicial (para páginas em edição)
if ($('#Slug').val() && $('#Category').val()) {
validateSlugAvailability($('#Category').val(), $('#Slug').val());
}
// Theme selection
$('.theme-card').on('click', function() {
$('.theme-card').removeClass('selected');
@ -1117,10 +1125,70 @@
$('#Slug').val(data.slug);
$('#slugPreview').val(data.slug);
$('#categorySlug').text(data.category);
// Validar disponibilidade do slug gerado
validateSlugAvailability(category, data.slug);
});
}
}
function validateSlugAvailability(category, slug) {
if (!category || !slug) return;
const excludeId = '@Model.Id' !== '' ? '@Model.Id' : null;
// Mostrar indicador de carregamento
showSlugValidationStatus('loading', 'Verificando disponibilidade...');
$.post('@Url.Action("CheckSlugAvailability", "Admin")', {
category: category,
slug: slug,
excludeId: excludeId
})
.done(function(response) {
if (response.available) {
showSlugValidationStatus('success', 'URL disponível!');
} else {
showSlugValidationStatus('error', response.message || 'Esta URL já está em uso.');
}
})
.fail(function() {
showSlugValidationStatus('error', 'Erro ao verificar disponibilidade.');
});
}
function showSlugValidationStatus(type, message) {
const $icon = $('#slugIcon');
const $message = $('#slugValidationMessage');
const $iconContainer = $('#slugValidationIcon');
$iconContainer.show();
// Remover classes anteriores
$icon.removeClass('fas fa-check-circle fas fa-times-circle fas fa-spinner fa-spin text-success text-danger text-primary');
$message.removeClass('text-success text-danger text-primary text-muted');
switch(type) {
case 'success':
$icon.addClass('fas fa-check-circle text-success');
$message.addClass('text-success');
break;
case 'error':
$icon.addClass('fas fa-times-circle text-danger');
$message.addClass('text-danger');
break;
case 'loading':
$icon.addClass('fas fa-spinner fa-spin text-primary');
$message.addClass('text-primary');
break;
default:
$iconContainer.hide();
$message.addClass('text-muted');
}
$message.text(message);
}
function addLinkInput(title = '', url = '', description = '', icon = '', linkType = 'Normal', id='new') {
// Encontrar o próximo índice disponível baseado em todos os campos Links[] existentes
const existingIndexes = [];