Skip to content

Commit a9a7c9a

Browse files
committed
2 parents 1f7484d + 2e34e70 commit a9a7c9a

File tree

8 files changed

+130
-32
lines changed

8 files changed

+130
-32
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public class UserView
8282
public string Position { get; set; }
8383

8484
[DataTablesFilter(DataTablesFilterType.DateTimeRange)]
85-
[DefaultToStartOfYear]
85+
[DefaultToStartOf2014]
8686
public DateTime? Hired { get; set; }
8787

8888
public Numbers Number { get; set; }
@@ -93,12 +93,12 @@ public class UserView
9393

9494
}
9595

96-
public class DefaultToStartOfYearAttribute : DataTablesAttributeBase
96+
public class DefaultToStartOf2014Attribute : DataTablesAttributeBase
9797
{
9898
public override void ApplyTo(ColDef colDef, PropertyInfo pi)
9999
{
100100
colDef.SearchCols = colDef.SearchCols ?? new JObject();
101-
colDef.SearchCols["sSearch"] = new DateTime(DateTime.Now.Year, 1, 1).ToString("g") + "~" + DateTimeOffset.Now.Date.AddDays(1).ToString("g");
101+
colDef.SearchCols["sSearch"] = new DateTime(2014, 1, 1).ToString("g") + "~" + DateTimeOffset.Now.Date.AddDays(1).ToString("g");
102102
}
103103
}
104104
}

Mvc.JQuery.Datatables/DataTableConfigVm.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,10 @@ public TTarget Select(params string[] options)
134134
{
135135
_colDef.Filter.type = "select";
136136
_colDef.Filter.values = options.Cast<object>().ToArray();
137+
if (_colDef.Type.IsEnum)
138+
{
139+
_colDef.Filter.values = _colDef.Type.EnumValLabPairs();
140+
}
137141
return _target;
138142
}
139143
public TTarget NumberRange()
@@ -158,6 +162,10 @@ public TTarget CheckBoxes(params string[] options)
158162
{
159163
_colDef.Filter.type = "checkbox";
160164
_colDef.Filter.values = options.Cast<object>().ToArray();
165+
if (_colDef.Type.IsEnum)
166+
{
167+
_colDef.Filter.values = _colDef.Type.EnumValLabPairs();
168+
}
161169
return _target;
162170
}
163171

@@ -294,4 +302,4 @@ private static IDictionary<string, object> ConvertObjectToDictionary(object obj)
294302
return new Dictionary<string, object>(new RouteValueDictionary(obj));
295303
}
296304
}
297-
}
305+
}
Lines changed: 48 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,77 +1,100 @@
1-
using System.Web;
2-
using System.Web.Script.Serialization;
1+
using Mvc.JQuery.Datatables.Models;
2+
using Mvc.JQuery.Datatables.Reflection;
3+
using Mvc.JQuery.Datatables.Util;
34
using System;
45
using System.Collections.Generic;
56
using System.Linq;
7+
using System.Web;
68
using System.Web.Mvc;
7-
using Mvc.JQuery.Datatables.Models;
8-
using Mvc.JQuery.Datatables.Reflection;
9-
using Mvc.JQuery.Datatables.Util;
9+
using System.Web.Script.Serialization;
1010

