원클릭으로
bootstrap-multiselect-dropdown
Мультиселект-дропдаун с чекбоксами на Bootstrap — загрузка, фильтрация, отображение выбранного
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Мультиселект-дропдаун с чекбоксами на Bootstrap — загрузка, фильтрация, отображение выбранного
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 | bootstrap-multiselect-dropdown |
| description | Мультиселект-дропдаун с чекбоксами на Bootstrap — загрузка, фильтрация, отображение выбранного |
| source | auto-skill |
| extracted_at | 2026-06-08T11:00:00.000Z |
Замена стандартному <select multiple> — кнопка-дропдаун с чекбоксами внутри, AJAX-загрузка списка, клиентская фильтрация.
<div class="dropdown w-100">
<button class="btn btn-outline-secondary w-100 text-start dropdown-toggle d-flex justify-content-between align-items-center"
type="button" id="dropdownBtn" data-bs-toggle="dropdown"
style="border:1px solid #dee2e6; border-radius:0.375rem;">
<span class="text-truncate">Все</span>
</button>
<ul class="dropdown-menu px-2" id="checkList"
style="min-width:350px;max-height:250px;overflow-y:auto;"
onclick="event.stopPropagation()">
<li class="text-muted text-center py-1">Загрузка...</li>
</ul>
</div>
Ключевые моменты:
onclick="event.stopPropagation()" — чтобы клик по чекбоксу не закрывал дропдаунmin-width:350px — достаточно широко, без горизонтальной прокруткиmax-height + overflow-y:auto — вертикальная прокрутка при большом спискеfunction loadList() {
fetch('/api/items?filter=' + filterValue)
.then(r => r.json())
.then(data => {
var html = '';
data.forEach(item => {
html += `<li class="dropdown-item" style="cursor:default;">
<label class="w-100 mb-0" style="cursor:pointer;">
<input type="checkbox" value="${item.name}" onchange="onCheckChange()" class="me-2">
${item.name}
</label></li>`;
});
document.getElementById('checkList').innerHTML = html || '<li class="text-muted text-center py-1">Нет данных</li>';
onCheckChange();
});
}
function onCheckChange() {
var checked = [];
document.querySelectorAll('#checkList input[type="checkbox"]:checked')
.forEach(cb => checked.push(cb.value));
var span = document.querySelector('#dropdownBtn span');
if (checked.length === 0) span.textContent = 'Все';
else if (checked.length <= 2) span.textContent = checked.join(', ');
else span.textContent = 'Выбрано: ' + checked.length;
filterData(); // обновить отображаемые данные
}
function getSelectedNames() {
return [...document.querySelectorAll('#checkList input[type="checkbox"]:checked')]
.map(cb => cb.value);
}
function filterData() {
var selected = getSelectedNames();
if (selected.length > 0) {
data = data.filter(item => selected.includes(item.name));
}
renderData(data);
}
<select multiple> выглядит недостаточно стильно