Skip to content

Commit decd3b4

Browse files
committed
Fixed i18n on datepicker, fixed saving for range/checkbox filters
Added hidden columns, improved transform example Merged attributes, changed way transform happens, fixed filtering
1 parent 4d162ee commit decd3b4

20 files changed

+445
-299
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
5+
namespace Mvc.JQuery.Datatables.Example.Controllers
6+
{
7+
static class FakeDatabase
8+
{
9+
private static List<User> _users;
10+
11+
static FakeDatabase()
12+
{
13+
var r = new Random();
14+
var domains = "gmail.com,yahoo.com,hotmail.com".Split(',').ToArray();
15+
var positions = new List<PositionTypes?> { null, PositionTypes.Engineer, PositionTypes.Tester, PositionTypes.Manager };
16+
_users = new List<User>(Enumerable.Range(1, 100).Select(i => new User()
17+
{
18+
Id = i,
19+
Email =
20+
"user" + i + "@" + domains[i%domains.Length],
21+
Name = r.Next(6) == 3 ? null : "User" + i,
22+
Position = positions[i%positions.Count],
23+
IsAdmin = i%11 == 0,
24+
Number = (Numbers) r.Next(4),
25+
Hired =
26+
DateTime.UtcNow.AddDays(-1*365*3*
27+
r.NextDouble()),
28+
Salary =
29+
10000 + (DateTime.UtcNow.Minute*1000) +
30+
(DateTime.UtcNow.Second*100) +
31+
DateTime.UtcNow.Millisecond
32+
}));
33+
34+
}
35+
public static IQueryable<User> Users {get { return _users.AsQueryable(); }}
36+
}
37+
38+
public enum Numbers
39+
{
40+
Zero,
41+
One,
42+
Two,
43+
Three,
44+
Four
45+
}
46+
47+
public enum PositionTypes
48+
{
49+
Engineer,
50+
Tester,
51+
Manager
52+
}
53+
public class User
54+
{
55+
public int Id { get; set; }
56+
57+
public string Name { get; set; }
58+
public string Email { get; set; }
59+
60+
public PositionTypes? Position { get; set; }
61+
62+
public DateTime Hired { get; set; }
63+
64+
public Numbers Number { get; set; }
65+
66+
public bool IsAdmin { get; set; }
67+
68+
public decimal Salary { get; set; }
69+
}
70+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using System;
2+
3+
namespace Mvc.JQuery.Datatables.Example.Controllers
4+
{
5+
static class FriendlyDateHelper
6+
{
7+
public static string GetPrettyDate(DateTime d)
8+
{
9+
// 1.
10+
// Get time span elapsed since the date.
11+
TimeSpan s = DateTime.Now.Subtract(d);
12+
13+
// 2.
14+
// Get total number of days elapsed.
15+
int dayDiff = (int) s.TotalDays;
16+
17+
// 6.
18+
// Handle previous days.
19+
if (dayDiff == 1)
20+
{
21+
return "yesterday";
22+
}
23+
if (dayDiff < 7)
24+
{
25+
return string.Format("{0} days ago",
26+
dayDiff);
27+
}
28+
if (dayDiff < 31)
29+
{
30+
return string.Format("{0} weeks ago",
31+
Math.Ceiling((double) dayDiff/7));
32+
}
33+
return string.Format("{0} months ago",
34+
Math.Ceiling((double) dayDiff/31));
35+
}
36+
}
37+
}

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

Lines changed: 19 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -10,114 +10,64 @@ namespace Mvc.JQuery.Datatables.Example.Controllers
1010
{
1111
public class HomeController : Controller
1212
{
13-
private static List<User> _users;
14-
//
15-
// GET: /Home/
16-
1713
public ActionResult Index()
1814
{
1915
return View();
2016
}
2117

22-
public enum PositionTypes
23-
{
24-
Engineer,
25-
Tester,
26-
Manager
27-
}
2818

2919
public DataTablesResult<UserView> GetUsers(DataTablesParam dataTableParam)
3020
{
31-
var users = Users().AsQueryable();
32-
33-
return DataTablesResult.Create(users, dataTableParam, user => new UserView()
21+
return DataTablesResult.Create(FakeDatabase.Users.Select(user => new UserView()
3422
{
3523
Id = user.Id,
36-
Name = new MvcHtmlString("<b>" + user.Name +"</b>"),
24+
Name = user.Name,
3725
Email = user.Email,
3826
Position = user.Position == null ? "" : user.Position.ToString(),
3927
Number = user.Number,
4028
Hired = user.Hired,
4129
IsAdmin = user.IsAdmin,
4230
Salary = user.Salary
31+
}), dataTableParam,
32+
uv => new
33+
{
34+
Name = "<b>" + uv.Name + "</b>",
35+
Hired = uv.Hired.ToShortDateString() + " (" + FriendlyDateHelper.GetPrettyDate(uv.Hired) + ") "
4336
});
4437
}
4538

46-
public DataTablesResult GetUsersUntyped(DataTablesParam dataTableParam)
47-
{
48-
var users = Users();
39+
//public DataTablesResult<User> GetUsersUntyped(DataTablesParam dataTableParam)
40+
//{
41+
// var users = FakeDatabase.Users;
4942

50-
return DataTablesResult.Create(users, dataTableParam);
51-
}
43+
// return DataTablesResult.Create(users, dataTableParam);
44+
//}
5245

53-
private static List<User> Users()
54-
{
55-
var r = new Random();
56-
var domains = "gmail.com,yahoo.com,hotmail.com".Split(',').ToArray();
57-
var positions = new List<PositionTypes?> { null, PositionTypes.Engineer, PositionTypes.Tester, PositionTypes.Manager };
58-
return _users ?? (_users = new List<User>
59-
(
60-
Enumerable.Range(1, 100).Select(i =>
61-
new User()
62-
{
63-
Id = i,
64-
Email = "user" + i + "@" + domains[i%domains.Length],
65-
Name = r.Next(6) == 3 ? null : "User" + i,
66-
Position = positions[i%positions.Count],
67-
IsAdmin = i % 11 == 0,
68-
Number = (Numbers) r.Next(4),
69-
Hired = DateTime.UtcNow.AddDays(-1 * 365 * 3 * r.NextDouble()),
70-
Salary = 10000 + (DateTime.UtcNow.Minute * 1000) + (DateTime.UtcNow.Second * 100) + DateTime.UtcNow.Millisecond
71-
})
72-
));
73-
}
74-
}
7546

76-
public enum Numbers
77-
{
78-
Zero,
79-
One,
80-
Two,
81-
Three,
82-
Four
8347
}
84-
public class User
85-
{
86-
public int Id { get; set; }
87-
88-
public string Name { get; set; }
89-
public string Email { get; set; }
9048

91-
public HomeController.PositionTypes? Position { get; set; }
92-
93-
public DateTime Hired { get; set; }
9449

95-
public Numbers Number { get; set; }
96-
97-
public bool IsAdmin { get; set; }
98-
99-
public decimal Salary { get; set; }
100-
}
50+
10151

10252
public class UserView
10353
{
10454
public int Id { get; set; }
10555

106-
[DisplayName("Full Name")]
107-
public MvcHtmlString Name { get; set; }
56+
[DataTables( DisplayName = "Full Name")]
57+
public string Name { get; set; }
58+
10859

60+
[DataTables(Searchable = false)]
10961
public string Email { get; set; }
11062

111-
[DataTablesSortable(false)]
63+
[DataTables( Sortable = false)]
11264
public bool IsAdmin { get; set; }
11365
public string Position { get; set; }
11466
public DateTime Hired { get; set; }
11567

11668
public Numbers Number { get; set; }
11769

118-
[DataTablesVisible(false)]
70+
[DataTables(Visible = false)]
11971
public decimal Salary { get; set; }
12072
}
121-
122-
12373
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@
8383
<ItemGroup>
8484
<Content Include="App_Code\RegisterVirtualPathProvider.cs" />
8585
<Compile Include="App_Start\RegisterDatatablesModelBinder.cs" />
86+
<Compile Include="Controllers\FakeDatabase.cs" />
87+
<Compile Include="Controllers\FriendlyDateHelper.cs" />
8688
<Compile Include="Controllers\HomeController.cs" />
8789
<Compile Include="Global.asax.cs">
8890
<DependentUpon>Global.asax</DependentUpon>

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

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,23 @@
99
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
1010
<script src="@Url.Content("~/Scripts/jquery-ui-1.8.17.min.js")" type="text/javascript"></script>
1111
<link href="/Content/themes/Aristo/jquery-ui-1.8.7.custom.css" type="text/css" rel="stylesheet" />
12-
12+
1313
<script src="/Scripts/jquery.globalize/globalize.js" type="text/javascript"></script>
1414
<script src="/Scripts/jquery.globalize/cultures/globalize.culture.@(System.Globalization.CultureInfo.CurrentUICulture.Name).js" type="text/javascript"></script>
15-
<script type="text/javascript">
16-
Globalize.culture("@System.Globalization.CultureInfo.CurrentUICulture.Name");
17-
</script>
18-
@if (System.Globalization.CultureInfo.CurrentUICulture.Name != "en-US")
19-
{
20-
<script src="/Scripts/jquery-ui-i18n.js" type="text/javascript"></script>
21-
<script type="text/javascript">
15+
16+
@if (System.Globalization.CultureInfo.CurrentUICulture.Name != "en-US")
17+
{
18+
<script src="/Scripts/jquery-ui-i18n.js" type="text/javascript" ></script>
19+
}
20+
<script type="text/javascript">
21+
Globalize.culture("@System.Globalization.CultureInfo.CurrentUICulture.Name");
22+
</script>
23+
24+
@if (System.Globalization.CultureInfo.CurrentUICulture.Name != "en-US")
25+
{
26+
<script type="text/javascript">
27+
$(function () {
28+
2229
function GetDatePickerRegion(locale) {
2330
2431
// Try to get region directly (with the same name)
@@ -41,10 +48,12 @@
4148
4249
var region = GetDatePickerRegion('@System.Globalization.CultureInfo.CurrentUICulture.Name');
4350
$.datepicker.setDefaults(region);
44-
</script>
45-
}
51+
});
52+
</script>
53+
}
4654
</head>
4755
<body>
56+
4857
<div class="topbar">
4958
<div class="topbar-inner">
5059
<div class="container">

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

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -170,14 +170,23 @@
170170
}
171171

172172
function fnCreateRangeInput(oTable) {
173+
var currentFilter = oTable.fnSettings().aoPreSearchCols[i].sSearch;
174+
var fromDatePre = '';
175+
var toDatePre = '';
176+
if (currentFilter != '' && currentFilter != 'undefined') {
177+
var arrDates = currentFilter.split("~");
178+
fromDatePre = arrDates[0];
179+
toDatePre = arrDates[1];
180+
}
181+
173182

174183
th.html(_fnRangeLabelPart(0));
175184
var sFromId = oTable.attr("id") + '_range_from_' + i;
176-
var from = $('<input type="text" class="number_range_filter" id="' + sFromId + '" rel="' + i + '"/>');
185+
var from = $('<input type="text" class="number_range_filter" id="' + sFromId + '" value="' + fromDatePre + '" rel="' + i + '"/>');
177186
th.append(from);
178187
th.append(_fnRangeLabelPart(1));
179188
var sToId = oTable.attr("id") + '_range_to_' + i;
180-
var to = $('<input type="text" class="number_range_filter" id="' + sToId + '" rel="' + i + '"/>');
189+
var to = $('<input type="text" class="number_range_filter" id="' + sToId + '" value="' + toDatePre + '" rel="' + i + '"/>');
181190
th.append(to);
182191
th.append(_fnRangeLabelPart(2));
183192
th.wrapInner('<span class="filterColumn filter_number_range" />');
@@ -235,14 +244,23 @@
235244

236245

237246
function fnCreateDateRangeInput(oTable) {
247+
var currentFilter = oTable.fnSettings().aoPreSearchCols[i].sSearch;
248+
var fromDatePre = '';
249+
var toDatePre = '';
250+
if (currentFilter != '' && currentFilter != 'undefined') {
251+
var arrDates = currentFilter.split("~");
252+
fromDatePre = arrDates[0];
253+
toDatePre = arrDates[1];
254+
}
255+
238256
th.html(_fnRangeLabelPart(0));
239257
var sFromId = oTable.attr("id") + '_range_from_' + i;
240-
var from = $('<input type="text" class="date_range_filter" id="' + sFromId + '" rel="' + i + '"/>');
258+
var from = $('<input type="text" class="date_range_filter" id="' + sFromId + '" value="' + fromDatePre + '" rel="' + i + '"/>');
241259
from.datepicker();
242260
th.append(from);
243261
th.append(_fnRangeLabelPart(1));
244262
var sToId = oTable.attr("id") + '_range_to_' + i;
245-
var to = $('<input type="text" class="date_range_filter" id="' + sToId + '" rel="' + i + '"/>');
263+
var to = $('<input type="text" class="date_range_filter" id="' + sToId + '" value="' + toDatePre + '" rel="' + i + '"/>');
246264
th.append(to);
247265
th.append(_fnRangeLabelPart(2));
248266
th.wrapInner('<span class="filterColumn filter_date_range" />');
@@ -313,12 +331,12 @@
313331
for (j = 0; j < iLen; j++) {
314332
if (typeof (aData[j]) != 'object') {
315333
var selected = '';
316-
if (escape(aData[j]) == currentFilter) selected = 'selected '
334+
if (("^" + escape(aData[j]) + "$") == currentFilter) selected = 'selected '
317335
r += '<option ' + selected + ' value="' + escape("^" + aData[j] + "$") + '">' + aData[j] + '</option>';
318336
}
319337
else {
320338
var selected = '';
321-
if (escape(aData[j].value) == currentFilter) selected = 'selected '
339+
if (("^" + escape(aData[j]) + "$") == currentFilter) selected = 'selected '
322340
r += '<option ' + selected + 'value="' + escape(aData[j].value + "$") + '">' + aData[j].label + '</option>';
323341
}
324342
}
@@ -419,6 +437,7 @@
419437
r += divRowDef;
420438

421439
var storedValues = oTable.fnSettings().aoPreSearchCols[i].sSearch;
440+
422441
var previousValues = storedValues ? storedValues.split("|") : [];
423442
for (j = 0; j < iLen; j++) {
424443

@@ -427,7 +446,7 @@
427446
r += divClose + divRowDef;
428447
}
429448

430-
var checked = $.inArray(aData[j], previousValues) > -1;
449+
var checked = $.inArray("^" + aData[j] + "$", previousValues) > -1;
431450
//check button
432451
r += '<input class="search_init checkbox_filter" type="checkbox" id= "' + aData[j] + '" name= "' + localLabel + '" value="' + ("^" + aData[j] + "$") + '" ' + (checked ? 'checked="checked"' : '') + '>' + aData[j] + '<br/>';
433452

@@ -664,8 +683,11 @@
664683
var index = aiCustomSearch_Indexes[j];
665684

666685
for (k = 0; k < aoData.length; k++) {
667-
if (aoData[k].name == "sSearch_" + index)
686+
if (aoData[k].name == "sSearch_" + index) {
668687
aoData[k].value = afnSearch_[j]();
688+
// Added this line to force the value in
689+
oTable.fnSettings().aoPreSearchCols[index].sSearch = aoData[k].value;
690+
}
669691
}
670692
}
671693
aoData.push({ "name": "sRangeSeparator", "value": properties.sRangeSeparator });

0 commit comments

Comments
 (0)