1111
namespace Mvc.JQuery.Datatables
1212
{
13-
public abstract class DataTablesResult : ActionResult
13+
public abstract class DataTablesResult : ActionResult
1414
{
1515
/// <typeparam name="TSource"></typeparam>
1616
/// <typeparam name="TTransform"></typeparam>
1717
/// <param name="q">A queryable for the data. The properties of this can be marked up with [DataTablesAttribute] to control sorting/searchability/visibility</param>
1818
/// <param name="dataTableParam"></param>
1919
/// <param name="transform">//a transform for custom column rendering e.g. to do a custom date row => new { CreatedDate = row.CreatedDate.ToString("dd MM yy") } </param>
2020
/// <returns></returns>
21-
public static DataTablesResult<TSource> Create<TSource, TTransform>(IQueryable<TSource> q, DataTablesParam dataTableParam, Func<TSource, TTransform> transform)
21+
public static DataTablesResult<TSource> Create<TSource, TTransform>(IQueryable<TSource> q, DataTablesParam dataTableParam,
22+
Func<TSource, TTransform> transform, ArrayOutputType? arrayOutput = null)
2223
{
2324
var result = new DataTablesResult<TSource>(q, dataTableParam);
25+
2426
result.Data = result.Data
2527
.Transform<TSource, Dictionary<string, object>>(row => TransformTypeInfo.MergeTransformValuesIntoDictionary(transform, row))
26-
.Transform<Dictionary<string, object>, Dictionary<string, object>>(StringTransformers.StringifyValues)
27-
.Transform<Dictionary<string, object>, object[]>(d => d.Values.ToArray());
28-
28+
.Transform<Dictionary<string, object>, Dictionary<string, object>>(StringTransformers.StringifyValues);
29+
30+
result.Data = ApplyOutputRules(result.Data, arrayOutput);
31+
2932
return result;
3033
}
3134

32-
public static DataTablesResult<TSource> Create<TSource>(IQueryable<TSource> q, DataTablesParam dataTableParam)
35+
public static DataTablesResult<TSource> Create<TSource>(IQueryable<TSource> q, DataTablesParam dataTableParam,
36+
ArrayOutputType? arrayOutput = null)
3337
{
3438
var result = new DataTablesResult<TSource>(q, dataTableParam);
3539

3640
result.Data = result.Data
3741
.Transform<TSource, Dictionary<string, object>>(DataTablesTypeInfo<TSource>.ToDictionary)
38-
.Transform<Dictionary<string, object>, Dictionary<string, object>>(StringTransformers.StringifyValues)
39-
.Transform<Dictionary<string, object>, object[]>(d => d.Values.ToArray()); ;
42+
.Transform<Dictionary<string, object>, Dictionary<string, object>>(StringTransformers.StringifyValues);
43+
44+
result.Data = ApplyOutputRules(result.Data, arrayOutput);
45+
4046
return result;
4147
}
4248

49+
private static DataTablesData ApplyOutputRules(DataTablesData sourceData, ArrayOutputType? arrayOutput = null)
50+
{
51+
DataTablesData outputData = sourceData;
52+
53+
switch (arrayOutput)
54+
{
55+
case ArrayOutputType.ArrayOfObjects:
56+
// Nothing is needed
57+
break;
58+
case ArrayOutputType.BiDimensionalArray:
59+
default:
60+
outputData = sourceData.Transform<Dictionary<string, object>, object[]>(d => d.Values.ToArray());
61+
break;
62+
}
63+
64+
return outputData;
65+
}
4366

4467
/// <param name="transform">Should be a Func<T, TTransform></param>
45-
public static DataTablesResult Create(IQueryable queryable, DataTablesParam dataTableParam, object transform)
68+
public static DataTablesResult Create(IQueryable queryable, DataTablesParam dataTableParam, object transform,
69+
ArrayOutputType? arrayOutput = null)
4670
{
4771
var s = "Create";
4872
var openCreateMethod = typeof(DataTablesResult).GetMethods().Single(x => x.Name == s && x.GetGenericArguments().Count() == 2);
4973
var queryableType = queryable.GetType().GetGenericArguments()[0];
5074
var transformType = transform.GetType().GetGenericArguments()[1];
5175
var closedCreateMethod = openCreateMethod.MakeGenericMethod(queryableType, transformType);
52-
return (DataTablesResult)closedCreateMethod.Invoke(null, new object[] { queryable, dataTableParam, transform });
76+
return (DataTablesResult)closedCreateMethod.Invoke(null, new object[] { queryable, dataTableParam, transform, arrayOutput });
5377
}
5478

55-
public static DataTablesResult Create(IQueryable queryable, DataTablesParam dataTableParam)
79+
public static DataTablesResult Create(IQueryable queryable, DataTablesParam dataTableParam,
80+
ArrayOutputType? arrayOutput = null)
5681
{
5782
var s = "Create";
5883
var openCreateMethod = typeof(DataTablesResult).GetMethods().Single(x => x.Name == s && x.GetGenericArguments().Count() == 1);
5984
var queryableType = queryable.GetType().GetGenericArguments()[0];
6085
var closedCreateMethod = openCreateMethod.MakeGenericMethod(queryableType);
61-
return (DataTablesResult)closedCreateMethod.Invoke(null, new object[] { queryable, dataTableParam });
86+
return (DataTablesResult)closedCreateMethod.Invoke(null, new object[] { queryable, dataTableParam, arrayOutput });
6287
}
6388

64-
public static DataTablesResult<T> CreateResultUsingEnumerable<T>(IEnumerable<T> q, DataTablesParam dataTableParam)
89+
public static DataTablesResult<T> CreateResultUsingEnumerable<T>(IEnumerable<T> q, DataTablesParam dataTableParam,
90+
ArrayOutputType? arrayOutput = null)
6591
{
66-
return Create(q.AsQueryable(), dataTableParam);
92+
return Create(q.AsQueryable(), dataTableParam, arrayOutput);
6793
}
68-
6994
}
7095

71-
7296
public class DataTablesResult<TSource> : DataTablesResult
7397
{
74-
7598
public DataTablesData Data { get; set; }
7699

77100
internal DataTablesResult(IQueryable<TSource> q, DataTablesParam dataTableParam)
@@ -87,18 +110,20 @@ public override void ExecuteResult(ControllerContext context)
87110
{
88111
if (context == null)
89112
throw new ArgumentNullException("context");
113+
90114
HttpResponseBase response = context.HttpContext.Response;
91115

92116
var scriptSerializer = new JavaScriptSerializer()
93117
{
94118
MaxJsonLength = int.MaxValue
95119
};
120+
96121
response.Write(scriptSerializer.Serialize(this.Data));
97122
}
98123

99124
DataTablesData GetResults(IQueryable<TSource> data, DataTablesParam param)
100125
{
101-
var totalRecords = data.Count(); //annoying this, as it causes an extra evaluation..
126+
var totalRecords = data.Count(); // annoying this, as it causes an extra evaluation..
102127

103128
var filters = new DataTablesFiltering();
104129

@@ -110,7 +135,6 @@ DataTablesData GetResults(IQueryable<TSource> data, DataTablesParam param)
110135
var skipped = filteredData.Skip(param.iDisplayStart);
111136
var page = (param.iDisplayLength <= 0 ? skipped : skipped.Take(param.iDisplayLength)).ToArray();
112137

113-
114138
var result = new DataTablesData
115139
{
116140
iTotalRecords = totalRecords,
@@ -121,7 +145,5 @@ DataTablesData GetResults(IQueryable<TSource> data, DataTablesParam param)
121145

122146
return result;
123147
}
124-
125-
126148
}
127149
}

Mvc.JQuery.Datatables/FilterDef.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,13 @@ private void SetDefaultValuesAccordingToColumnType(Type t)
4242
else if (t.IsEnum)
4343
{
4444
type = "checkbox";
45-
values = Enum.GetNames(t).Cast<object>().ToArray();
45+
//values = Enum.GetNames(t).Cast<object>().ToArray();
46+
values = t.EnumValLabPairs();
4647
}
4748
else
4849
{
4950
type = "text";
5051
}
5152
}
5253
}
53-
}
54+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+

