Skip to content

Commit 3efd300

Browse files
committed
Blah
1 parent 9d2cc34 commit 3efd300

File tree

6 files changed

+156
-23
lines changed

6 files changed

+156
-23
lines changed

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public DataTablesResult<UserView> GetUsers(DataTablesParam dataTableParam)
3535
Name = new MvcHtmlString("<b>" + user.Name +"</b>"),
3636
Email = user.Email,
3737
Position = user.Position == null ? "" : user.Position.ToString(),
38+
Number = user.Number,
3839
Hired = user.Hired
3940
});
4041
}
@@ -49,6 +50,7 @@ private static List<User> Users()
4950
{
5051
var r = new Random();
5152
var domains = "gmail.com,yahoo.com,hotmail.com".Split(',').ToArray();
53+
5254
var positions = new List<PositionTypes?> { null, PositionTypes.Engineer, PositionTypes.Tester, PositionTypes.Manager };
5355
return _users ?? (_users = new List<User>
5456
(
@@ -59,13 +61,22 @@ private static List<User> Users()
5961
Email = "user" + i + "@" + domains[i%domains.Length],
6062
Name = "User" + i,
6163
Position = positions[i%positions.Count],
64+
Number = (Numbers) r.Next(4),
6265
Hired = DateTimeOffset.UtcNow.AddDays(-1 * 365 * 3 * r.NextDouble())
6366
})
6467
));
6568
return _users;
6669
}
6770
}
6871

72+
public enum Numbers
73+
{
74+
Zero,
75+
One,
76+
Two,
77+
Three,
78+
Four
79+
}
6980
public class User
7081
{
7182
public int Id { get; set; }
@@ -75,6 +86,8 @@ public class User
7586
public HomeController.PositionTypes? Position { get; set; }
7687

7788
public DateTimeOffset Hired { get; set; }
89+
90+
public Numbers Number { get; set; }
7891
}
7992

8093
public class UserView
@@ -85,7 +98,10 @@ public class UserView
8598
public string Email { get; set; }
8699

87100
public string Position { get; set; }
88-
89101
public DateTimeOffset Hired { get; set; }
102+
103+
public Numbers Number { get; set; }
90104
}
105+
106+
91107
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ can also use
5555
var vm = Html.DataTableVm("table-id", (HomeController h) => h.GetUsers(null));
5656
vm.TableTools = true;
5757
vm.ColumnFilter = true;
58+
vm.FilterOn("Position").Select("Engineer", "Tester", "Manager")
59+
.FilterOn("Id").NumberRange();
5860
}
5961
@Html.Partial("DataTable", vm)
6062

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

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
"bStateSave": true,
3838
"bServerSide": true,
3939
"sDom": 'T<"clear">lfrtip',
40+
"aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]],
4041
"bAutoWidth": @Model.AutoWidth.ToString().ToLowerInvariant(),
4142
"sAjaxSource": "@Html.Raw(Model.AjaxUrl)", @Html.Raw(Model.TableTools ? "\"oTableTools\": { \"sSwfPath\": \"/content/DataTables-1.9.0/extras/TableTools/media/swf/copy_cvs_xls_pdf.swf\" }," : "")
4243
"fnServerData": function(sSource, aoData, fnCallback) {
@@ -49,7 +50,6 @@
4950
});
5051
}
5152
});
52-
@{ Model.NoFilterOn("Position"); }
5353
if (@Model.ColumnFilter.ToString().ToLower()) {
5454
dt.columnFilter({
5555
sPlaceHolder: "head:before",
@@ -58,9 +58,3 @@
5858
}
5959
});
6060
</script>
61-
@* {type: "number" },
62-
{type: "text", bRegex: true, bSmart: true},
63-
null,
64-
{type: "select", values: [ 'A', 'B', 'C' ] },
65-
{type: "number-range"},
66-
{type: "date-range"}*@

