добавил фильтр по вендорам
This commit is contained in:
parent
c0ac1154d3
commit
7939b5cc05
@ -26,3 +26,7 @@ up to date in 362ms
|
|||||||
|
|
||||||
up to date in 437ms
|
up to date in 437ms
|
||||||
Сервер запущен на порту 3000
|
Сервер запущен на порту 3000
|
||||||
|
--- run Wed Aug 19 06:55:48 AM UTC 2026 :: npm start --silent
|
||||||
|
|
||||||
|
up to date in 346ms
|
||||||
|
Сервер запущен на порту 3000
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
2218
|
2598
|
||||||
|
|||||||
65
index.html
65
index.html
@ -49,6 +49,28 @@
|
|||||||
background: #fff;
|
background: #fff;
|
||||||
}
|
}
|
||||||
.filters input { flex: 1; min-width: 200px; }
|
.filters input { flex: 1; min-width: 200px; }
|
||||||
|
.vendor-filter {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 8px;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.vendor-chip {
|
||||||
|
padding: 6px 14px;
|
||||||
|
border-radius: 20px;
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: 600;
|
||||||
|
cursor: pointer;
|
||||||
|
background: #f0f0f0;
|
||||||
|
color: #555;
|
||||||
|
border: 2px solid transparent;
|
||||||
|
transition: all 0.2s;
|
||||||
|
}
|
||||||
|
.vendor-chip.active {
|
||||||
|
background: #e3f2fd;
|
||||||
|
border-color: #1e3c72;
|
||||||
|
color: #1e3c72;
|
||||||
|
}
|
||||||
.chip {
|
.chip {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
padding: 6px 14px;
|
padding: 6px 14px;
|
||||||
@ -159,7 +181,11 @@
|
|||||||
<select id="filter-city"><option value="">Все</option></select>
|
<select id="filter-city"><option value="">Все</option></select>
|
||||||
<label>Уровень:</label>
|
<label>Уровень:</label>
|
||||||
<div id="filter-levels"></div>
|
<div id="filter-levels"></div>
|
||||||
<button class="export-btn" onclick="exportCsv()">📥 Выгрузить в Excel</button>
|
</div>
|
||||||
|
<div class="filters" style="padding-top: 10px; padding-bottom: 10px;">
|
||||||
|
<label>🏷️ Вендоры:</label>
|
||||||
|
<div class="vendor-filter" id="filter-vendors"></div>
|
||||||
|
<button class="export-btn" onclick="exportCsv()" style="margin-left: auto;">📥 Выгрузить в Excel</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="charts-row">
|
<div class="charts-row">
|
||||||
@ -199,7 +225,12 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
const allData = [
|
let allData = [];
|
||||||
|
let filteredData = [];
|
||||||
|
let selectedLevels = new Set();
|
||||||
|
let selectedVendors = new Set();
|
||||||
|
|
||||||
|
const allDataRaw = [
|
||||||
{"id": 1, "city": "Астана", "name": "Әжібек Айбек Тұрғанбекұлы", "position": "Ведущий инженер службы оперативного контроля 1 уровня г.Астана", "vendor": "Cisco", "certificate": "Cisco Certified Network Associate (CCNA)", "level": "Специалист"},
|
{"id": 1, "city": "Астана", "name": "Әжібек Айбек Тұрғанбекұлы", "position": "Ведущий инженер службы оперативного контроля 1 уровня г.Астана", "vendor": "Cisco", "certificate": "Cisco Certified Network Associate (CCNA)", "level": "Специалист"},
|
||||||
{"id": 2, "city": "Астана", "name": "Абдрахманова Гаухар Нигметовна", "position": "Ведущий инженер службы оперативного контроля 1 уровня г.Астана", "vendor": "Juniper", "certificate": "Juniper Networks Certified Internetwork Associate (JNCIA)", "level": "Специалист"},
|
{"id": 2, "city": "Астана", "name": "Абдрахманова Гаухар Нигметовна", "position": "Ведущий инженер службы оперативного контроля 1 уровня г.Астана", "vendor": "Juniper", "certificate": "Juniper Networks Certified Internetwork Associate (JNCIA)", "level": "Специалист"},
|
||||||
{"id": 3, "city": "Алматы", "name": "АБДУГАППАРОВ МАКСАТ КАЛДЫБЕКОВИЧ", "position": "Гл. менеджер СТПСР 3 уровня г.Алматы", "vendor": "Red Hat", "certificate": "Red Hat Certified System Administrator", "level": "Профессионал"},
|
{"id": 3, "city": "Алматы", "name": "АБДУГАППАРОВ МАКСАТ КАЛДЫБЕКОВИЧ", "position": "Гл. менеджер СТПСР 3 уровня г.Алматы", "vendor": "Red Hat", "certificate": "Red Hat Certified System Administrator", "level": "Профессионал"},
|
||||||
@ -328,10 +359,10 @@
|
|||||||
{"id": 129, "city": "Алматы", "name": "Касымжанов Жарас Жастарович", "position": "Главный менеджер СТПСР 3 г.Алматы", "vendor": "Juniper", "certificate": "Juniper Networks Certified Professional Data Center (JNCIP-DC)", "level": "Профессионал"},
|
{"id": 129, "city": "Алматы", "name": "Касымжанов Жарас Жастарович", "position": "Главный менеджер СТПСР 3 г.Алматы", "vendor": "Juniper", "certificate": "Juniper Networks Certified Professional Data Center (JNCIP-DC)", "level": "Профессионал"},
|
||||||
{"id": 130, "city": "Алматы", "name": "Ыдыят Бауыржан Нзамдинұлы", "position": "Старший аналитик службы оперативного контроля 1 уровня г.Алматы", "vendor": "Juniper", "certificate": "Junos, Associate (JNCIA-Junos)", "level": "Специалист"}
|
{"id": 130, "city": "Алматы", "name": "Ыдыят Бауыржан Нзамдинұлы", "position": "Старший аналитик службы оперативного контроля 1 уровня г.Алматы", "vendor": "Juniper", "certificate": "Junos, Associate (JNCIA-Junos)", "level": "Специалист"}
|
||||||
];
|
];
|
||||||
let filteredData = [...allData];
|
|
||||||
let selectedLevels = new Set();
|
|
||||||
|
|
||||||
function load() {
|
function load() {
|
||||||
|
allData = allDataRaw;
|
||||||
|
filteredData = [...allData];
|
||||||
initFilters();
|
initFilters();
|
||||||
render();
|
render();
|
||||||
}
|
}
|
||||||
@ -357,6 +388,16 @@
|
|||||||
chip.onclick = () => toggleLevel(l, chip);
|
chip.onclick = () => toggleLevel(l, chip);
|
||||||
levelsContainer.appendChild(chip);
|
levelsContainer.appendChild(chip);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const vendors = [...new Set(allData.map(d => d.vendor))].filter(v => v).sort();
|
||||||
|
const vendorsContainer = document.getElementById('filter-vendors');
|
||||||
|
vendors.forEach(v => {
|
||||||
|
const chip = document.createElement('span');
|
||||||
|
chip.className = 'vendor-chip';
|
||||||
|
chip.textContent = v;
|
||||||
|
chip.onclick = () => toggleVendor(v, chip);
|
||||||
|
vendorsContainer.appendChild(chip);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function toggleLevel(level, chip) {
|
function toggleLevel(level, chip) {
|
||||||
@ -370,6 +411,17 @@
|
|||||||
applyFilters();
|
applyFilters();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function toggleVendor(vendor, chip) {
|
||||||
|
if (selectedVendors.has(vendor)) {
|
||||||
|
selectedVendors.delete(vendor);
|
||||||
|
chip.classList.remove('active');
|
||||||
|
} else {
|
||||||
|
selectedVendors.add(vendor);
|
||||||
|
chip.classList.add('active');
|
||||||
|
}
|
||||||
|
applyFilters();
|
||||||
|
}
|
||||||
|
|
||||||
function applyFilters() {
|
function applyFilters() {
|
||||||
const search = document.getElementById('search').value.toLowerCase();
|
const search = document.getElementById('search').value.toLowerCase();
|
||||||
const city = document.getElementById('filter-city').value;
|
const city = document.getElementById('filter-city').value;
|
||||||
@ -382,7 +434,8 @@
|
|||||||
(d.vendor && d.vendor.toLowerCase().includes(search));
|
(d.vendor && d.vendor.toLowerCase().includes(search));
|
||||||
const matchCity = !city || d.city === city;
|
const matchCity = !city || d.city === city;
|
||||||
const matchLevel = selectedLevels.size === 0 || selectedLevels.has(d.level);
|
const matchLevel = selectedLevels.size === 0 || selectedLevels.has(d.level);
|
||||||
return matchSearch && matchCity && matchLevel;
|
const matchVendor = selectedVendors.size === 0 || selectedVendors.has(d.vendor);
|
||||||
|
return matchSearch && matchCity && matchLevel && matchVendor;
|
||||||
});
|
});
|
||||||
render();
|
render();
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user