2+
namespace Mvc.JQuery.Datatables.Models
3+
{
4+
public enum ArrayOutputType
5+
{
6+
BiDimensionalArray,
7+
ArrayOfObjects
8+
}
9+
}

Mvc.JQuery.Datatables/Mvc.JQuery.Datatables.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
<Compile Include="DataTablesFiltering.cs" />
8383
<Compile Include="DataTablesFilterAttribute.cs" />
8484
<Compile Include="LengthMenuVm.cs" />
85+
<Compile Include="Models\ArrayOutputType.cs" />
8586
<Compile Include="Models\ColDef.cs" />
8687
<Compile Include="ColumnFilterSettingsVm.cs" />
8788
<Compile Include="DataTablesAttribute.cs" />

Mvc.JQuery.Datatables/ResourceHelper.cs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Linq;
44
using System.Reflection;
55
using System.Text;
6+
using System.ComponentModel.DataAnnotations;
67

78
namespace Mvc.JQuery.Datatables
89
{
@@ -23,4 +24,55 @@ public static T GetResourceLookup<T>(Type resourceType, string resourceName)
2324
return default(T);
2425
}
2526
}
27+
28+
/// <summary>
29+
/// Group of helpers that gets Display attributes values from Enum members
30+
/// DražaM
31+
/// </summary>
32+
public static class EnumHelper
33+
{
34+
public static string DisplayName(this Enum value)
35+
{
36+
Type enumType = value.GetType();
37+
var enumValue = Enum.GetName(enumType, value);
38+
MemberInfo member = enumType.GetMember(enumValue)[0];
39+
40+
var attrs = member.GetCustomAttributes(typeof(DisplayAttribute), false);
41+
var outString = member.Name;
42+
if (attrs.Length > 0)
43+
{
44+
45+
if (((DisplayAttribute)attrs[0]).ResourceType != null)
46+
{
47+
outString = ((DisplayAttribute)attrs[0]).GetName();
48+
}
49+
else
50+
{
51+
outString = ((DisplayAttribute)attrs[0]).Name;
52+
}
53+
}
54+
return outString;
55+
}
56+
57+
public static List<string> AllDisplayNames(this Type tip)
58+
{
59+
List<string> exitList = new List<string>();
60+
foreach (string r in Enum.GetNames(tip))
61+
{
62+
exitList.Add(((Enum)Enum.Parse(tip, r)).DisplayName());
63+
};
64+
return exitList;
65+
}
66+
67+
public static object[] EnumValLabPairs(this Type type)
68+
{
69+
var vals = Enum.GetNames(type).Cast<object>().ToArray();
70+
var lbls = type.AllDisplayNames().Cast<object>().ToArray();
71+
var result = new List<object>();
72+
73+
for (var x = 0; x <= vals.Length - 1; x++) { result.Add(new { value = vals[x], label = lbls[x] }); }
74+
75+
return result.ToArray<object>();
76+
}
77+
}
2678
}

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ http://nuget.org/packages/Mvc.JQuery.Datatables
3333

3434
The code here is based on code from http://code.google.com/p/datatables-asp-mvc/
3535

36+
Note to users
37+
-------------
38+
39+
This library has been developed on an as-needed basis, so not all configuration settings from datatables are implemented yet. If you need a setting to be added, please fork the project, update the code, and update the example page to include a usage of the new setting (where this makes sense) e.g. https://github.com/mcintyre321/mvc.jquery.datatables/commit/c70f9c1f51178386e84a73ccea4495343f815012
40+
3641
If you have a feature request, bug, or a patch, please could you add an example page on a fork demonstrating the problem or feature. Thanks!
3742

3843
[![Flattr this git repo](http://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=mcintyre321&url=https://github.com/mcintyre321/mvc.jquery.datatables&title=Mvc.JQuery.DataTables&language=&tags=github&category=software)

0 commit comments

Comments
 (0)