(function () { const ns = (window.CabinetSignals = window.CabinetSignals || {}); ns.renderSignals = function renderSignals(signals) { const container = document.getElementById("signals-list"); if (!signals || !signals.length) { if (typeof window.renderEmptyBox === "function") { window.renderEmptyBox(container, "Сигналы появятся позже", "Пока системе не за что цепляться. Как только накопятся данные или найдутся отклонения, здесь появятся важные уведомления."); } return; } const levelMeta = window.levelMeta || ((level) => ({ bg: "bg-blue-500 text-black", card: "border-blue-500/20 bg-blue-500/5", tag: level || "Наблюдение" })); const escapeHtml = window.escapeHtml || ((value) => String(value || "")); container.innerHTML = signals.map((signal, index) => { const meta = levelMeta(signal.level); return `
${meta.tag}
Сигнал ${index + 1}

${escapeHtml(signal.title || signal.campaign_name || "Сигнал")}

${escapeHtml(signal.text || "Описание сигнала пока недоступно.")}

${signal.campaign_name ? `

${escapeHtml(signal.campaign_name)}

` : ""}
`; }).join(""); container.querySelectorAll(".signal-details-btn").forEach((button) => { button.addEventListener("click", () => ns.openSignalModal(Number(button.dataset.signalIndex || 0))); }); }; ns.formatSignalDetails = function formatSignalDetails(signal, index) { const levelMeta = window.levelMeta || ((level) => ({ bg: "bg-blue-500 text-black", card: "border-blue-500/20 bg-blue-500/5", tag: level || "Наблюдение" })); const escapeHtml = window.escapeHtml || ((value) => String(value || "")); const meta = levelMeta(signal.level); const title = signal.title || signal.campaign_name || `Сигнал ${index + 1}`; const campaignName = signal.campaign_name || "Без привязки к кампании"; const shortText = signal.text || "Система заметила изменение, на которое стоит обратить внимание."; const levelTitle = signal.level === "red" ? "Требует внимания" : signal.level === "yellow" ? "Стоит проверить" : "Спокойный сигнал"; const situationText = signal.level === "red" ? "Есть признак, что реклама может терять результат или деньги прямо сейчас." : signal.level === "yellow" ? "Ситуация не критичная, но её лучше перепроверить до того, как она начнет мешать результату." : "Сигнал не выглядит критичным, но подсказывает, куда полезно посмотреть внимательнее."; const actions = signal.level === "red" ? [ "Откройте кампанию и проверьте текущее состояние показов и кликов.", "Посмотрите, не выключена ли кампания и хватает ли бюджета.", "Сверьте устройства, регионы и объявления, чтобы найти источник потерь." ] : signal.level === "yellow" ? [ "Проверьте кампанию и сравните текущие цифры с прошлым периодом.", "Посмотрите, не выросла ли цена клика и не снизился ли отклик.", "Если отклонение сохранится, разберите кампанию подробнее." ] : [ "Запомните этот сигнал как ориентир и проверьте кампанию в следующем цикле.", "Сравните устройства, регионы и объявления, чтобы понять, где можно улучшить результат." ]; return `
${levelTitle} Подробный разбор сигнала простым языком

Что произошло

${escapeHtml(title)}

${escapeHtml(campaignName)}

Что это значит

${escapeHtml(situationText)}

${escapeHtml(shortText)}

Что сделать первым

${actions.map((item, actionIndex) => `
${actionIndex + 1}

${escapeHtml(item)}

`).join("")}
`; }; ns.openSignalModal = function openSignalModal(index) { const state = window.state || {}; const signals = state.dashboard && Array.isArray(state.dashboard.signals) ? state.dashboard.signals : []; const signal = signals[index]; const body = document.getElementById("signal-modal-body"); if (!body || !signal) return; body.innerHTML = ns.formatSignalDetails(signal, index); if (typeof window.openModal === "function") { window.openModal("signal-modal"); } }; })();