Mvc.JQuery.Datatables/DataTableVm.cs

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,60 @@ public string GetFilterType(string columnName, Type type)
6161

6262
private static List<Type> DateTypes = new List<Type> { typeof(DateTime), typeof(DateTime?), typeof(DateTimeOffset), typeof(DateTimeOffset?) };
6363

64-
public DataTableVm NoFilterOn(string name)
64+
public class _FilterOn<TTarget>
6565
{
66-
this.FilterTypeRules.Insert(0, (c, t) => c == name ? "null" : null);
67-
return this;
66+
private readonly TTarget _target;
67+
private readonly FilterRuleList _list;
68+
private readonly Func<string, Type, bool> _predicate;
69+
70+
public _FilterOn(TTarget target, FilterRuleList list, Func<string, Type, bool> predicate)
71+
{
72+
_target = target;
73+
_list = list;
74+
_predicate = predicate;
75+
}
76+
77+
public TTarget Select(params string[] options)
78+
{
79+
AddRule("{type: 'select', values: ['" + string.Join("','", options) + "']}");
80+
return _target;
81+
}
82+
public TTarget NumberRange()
83+
{
84+
AddRule("{type: 'number-range'}");
85+
return _target;
86+
}
87+
88+
public TTarget DateRange()
89+
{
90+
AddRule("{type: 'date-range'}");
91+
return _target;
92+
}
93+
94+
public TTarget Number()
95+
{
96+
AddRule("{type: 'number'}");
97+
return _target;
98+
}
99+
100+
public TTarget None()
101+
{
102+
AddRule("null");
103+
return _target;
104+
}
105+
106+
private void AddRule(string result)
107+
{
108+
_list.Insert(0, (c, t) => _predicate(c, t) ? result : null);
109+
}
110+
}
111+
public _FilterOn<DataTableVm> FilterOn<T>()
112+
{
113+
return new _FilterOn<DataTableVm>(this, this.FilterTypeRules, (c, t) => t == typeof(T));
68114
}
69-
public DataTableVm NoFilterOn<T>()
115+
public _FilterOn<DataTableVm> FilterOn(string columnName)
70116
{
71-
this.FilterTypeRules.Insert(0, (c, t) => t == typeof(T) ? "null" : null);
72-
return this;
117+
return new _FilterOn<DataTableVm>(this, this.FilterTypeRules, (c, t) => c == columnName);
73118
}
74119

75120
}

Mvc.JQuery.Datatables/DataTablesFilter.cs

Lines changed: 84 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ public IQueryable FilterPagingSortingSearch(DataTablesParam dtParameters, IQuery
3030
if (!string.IsNullOrWhiteSpace(searchColumn))
3131
{
3232
var parameters = new List<object>();
33-
data = data.Where(GetFilterClause(dtParameters.sSearchColumns[i], columns[i], parameters), parameters.ToArray());
33+
var filterClause = GetFilterClause(dtParameters.sSearchColumns[i], columns[i], parameters);
34+
data = data.Where(filterClause, parameters.ToArray());
3435
}
3536
}
3637
}
@@ -74,10 +75,50 @@ static string FilterMethod(string q)
7475

7576
static readonly List<ReturnedFilteredQueryForType> Filters = new List<ReturnedFilteredQueryForType>()
7677
{
77-
Guard<DateTimeOffset>(DateFilter),
78+
Guard(Is<DateTime>, DateFilter),
79+
Guard(IsNumericType, NumericFilter)
80+
7881
};
7982

