From 53997ad861faaea72e1373415a4ccdc09c478b21 Mon Sep 17 00:00:00 2001 From: igor04091968 Date: Sat, 6 Jun 2026 15:28:29 +0300 Subject: [PATCH] fix(portal): align deployed role smoke and screenshot --- .../crates/detmir-portal/src/static/app.js | 41 +++++++----------- ansible/deploy_detmir_portal.yml | 1 + docs/screenshots/07-product-architecture.png | Bin 216454 -> 216557 bytes scripts/detmir-portal-tabs-smoke.mjs | 8 +++- 4 files changed, 24 insertions(+), 26 deletions(-) diff --git a/adk-rust/crates/detmir-portal/src/static/app.js b/adk-rust/crates/detmir-portal/src/static/app.js index 3d7c959..7830fd0 100644 --- a/adk-rust/crates/detmir-portal/src/static/app.js +++ b/adk-rust/crates/detmir-portal/src/static/app.js @@ -261,27 +261,6 @@ function setViewMode(mode) { setTab("operator"); return; } - if (state.operatorData && state.reports) { - const content = document.getElementById("content"); - if (content) { - content.innerHTML = renderOperator(state.operatorData, state.reports, { cases: state.cases }); - } - setLoadStatus("READY", "Данные готовы", 100); - consumePendingScroll(); - if (mode === "security" && !state.cases) { - loadJson("/cases") - .then(cases => { - state.cases = cases; - if (currentViewMode() === "security" && state.tab === "operator" && content) { - content.innerHTML = renderOperator(state.operatorData, state.reports, { cases: state.cases }); - } - }) - .catch(() => { - state.cases = { ok: false, cases: [] }; - }); - } - return; - } refresh({ stage: VIEW_MODES[mode].stage }); } @@ -479,7 +458,11 @@ function hasTabData(tab, payload) { const report = payload.report || {}; return (Array.isArray(report.kpis) && report.kpis.length > 0) || (Array.isArray(report.executive_points) && report.executive_points.length > 0) - || (Array.isArray(payload.data?.workforce) && payload.data.workforce.length > 0); + || (Array.isArray(payload.data?.workforce) && payload.data.workforce.length > 0) + || Boolean(report.workforce && Object.keys(report.workforce).length > 0) + || Boolean(report.security_events_summary) + || (Array.isArray(report.risk_incident_candidates) && report.risk_incident_candidates.length > 0) + || (Array.isArray(report.forensics?.investigations) && report.forensics.investigations.length > 0); } if (tab === "employees") { return Array.isArray(payload.data?.workforce) && payload.data.workforce.length > 0; @@ -2313,6 +2296,14 @@ function renderSecurityEventsSummary(summary, options = {}) { const title = options.compact ? "События безопасности" : "События безопасности за 24 часа"; + const compactStateText = disabled && options.compact + ? "Детализация скрыта для роли" + : stateText; + const compactModeText = disabled && options.compact + ? "Без ИБ-детализации" + : disabled + ? localModeText + : "Агрегированная сводка"; const subtitle = disabled ? `${stateText}. ${localModeText}.` : fallback @@ -2328,14 +2319,14 @@ function renderSecurityEventsSummary(summary, options = {}) {

${ui(title)}

-

${ui(stateText)}

+

${ui(compactStateText)}

${ui(status)}
-
Состояние${ui(stateText)}
+
Состояние${ui(compactStateText)}
Событий за 24 часа${ui(s.events_24h ?? 0)}
-
Режим${ui(disabled ? localModeText : "Агрегированная сводка")}
+
Режим${ui(compactModeText)}
`; diff --git a/ansible/deploy_detmir_portal.yml b/ansible/deploy_detmir_portal.yml index f5d9b1b..9eb46b2 100644 --- a/ansible/deploy_detmir_portal.yml +++ b/ansible/deploy_detmir_portal.yml @@ -200,6 +200,7 @@ method: GET status_code: 200 return_content: true + timeout: 90 register: detmir_portal_reports failed_when: > detmir_portal_reports.status != 200 diff --git a/docs/screenshots/07-product-architecture.png b/docs/screenshots/07-product-architecture.png index afdbf1b8fc6906c3eb35026e6543a982ebf5c787..7168b1d3c025cded3054f31b31e552aa535d34ce 100644 GIT binary patch delta 88 zcmZph&HHvX?*wr!2M#6%Ajm6fXjE)fWNcMr+N#K0ePR86(KVn5gQu&X%Q~loCIFgV9OM81 diff --git a/scripts/detmir-portal-tabs-smoke.mjs b/scripts/detmir-portal-tabs-smoke.mjs index 3823b45..78160cf 100644 --- a/scripts/detmir-portal-tabs-smoke.mjs +++ b/scripts/detmir-portal-tabs-smoke.mjs @@ -261,11 +261,17 @@ async function main() { && (await page.locator('[data-view-mode="admin"]').count()) === 1, }); const expectedSecurityText = expectedSecurityEventsText(securityMode); + const executiveSecurityTextOk = securityMode === "available" + ? containsText(readyBodyText, "События безопасности") + && containsText(readyBodyText, "Событий за 24 часа") + && !containsText(readyBodyText, "События безопасности временно недоступны") + && !containsText(readyBodyText, "Источник событий безопасности отключён") + : containsText(readyBodyText, expectedSecurityText); checks.push({ name: "security_events_executive_text", ok: !expectedSecurityText - || (containsText(readyBodyText, expectedSecurityText) + || (executiveSecurityTextOk && !containsText(readyBodyText, "SECURITY_EVENTS_BACKEND") && !containsText(readyBodyText, "CLICKHOUSE_*") && !containsText(readyBodyText, "ClickHouse")),