$(function() { $(document).on("click", ".public-admin-ad-menu-toggle", function(event) { event.preventDefault(); event.stopPropagation(); const menu = $(this).closest(".public-admin-ad-menu"); const isOpen = menu.hasClass("is-open"); if (typeof closeCardInfoPopovers === "function") { closeCardInfoPopovers(); } closePublicAdminAdMenus(); if (!isOpen) { menu.addClass("is-open"); positionPublicAdminAdMenu(menu); $(this).attr("aria-expanded", "true"); } }); $(document).on("click", function() { closePublicAdminAdMenus(); }); $(document).on("keydown", function(event) { if (event.key === "Escape") { closePublicAdminAdMenus(); } }); $(document).on("click", ".public-admin-ad-action", async function(event) { event.preventDefault(); event.stopPropagation(); const button = $(this); const publicId = button.data("ad-id"); const action = button.data("ad-action"); const card = button.closest(".card"); closePublicAdminAdMenus(); if (button.prop("disabled") || button.data("loading")) { return; } if (!publicId || action !== "block") { popZ("Ação administrativa inválida para este anúncio.", "warning"); return; } const confirmed = await confirmPublicAdminAdAction({ title: "Bloquear anúncio?", text: "Use esta ação para anúncios irregulares. O anúncio será removido do catálogo público.", confirmButtonText: "Sim, bloquear" }); if (!confirmed) { return; } button.data("loading", true).prop("disabled", true).attr("aria-busy", "true"); $.ajax({ type: "POST", url: "/api/admin/ads", data: { action: "update_status", public_id: publicId, ad_action: action }, dataType: "json", success: function(response) { handlePublicAdminAdResponse(response); if (response.result === "admin_ad_status_updated") { card.fadeOut(160, function() { $(this).remove(); }); } }, error: function(jqXhr) { handlePublicAdminAdResponse(jqXhr.responseJSON || {}); }, complete: function() { button.data("loading", false).prop("disabled", false).removeAttr("aria-busy"); } }); }); }); function closePublicAdminAdMenus() { $(".public-admin-ad-menu") .removeClass("is-open opens-up") .find(".public-admin-ad-menu-toggle") .attr("aria-expanded", "false"); $(".card.public-admin-menu-open").removeClass("public-admin-menu-open"); } function positionPublicAdminAdMenu(menu) { const list = menu.find(".dashboard-ad-menu-list"); if (!list.length) { return; } menu.removeClass("opens-up"); const menuRect = menu[0].getBoundingClientRect(); const listHeight = list.outerHeight() || 0; const bottomSpace = window.innerHeight - menuRect.bottom; if (bottomSpace < listHeight + 16) { menu.addClass("opens-up"); } menu.closest(".card").addClass("public-admin-menu-open"); } async function confirmPublicAdminAdAction(options) { if (typeof Swal === "undefined") { return window.confirm(options.title || "Deseja continuar?"); } const result = await Swal.fire({ icon: "warning", title: options.title, text: options.text, showCancelButton: true, confirmButtonText: options.confirmButtonText || "Confirmar", cancelButtonText: "Cancelar", reverseButtons: true, confirmButtonColor: "#e63946", cancelButtonColor: "#6b7785" }); return result.isConfirmed; } function handlePublicAdminAdResponse(response) { switch (response.result) { case "admin_ad_status_updated": popZ("Anúncio bloqueado com sucesso.", "success"); break; case "admin_ad_not_found": popZ("Anúncio não encontrado.", "warning"); break; case "invalid_admin_ad_status_transition": popZ("Este anúncio não permite essa alteração.", "warning"); break; case "invalid_admin_ad_action": popZ("Ação inválida para este anúncio.", "warning"); break; case "admin_ad_status_update_failed": popZ("Não foi possível bloquear o anúncio. Tente novamente.", "error"); break; default: popZ("Não foi possível executar a ação no anúncio.", "error"); break; } }