80-
private static string DateFilter(string query, string columnname, List<object> parametersForLinqQuery)
83+
private static bool Is<T>(Type arg)
84+
{
85+
return arg is T;
86+
}
87+
88+
private static string NumericFilter(string query, string columnname, Type columnType, List<object> parametersForLinqQuery)
89+
{
90+
if (query.Contains("~"))
91+
{
92+
var parts = query.Split('~');
93+
var clause = null as string;
94+
try
95+
{
96+
parametersForLinqQuery.Add(Convert.ChangeType(parts[0], columnType));
97+
clause = string.Format("{0} >= @{1}", columnname, parametersForLinqQuery.Count - 1);
98+
}
99+
catch (FormatException)
100+
{
101+
}
102+
103+
try
104+
{
105+
parametersForLinqQuery.Add(Convert.ChangeType(parts[1], columnType));
106+
if (clause != null) clause += " and ";
107+
clause += string.Format("{0} <= @{1}", columnname, parametersForLinqQuery.Count - 1);
108+
}
109+
catch (FormatException)
110+
{
111+
}
112+
return clause ?? "true" ;
113+
114+
}
115+
else
116+
{
117+
return string.Format("{1}.ToString().{0}", FilterMethod(query), columnname);
118+
}
119+
}
120+
121+
private static string DateFilter(string query, string columnname, Type columnType, List<object> parametersForLinqQuery)
81122
{
82123
if (query.Contains("~"))
83124
{
@@ -96,21 +137,23 @@ private static string DateFilter(string query, string columnname, List<object> p
96137
}
97138
}
98139

99-
public delegate string GuardedFilter(string query, string columnName, List<object> parametersForLinqQuery);
100-
static ReturnedFilteredQueryForType Guard<T>(GuardedFilter filter)
140+
public delegate string GuardedFilter(string query, string columnName, Type columnType, List<object> parametersForLinqQuery);
141+
142+
static ReturnedFilteredQueryForType Guard(Func<Type, bool> guard, GuardedFilter filter)
101143
{
102144
return (q, c, t, p) =>
103145
{
104-
if (typeof(T) != t)
146+
if (!guard(t))
105147
{
106148
return null;
107149
}
108-
return filter(q, c, p);
150+
return filter(q, c, t, p);
109151
};
110152
}
153+
111154
public static void RegisterFilter<T>(GuardedFilter filter)
112155
{
113-
Filters.Add(Guard<T>(filter));
156+
Filters.Add(Guard(Is<T>, filter));
114157
}
115158

116159
private static string GetFilterClause(string query, Tuple<string, Type> column, List<object> parametersForLinqQuery)
@@ -126,5 +169,38 @@ private static string GetFilterClause(string query, Tuple<string, Type> column,
126169
var parts = query.Split('~').Select(q => string.Format("{1}.ToString().{0}", FilterMethod(q), column.Item1));
127170
return "(" + string.Join(") OR (", parts) + ")";
128171
}
172+
173+
public static bool IsNumericType(Type type)
174+
{
175+
if (type == null || type.IsEnum)
176+
{
177+
return false;
178+
}
179+
180+
switch (Type.GetTypeCode(type))
181+
{
182+
case TypeCode.Byte:
183+
case TypeCode.Decimal:
184+
case TypeCode.Double:
185+
case TypeCode.Int16:
186+
case TypeCode.Int32:
187+
case TypeCode.Int64:
188+
case TypeCode.SByte:
189+
case TypeCode.Single:
190+
case TypeCode.UInt16:
191+
case TypeCode.UInt32:
192+
case TypeCode.UInt64:
193+
return true;
194+
case TypeCode.Object:
195+
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
196+
{
197+
return IsNumericType(Nullable.GetUnderlyingType(type));
198+
}
199+
return false;
200+
}
201+
return false;
202+
203+
}
204+
129205
}
130206
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
if (@Model.ColumnFilter.ToString().ToLower()) {
5353
dt.columnFilter({
5454
sPlaceHolder: "head:before",
55-
aoColumns: [@Html.Raw(string.Join(",", Model.Columns.Select(c => Model.GetFilterType(c))))]
55+
aoColumns: [@Html.Raw(Model.ColumnFiltersString)]
5656
});
5757
}
5858
});

0 commit comments

Comments
 (0)