Reputation: 789
I need help how to manage multiple filter for panels. I want to search on more than one field, but to keep filters. Example: I wright Panel still be shown all panels where panel-heading has text panel, but in second input if I write Test should be shown only panels which has in body Test ?
$("#srcPanelHeading").keyup(function () {
var panels = $('.panel-info');
var val = this.value.toLowerCase();
panels.show().filter(function () {
var panelHeadingText = $(this).find('.panel-heading').text().toLowerCase();
return panelHeadingText.indexOf(val) < 0;
}).hide();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js" integrity="sha384-b/U6ypiBEHpOf/4+1nzFpr53nxSS+GLCkfwBdFNTxtclqqenISfwAzpKaMNFNmj4" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/js/bootstrap.min.js" integrity="sha384-h0AbiXch4ZDo7tp9hKZ4TsHbi047NrKGLO3SEJAg45jXxnGIfYzk4Si90RDIqNm1" crossorigin="anonymous"></script>
Panel Heading: <input type="text" class="form-control" id="srcPanelHeading" />
Panel Body: <input type="text" class="form-control" id="srcPanelBody"/>
<div class="panel panel-info">
<div class="panel-heading">Panel 1</div>
<div class="panel-body">
Test
</div>
</div>
<div class="panel panel-info">
<div class="panel-heading">Panel 2</div>
<div class="panel-body">
Something to read
</div>
</div>
<div class="panel panel-info">
<div class="panel-heading">Test 3</div>
<div class="panel-body">
Test
</div>
</div>
<div class="panel panel-info">
<div class="panel-heading">Panel 4</div>
<div class="panel-body">
Test
</div>
</div>
Upvotes: 0
Views: 82
Reputation: 12544
The filter can be combined in a single handler. The below uses a helper function which creates a filter for each input and applies each after the other:
$("#srcPanelHeading, #srcPanelBody").keyup(function () {
var getFilter = function(el, selector){
var txt = $(el).val().toLowerCase();
return txt
? function(i,p){ return $(p).find(selector).text().toLowerCase().indexOf(txt) !== -1;}
: function(i,p){return true;};
};
$('.panel-info').hide()
.filter(getFilter('#srcPanelHeading', '.panel-heading'))
.filter(getFilter('#srcPanelBody', '.panel-body'))
.show();
});
.panel{
border:1px solid gray;
}
.panel-heading{
font-style:italic;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js" integrity="sha384-b/U6ypiBEHpOf/4+1nzFpr53nxSS+GLCkfwBdFNTxtclqqenISfwAzpKaMNFNmj4" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/js/bootstrap.min.js" integrity="sha384-h0AbiXch4ZDo7tp9hKZ4TsHbi047NrKGLO3SEJAg45jXxnGIfYzk4Si90RDIqNm1" crossorigin="anonymous"></script>
Panel Heading: <input type="text" class="form-control" id="srcPanelHeading" />
Panel Body: <input type="text" class="form-control" id="srcPanelBody"/>
<div class="panel panel-info">
<div class="panel-heading">Panel 1</div>
<div class="panel-body">
Test
</div>
</div>
<div class="panel panel-info">
<div class="panel-heading">Panel 2</div>
<div class="panel-body">
Something to read
</div>
</div>
<div class="panel panel-info">
<div class="panel-heading">Test 3</div>
<div class="panel-body">
Test
</div>
</div>
<div class="panel panel-info">
<div class="panel-heading">Panel 4</div>
<div class="panel-body">
Test
</div>
</div>
Upvotes: 1
Reputation: 678
On typing 'test' in the second input, you will get panel1,3,5 which as 'test' text in it and on typing 'something', you'll get panel2,5.
Is this what you asked?
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js" integrity="sha384-b/U6ypiBEHpOf/4+1nzFpr53nxSS+GLCkfwBdFNTxtclqqenISfwAzpKaMNFNmj4" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/js/bootstrap.min.js" integrity="sha384-h0AbiXch4ZDo7tp9hKZ4TsHbi047NrKGLO3SEJAg45jXxnGIfYzk4Si90RDIqNm1" crossorigin="anonymous"></script>
Panel Heading: <input type="text" class="form-control" id="srcPanelHeading" />
Panel Body: <input type="text" class="form-control" id="srcPanelBody"/>
<div class="panel panel-info">
<div class="panel-heading">Panel 1</div>
<div class="panel-body">
Test1
</div>
</div>
<div class="panel panel-info">
<div class="panel-heading">Panel 2</div>
<div class="panel-body">
Something to read
</div>
</div>
<div class="panel panel-info">
<div class="panel-heading">Panel 3</div>
<div class="panel-body">
Test3
</div>
</div>
<div class="panel panel-info">
<div class="panel-heading">Panel 4</div>
<div class="panel-body">
Something to read
</div>
</div>
<div class="panel panel-info">
<div class="panel-heading">Panel 5</div>
<div class="panel-body">
Test5
</div>
</div>
<script>
$("#srcPanelHeading").keyup(function () {
var panels = $('.panel-info');
var val = this.value.toLowerCase();
panels.show().filter(function () {
var panelHeadingText = $(this).find('.panel-heading').text().toLowerCase();
return panelHeadingText.indexOf(val) < 0;
}).hide();
});
$("#srcPanelBody").keyup(function () {
var panels = $('.panel-info');
var val = this.value.toLowerCase();
panels.show().filter(function () {
var panelHeadingText = $(this).find('.panel-body').text().toLowerCase();
return panelHeadingText.indexOf(val) < 0;
}).hide();
});
</script>
Upvotes: 0