Skip to content

Commit eac909b

Browse files
committed
Made columnFilter work with hidden columns
1 parent 5eb72ad commit eac909b

File tree

5 files changed

+64
-47
lines changed

5 files changed

+64
-47
lines changed

Mvc.JQuery.Datatables.Example/Controllers/HomeController.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,19 @@ public class UserView
6363

6464
[DataTables( Sortable = false)]
6565
public bool IsAdmin { get; set; }
66+
67+
[DataTables(Visible = false)]
68+
public bool AHiddenColumn { get; set; }
69+
70+
71+
[DataTables(Visible = false)]
72+
public decimal Salary { get; set; }
73+
6674
public string Position { get; set; }
6775
public DateTime? Hired { get; set; }
6876

6977
public Numbers Number { get; set; }
7078

71-
[DataTables(Visible = false)]
72-
public decimal Salary { get; set; }
79+
7380
}
7481
}

Mvc.JQuery.Datatables.Example/Views/Home/Index.cshtml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ public class SomeController : Controller
4646
<div style="padding: 5px; border: 1px solid grey">
4747
Custom placement for Position filter:
4848
<div id="custom-filter-placeholder-position"></div>
49+
Custom placement for hidden Salary filter:
50+
<div id="custom-filter-placeholder-salary"></div>
4951
</div>
5052

5153
@using Mvc.JQuery.Datatables
@@ -62,8 +64,10 @@ public class SomeController : Controller
6264
}
6365
}"));
6466
vm.ColumnFilter = true;
65-
vm.FilterOn("Position", new { sSelector = "#custom-filter-placeholder-position" }).Select("Engineer", "Tester", "Manager")
66-
.FilterOn("Id").NumberRange();
67+
vm
68+
.FilterOn("Position", new { sSelector = "#custom-filter-placeholder-position" }).Select("Engineer", "Tester", "Manager")
69+
.FilterOn("Id").NumberRange()
70+
.FilterOn("Salary", new { sSelector = "#custom-filter-placeholder-salary" }).NumberRange();
6771
//.FilterOn("Number").CheckBoxes(Enum.GetNames(typeof(Numbers)));
6872
vm.StateSave = true;
6973
//vm.DrawCallback = "drawCallback";

Mvc.JQuery.Datatables.Templates/Content/jquery.dataTables.columnFilter.js

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,8 @@
589589

590590
if (!oTable.fnSettings().oFeatures.bFilter)
591591
return;
592+
593+
592594
asInitVals = new Array();
593595
var sFilterRow = "tfoot tr";
594596
if (properties.sPlaceHolder == "head:after") {
@@ -611,9 +613,13 @@
611613
}
612614
sFilterRow = "thead tr:first";
613615
}
614-
615-
$(sFilterRow + " th", oTable).each(function (index) {
616+
var tableColumnDefs = oTable.fnSettings().aoColumns;
617+
var row = $(sFilterRow + " th", oTable);
618+
var thIndex = -1;
619+
$(tableColumnDefs).each(function (index) {
616620
i = index;
621+
622+
617623
var aoColumn = {
618624
type: "text",
619625
bRegex: false,
@@ -625,25 +631,27 @@
625631
return;
626632
aoColumn = properties.aoColumns[i];
627633
}
628-
label = $(this).text(); //"Search by " + $(this).text();
629-
if (aoColumn.sSelector == null)
630-
th = $($(this)[0]);
631-
else {
634+
635+
636+
if (this.bVisible) {
637+
thIndex++;
638+
} else {
639+
if (aoColumn.sSelector == null) return; //if hidden column and sSelector is empty
640+
}
641+
th = $(row[thIndex]);
642+
if (aoColumn.sSelector != null) {
632643
th = $(aoColumn.sSelector);
633-
if (th.length == 0)
634-
th = $($(this)[0]);
635644
}
645+
label = th.text(); //"Search by " + $(this).text();
646+
636647

637648
if (aoColumn != null) {
638-
if (aoColumn.sRangeFormat != null)
639-
sRangeFormat = aoColumn.sRangeFormat;
640-
else
641-
sRangeFormat = properties.sRangeFormat
649+
sRangeFormat = aoColumn.sRangeFormat != null ? aoColumn.sRangeFormat : properties.sRangeFormat;
650+
642651
switch (aoColumn.type) {
643652
case "number":
644653
fnCreateInput(oTable, true, false, true, aoColumn.iFilterLength);
645654
break;
646-
647655
case "select":
648656
fnCreateSelect(oTable, aoColumn.values);
649657
break;
@@ -662,17 +670,17 @@
662670
bSmart = (aoColumn.bSmart == null ? false : aoColumn.bSmart);
663671
fnCreateInput(oTable, bRegex, bSmart, false, aoColumn.iFilterLength);
664672
break;
665-
666673
}
667674
}
668-
});
669675

676+
});
677+
670678
for (j = 0; j < aiCustomSearch_Indexes.length; j++) {
671679
//var index = aiCustomSearch_Indexes[j];
672680
var fnSearch_ = function () {
673681
var id = oTable.attr("id");
674682
return $("#" + id + "_range_from_" + aiCustomSearch_Indexes[j]).val() + properties.sRangeSeparator + $("#" + id + "_range_to_" + aiCustomSearch_Indexes[j]).val()
675-
}
683+
};
676684
afnSearch_.push(fnSearch_);
677685
}
678686

