${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");
}
};
})();