Skip to content
Merged
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





52 changes: 48 additions & 4 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,7 @@ public string JsOptionsString
{
get
{
return (new JavaScriptSerializer()).Serialize((object)JsOptions).TrimStart('{').TrimEnd('}');
return convertDictionaryToJsonBody(JsOptions);
}
}

Expand Down Expand Up @@ -111,12 +112,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 @@ -150,6 +153,12 @@ public TTarget CheckBoxes(params string[] options)
return _target;
}

public TTarget Text()
{
AddRule("{type: 'text'}");
return _target;
}

public TTarget None()
{
AddRule("null");
Expand All @@ -158,18 +167,53 @@ public TTarget None()

private void AddRule(string result)
{
if (result != "null" && this._jsOptions != null && this._jsOptions.Count > 0)
{
var _jsOptionsAsJson = DataTableVm.convertDictionaryToJsonBody(this._jsOptions);
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)
{
IDictionary<string, object> optionsDict = DataTableVm.convertObjectToDictionary(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)
{
IDictionary<string, object> optionsDict = DataTableVm.convertObjectToDictionary(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);
}

private static string convertDictionaryToJsonBody(IDictionary<string, object> dict)
{
// Converting to System.Collections.Generic.Dictionary<> to ensure Dictionary will be converted to Json in correct format
var dictSystem = new Dictionary<string, object>(dict);
return (new JavaScriptSerializer()).Serialize((object)dictSystem).TrimStart('{').TrimEnd('}');
}

private static IDictionary<string, object> convertObjectToDictionary(object obj)
{
// Doing this way because RouteValueDictionary converts to Json in wrong format
return new Dictionary<string, object>(new RouteValueDictionary(obj));
}
}

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