Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion Mvc.JQuery.Datatables.Example/Views/Home/Index.cshtml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@ can also use

<h1>Voila</h1>

<div style="padding: 5px; border: 1px solid grey">
Custom placement for Position filter:
<div id="custom-filter-placeholder-position"></div>
</div>

@using Mvc.JQuery.Datatables
@using Mvc.JQuery.Datatables.Example.Controllers
Expand All @@ -56,7 +60,7 @@ can also use
//vm.JsOptions.Add("iDisplayLength", 25);
//vm.JsOptions.Add("aLengthMenu", new object[] { new[] {5, 10, 25, 250, -1} , new object[] { 5, 10, 25, 250, "All"} });
vm.ColumnFilter = true;
vm.FilterOn("Position").Select("Engineer", "Tester", "Manager")
vm.FilterOn("Position", new { sSelector = "#custom-filter-placeholder-position" }).Select("Engineer", "Tester", "Manager")
.FilterOn("Id").NumberRange();
//.FilterOn("Number").CheckBoxes(Enum.GetNames(typeof(Numbers)));
}
Expand All @@ -69,3 +73,5 @@ can also use





39 changes: 34 additions & 5 deletions Mvc.JQuery.Datatables/DataTableVm.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Routing;
using System.Web.Script.Serialization;

namespace Mvc.JQuery.Datatables
Expand Down Expand Up @@ -54,7 +55,9 @@ public string JsOptionsString
{
get
{
return (new JavaScriptSerializer()).Serialize((object)JsOptions).TrimStart('{').TrimEnd('}');
// Doing this way to ensure Dictionary will be converted to Json in correct format
var optionsDict = new Dictionary<string, object>(JsOptions);
return (new JavaScriptSerializer()).Serialize((object)optionsDict).TrimStart('{').TrimEnd('}');
}
}

Expand Down Expand Up @@ -111,12 +114,14 @@ public class _FilterOn<TTarget>
private readonly TTarget _target;
private readonly FilterRuleList _list;
private readonly Func<string, Type, bool> _predicate;
private readonly IDictionary<string, object> _jsOptions;

public _FilterOn(TTarget target, FilterRuleList list, Func<string, Type, bool> predicate)
public _FilterOn(TTarget target, FilterRuleList list, Func<string, Type, bool> predicate, IDictionary<string, object> jsOptions)
{
_target = target;
_list = list;
_predicate = predicate;
_jsOptions = jsOptions;
}

public TTarget Select(params string[] options)
Expand Down Expand Up @@ -158,18 +163,42 @@ public TTarget None()

private void AddRule(string result)
{
if (this._jsOptions != null && this._jsOptions.Count > 0)
{
var _jsOptionsAsJson = (new JavaScriptSerializer()).Serialize((object)this._jsOptions).TrimStart('{').TrimEnd('}');
result = result.TrimEnd('}') + ", " + _jsOptionsAsJson + "}";
}
_list.Insert(0, (c, t) => _predicate(c, t) ? result : null);
}
}
public _FilterOn<DataTableVm> FilterOn<T>()
{
return new _FilterOn<DataTableVm>(this, this.FilterTypeRules, (c, t) => t == typeof(T));
return FilterOn<T>(null);
}
public _FilterOn<DataTableVm> FilterOn<T>(object jsOptions)
{
// Doing this way because RouteValueDictionary converts to Json in wrong format
IDictionary<string, object> optionsDict = new Dictionary<string, object>(new RouteValueDictionary(jsOptions));
return FilterOn<T>(optionsDict);
}
public _FilterOn<DataTableVm> FilterOn<T>(IDictionary<string, object> jsOptions)
{
return new _FilterOn<DataTableVm>(this, this.FilterTypeRules, (c, t) => t == typeof(T), jsOptions);
}
public _FilterOn<DataTableVm> FilterOn(string columnName)
{
return new _FilterOn<DataTableVm>(this, this.FilterTypeRules, (c, t) => c == columnName);
return FilterOn(columnName, null);
}
public _FilterOn<DataTableVm> FilterOn(string columnName, object jsOptions)
{
// Doing this way because RouteValueDictionary converts to Json in wrong format
IDictionary<string, object> optionsDict = new Dictionary<string, object>(new RouteValueDictionary(jsOptions));
return FilterOn(columnName, optionsDict);
}
public _FilterOn<DataTableVm> FilterOn(string columnName, IDictionary<string, object> jsOptions)
{
return new _FilterOn<DataTableVm>(this, this.FilterTypeRules, (c, t) => c == columnName, jsOptions);
}

}

public class FilterRuleList : List<Func<string, Type, string>>
Expand Down