بنقرة واحدة
frontend-stats-from-data
Подсчёт индикаторов/статистики на фронте из загруженных данных вместо отдельного API-запроса
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Подсчёт индикаторов/статистики на фронте из загруженных данных вместо отдельного API-запроса
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Динамический LdapTemplate из БД + шифрование пароля + отключение авто-LDAP для безопасного старта без AD
Экспорт Excel с фильтром по датам — использование Thymeleaf inline для передачи дат из формы в JS
Полный цикл синхронизации справочника из Active Directory — сброс структуры, сохранение порядка, блокирующий код в WebFlux
Feature-флаг в БД (app_settings) с UI-тумблером на странице профиля
Парсинг Distinguished Name из Active Directory, извлечение OU-цепочки, правила маппинга на Department/Division и блокирующие вызовы в WebFlux
Разрешение конфликта Spring Data LDAP + R2DBC — strict mode, @Table на все entity, отключение LDAP-репозиториев
| name | frontend-stats-from-data |
| description | Подсчёт индикаторов/статистики на фронте из загруженных данных вместо отдельного API-запроса |
| source | auto-skill |
| extracted_at | 2026-06-08T11:00:00.000Z |
Вместо отдельного API-запроса для статистики (количество систем, активных/неактивных и т.д.) — считать из данных, которые уже загружены для отображения. Это гарантирует, что индикаторы всегда отражают то, что реально показано пользователю.
function updateStats(data) {
var systems = data ? data.length : 0;
var total = 0, active = 0, inactive = 0;
if (data) {
for (var i = 0; i < data.length; i++) {
var items = data[i].employees || data[i].items || [];
total += items.length;
for (var j = 0; j < items.length; j++) {
if (items[j].status === 'ACTIVE') active++;
else inactive++;
}
}
}
document.getElementById('statSystems').textContent = systems;
document.getElementById('statTotal').textContent = total;
document.getElementById('statActive').textContent = active;
document.getElementById('statInactive').textContent = inactive;
}
<div class="d-flex gap-3 mt-3 flex-wrap px-3 pb-3" id="statsIndicators">
<div class="stat-summary-card flex-grow-1" style="min-width:140px;">
<div class="stat-summary-card__header">Количество систем</div>
<div class="stat-summary-card__body"><div class="stat-total" id="statSystems">—</div></div>
</div>
<!-- ещё 3 карточки аналогично -->
</div>
function loadData() {
fetch(url).then(r => r.json()).then(data => {
// Сначала фильтрация (чекбоксы, etc)
data = applyFilters(data);
// Затем статистика ИЗ ТЕХ ЖЕ ДАННЫХ
updateStats(data);
// Затем рендеринг
renderGrid(data);
});
}
/statsCOUNT(*) эффективнее