Mvc.JQuery.Datatables.Templates/Views/Shared/DataTable.cshtml

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
@model DataTableConfigVm
55
<table id="@Model.Id" class="display @(Model.TableClass ?? DataTableConfigVm.DefaultTableClass ?? "")" >
66
<thead>
7-
@if (Model.ColumnFilter && Model.Columns.Any(c => c.Visible && c.Filter != null))
7+
@if (Model.ColumnFilter)
88
{
99
<tr>
1010
@foreach (var column in Model.Columns)
1111
{
12-
<th></th>
12+
<th>@column.DisplayName</th>
1313
}
1414
</tr>
1515
}
@@ -75,10 +75,7 @@
7575
@if (Model.ColumnFilter)
7676
{
7777
<text>
78-
dt.columnFilter({
79-
sPlaceHolder: "head:after",
80-
aoColumns: @Html.Raw(Model.ColumnFiltersString)
81-
});
78+
dt.columnFilter(@Html.Raw(Model.ColumnFilterVm.ToString()));
8279
</text>
8380
}
8481
})();

Mvc.JQuery.Datatables/DataTableConfigVm.cs

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ public DataTableConfigVm(string id, string ajaxUrl, IEnumerable<ColDef> columns)
7474
this.ShowSearch = true;
7575
this.ShowPageSizes = true;
7676
this.TableTools = true;
77+
ColumnFilterVm = new ColumnFilterSettingsVm(this);
7778
}
7879

7980
public bool ShowSearch { get; set; }
@@ -101,30 +102,15 @@ public string ColumnDefsString
101102
return convertColumnDefsToJson(Columns);
102103
}
103104
}
105+
public bool ColumnFilter { get; set; }
104106

105-
public bool ColumnFilter
106-
{
107-
get { return _columnFilter; }
108-
set {
109-
_columnFilter = value;
110-
if (value)
111-
{
112-
foreach (var column in Columns.Where(c => c.Searchable == false))
113-
{
114-
this.FilterOn(column.Name).None();
115-
}
116-
}
117-
}
118-
}
107+
public ColumnFilterSettingsVm ColumnFilterVm { get; set; }
119108

120109
public bool TableTools { get; set; }
121110

122111
public bool AutoWidth { get; set; }
123112

124-
public string ColumnFiltersString
125-
{
126-
get { return new JavaScriptSerializer().Serialize(Columns.Select(c => c.Filter).ToArray()); }
127-
}
113+
128114

129115
public string Dom
130116
{
@@ -299,8 +285,23 @@ private static IDictionary<string, object> convertObjectToDictionary(object obj)
299285
}
300286
}
301287

302-
public class FilterRuleList : List<Func<string, Type, string>>
288+
public class ColumnFilterSettingsVm : Hashtable
303289
{
304-
305-
}
290+
private readonly DataTableConfigVm _vm;
291+
292+
public ColumnFilterSettingsVm(DataTableConfigVm vm)
293+
{
294+
_vm = vm;
295+
this["sPlaceHolder"] = "head:after";
296+
}
297+
298+
public override string ToString()
299+
{
300+
this["aoColumns"] = _vm.Columns
301+
//.Where(c => c.Visible || c.Filter["sSelector"] != null)
302+
.Select(c => c.Filter).ToArray();
303+
return new JavaScriptSerializer().Serialize(this);
304+
}
305+
}
306+
306307
}

0 commit comments

Comments
 (0)