diff --git a/.gitea/workflows/deploy-bcards.yml b/.gitea/workflows/deploy-bcards.yml index 728e12a..f6cc88d 100644 --- a/.gitea/workflows/deploy-bcards.yml +++ b/.gitea/workflows/deploy-bcards.yml @@ -162,7 +162,7 @@ jobs: # Build para a plataforma correta if [ "${{ steps.settings.outputs.deploy_target }}" = "production" ]; then - # Build para produção (main branch) + # Build para produção (main branch) - Usa Configuration=Release (padrão) docker buildx build \ --platform ${{ steps.settings.outputs.platform }} \ --file ${{ steps.settings.outputs.dockerfile }} \ @@ -171,12 +171,13 @@ jobs: --progress=plain \ . else - # Build para staging (Release branches) + # Build para staging (Release branches) - Usa Configuration=Testing para habilitar código de teste docker buildx build \ --platform ${{ steps.settings.outputs.platform }} \ --file ${{ steps.settings.outputs.dockerfile }} \ --tag ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.settings.outputs.tag }} \ --push \ + --build-arg BUILD_CONFIGURATION=Testing \ --build-arg VERSION=${{ steps.settings.outputs.version || 'latest' }} \ --build-arg COMMIT=${{ steps.settings.outputs.commit }} \ --progress=plain \ diff --git a/Dockerfile b/Dockerfile index f34ff92..1b0dad4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,15 +5,17 @@ EXPOSE 8080 EXPOSE 8443 FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +ARG BUILD_CONFIGURATION=Release WORKDIR /src COPY ["src/BCards.Web/BCards.Web.csproj", "src/BCards.Web/"] RUN dotnet restore "src/BCards.Web/BCards.Web.csproj" COPY . . WORKDIR "/src/src/BCards.Web" -RUN dotnet build "BCards.Web.csproj" -c Release -o /app/build +RUN dotnet build "BCards.Web.csproj" -c ${BUILD_CONFIGURATION} -o /app/build FROM build AS publish -RUN dotnet publish "BCards.Web.csproj" -c Release -o /app/publish /p:UseAppHost=false +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "BCards.Web.csproj" -c ${BUILD_CONFIGURATION} -o /app/publish /p:UseAppHost=false FROM base AS final WORKDIR /app diff --git a/src/BCards.Web/Program.cs b/src/BCards.Web/Program.cs index 6bd165f..1cd1aa5 100644 --- a/src/BCards.Web/Program.cs +++ b/src/BCards.Web/Program.cs @@ -572,6 +572,13 @@ builder.Services.AddHttpClient(client => client.DefaultRequestHeaders.Add("User-Agent", "BCards-CriticalCheck/1.0"); }); +builder.Services.AddHsts(options => +{ + options.MaxAge = TimeSpan.FromDays(365); + options.IncludeSubDomains = true; + options.Preload = true; +}); + var app = builder.Build(); app.UseForwardedHeaders(); diff --git a/src/BCards.Web/Views/Admin/ManagePage.cshtml b/src/BCards.Web/Views/Admin/ManagePage.cshtml index 1d47fec..d8b9511 100644 --- a/src/BCards.Web/Views/Admin/ManagePage.cshtml +++ b/src/BCards.Web/Views/Admin/ManagePage.cshtml @@ -239,6 +239,35 @@
+ @if (!Model.AllowDocumentUpload) + { + +
+ +
+
+ Anexar PDFs é exclusivo dos planos Premium +
+

+ Compartilhe apresentações, catálogos, portfólios e documentos diretamente na sua página profissional. +

+ +
+ + Plano Premium: até 5 PDFs + + + Plano Premium + Afiliados: até 10 PDFs + +
+ + + Fazer upgrade e desbloquear PDFs + +
+
+ } + @if (Model.AllowDocumentUpload) {

Anexe PDFs com apresentações, catálogos ou materiais exclusivos para quem acessar sua página Premium.

@@ -2594,6 +2623,63 @@ @:} } } + + // ======================================== + // Sistema de Confirmação ao Sair da Página + // ======================================== + let formChanged = false; + let isSubmitting = false; + + $(document).ready(function() { + // Marcar formulário como alterado quando qualquer campo mudar + $('form :input').on('change input', function() { + if (!isSubmitting) { + formChanged = true; + console.log('Formulário alterado detectado'); + } + }); + + // Quando submeter o formulário, desabilitar aviso + $('form').on('submit', function() { + console.log('Formulário submetido - desabilitando avisos'); + isSubmitting = true; + formChanged = false; + }); + + // Aviso ao tentar fechar/recarregar a página + window.addEventListener('beforeunload', function(e) { + if (formChanged && !isSubmitting) { + console.log('beforeunload: Tentativa de sair com alterações não salvas'); + e.preventDefault(); + e.returnValue = ''; // Chrome requer isso + return 'Você tem alterações não salvas. Deseja realmente sair?'; + } + }); + + // Interceptar cliques em links de navegação (incluindo Dashboard) + $(document).on('click', 'a:not(.no-confirm)', function(e) { + if (formChanged && !isSubmitting) { + const href = $(this).attr('href'); + + // Não avisar para links externos, âncoras ou JavaScript + if (href && !href.startsWith('#') && !href.startsWith('javascript:')) { + console.log('Link clicado com alterações não salvas:', href); + + if (!confirm('Você tem alterações não salvas. Deseja realmente sair desta página?')) { + e.preventDefault(); + console.log('Usuário cancelou navegação'); + return false; + } + + // Usuário confirmou, permitir navegação + console.log('Usuário confirmou saída'); + formChanged = false; + } + } + }); + + console.log('Sistema de confirmação ao sair inicializado'); + }); }