Nested Checkboxes
HTML
<script src="//code.jquery.com/jquery-3.3.1.slim.min.js"></script>
<link rel="stylesheet" href="//stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
<script src="//cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
<script src="//stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
<ul class="nav" id="sidebar">
<li class="nav-item">
<input type="checkbox" class="check-negozio" data-npv="0" value="0">
<a class="nav-link text-truncate collapsed" href="#" data-toggle="collapse" data-target="#pv0" aria-expanded="false">
<i class="fas fa-store"></i>
<span class="d-none d-sm-inline">PC-STEVE</span>
</a>
<ul class="flex-column pl-2 collapse" id="pv0" aria-expanded="false" style="">
<li class="nav-item">
<input type="checkbox" class="check-cassa" data-cs="1" value="1">
<a class="nav-link py-0" href="#">
<i class="fas fa-desktop"></i>
<span>CASSA-1</span>
</a>
</li>
<li class="nav-item">
<input type="checkbox" class="check-cassa" data-cs="5" value="5">
<a class="nav-link collapsed py-1" href="#" data-toggle="collapse" data-target="#cs05">
<i class="fas fa-desktop"></i>
<span>CASSA-5</span>
</a>
<ul class="flex-column pl-4 collapse" id="cs05" aria-expanded="false">
<li class="nav-item">
<input type="checkbox" class="check-operatore" data-op="0" value="0">
<a class="nav-link p-1" href="#">
<i class="far fa-user"></i>
<span>N. OPERATORE</span>
</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="nav-item">
<input type="checkbox" class="check-negozio" data-npv="1" value="1">
<a class="nav-link collapsed text-truncate" href="#" data-toggle="collapse" data-target="#pv1">
<i class="fas...
CSS
.card-pareto{
padding-left: 0px !important;
padding-right: 0px !important;
}
.pagination{
margin-right: 15px !important;
}
.nav-link[data-toggle].collapsed:after {
font-size: 12px;
margin-left: 3px;
content: "▾";
}
.nav-link[data-toggle]:not(.collapsed):after {
font-size: 12px;
margin-left: 3px;
content: "▴";
}
hr {
position: absolute;
right: 15px;
width: calc(100% - 30px);
background: hsla(0,0%,100%,.5);
}
.check-negozio {
z-index: 999;
margin-top: 13px;
margin-left: 9px;
position: absolute;
}
.check-cassa {
z-index: 999;
margin-top: 2px;
margin-left: 9px;
position: absolute;
}
.check-operatore {
z-index: 999;
margin-top: 5px;
margin-left: 9px;
position: absolute;
}
ul ul ul {
list-style: none;
}
ul ul {
list-style: none;
}
JavaScript
var config = [];
$(".nav").on("change", "input[type='checkbox']", function () {
var checked = $(this).prop("checked"),
container = $(this).parent();
container.find('input[type="checkbox"]').prop({
indeterminate: false,
checked: checked
});
function checkSiblings(el) {
var parent = el.parent().parent(),
all = true;
el.siblings().each(function () {
let returnValue = all = ($(this).children('input[type="checkbox"]').prop("checked") === checked);
return returnValue;
});
if (all && checked) {
parent.children('input[type="checkbox"]').prop({
indeterminate: false,
checked: checked
});
checkSiblings(parent);
} else if (all && !checked) {
parent.children('input[type="checkbox"]').prop("checked", checked);
parent.children('input[type="checkbox"]').prop("indeterminate", (parent.find('input[type="checkbox"]:checked').length > 0));
checkSiblings(parent);
} else {
el.parents("li").children('input[type="checkbox"]').prop({
indeterminate: true,
checked: false
});
}
}
checkSiblings(container);
var selezione = {
cassa: [{
operatore: []
}]
};
$(".check-negozio").each(function () {
if (this.checked || this.indeterminate) {
const npv = $(this).attr('data-npv');
if (npv != null)
selezione.negozio = npv;
$(".check-cassa").each(function () {
if (this.checked || this.indeterminate) {
const cs = $(this).attr('data-cs');
if (cs != null)
selezione.cassa.push({ CS: cs });
$(".check-operatore").each(function () {
if (this.chedked) {
...