Skip to content

Commit 887ee06

Browse files
committed
#102 Supporting Callback Functions
#103 Supporting StateSave
1 parent c7d56ab commit 887ee06

File tree

12 files changed

+718
-136
lines changed

12 files changed

+718
-136
lines changed
Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
namespace DatatableJS.Net
2+
{
3+
/// <summary>
4+
/// Generic callback builder class
5+
/// </summary>
6+
/// <typeparam name="T"></typeparam>
7+
public class CallbackBuilder<T>
8+
{
9+
private readonly GridBuilder<T> _grid;
10+
11+
/// <summary>
12+
/// Initializes a new instance of the <see cref="CallbackBuilder{T}"/> class.
13+
/// </summary>
14+
/// <param name="grid"></param>
15+
public CallbackBuilder(GridBuilder<T> grid)
16+
{
17+
_grid = grid;
18+
}
19+
20+
/// <summary>
21+
/// Set createdRow function <see href="https://datatables.net/reference/option/createdRow">Reference:</see>
22+
/// </summary>
23+
/// <param name="functionName"></param>
24+
/// <returns></returns>
25+
public CallbackBuilder<T> CreatedRow(string functionName)
26+
{
27+
_grid._callBack.CreatedRow = functionName;
28+
return this;
29+
}
30+
31+
/// <summary>
32+
/// Set drawCallback function <see href="https://datatables.net/reference/option/drawCallback">Reference:</see>
33+
/// </summary>
34+
/// <param name="functionName"></param>
35+
/// <returns></returns>
36+
public CallbackBuilder<T> DrawCallback(string functionName)
37+
{
38+
_grid._callBack.DrawCallback = functionName;
39+
return this;
40+
}
41+
42+
/// <summary>
43+
/// Set footerCallback function <see href="https://datatables.net/reference/option/footerCallback">Reference:</see>
44+
/// </summary>
45+
/// <param name="functionName"></param>
46+
/// <returns></returns>
47+
public CallbackBuilder<T> FooterCallback(string functionName)
48+
{
49+
_grid._callBack.FooterCallback = functionName;
50+
return this;
51+
}
52+
53+
/// <summary>
54+
/// Set formatNumber function <see href="https://datatables.net/reference/option/formatNumber">Reference:</see>
55+
/// </summary>
56+
/// <param name="functionName"></param>
57+
/// <returns></returns>
58+
public CallbackBuilder<T> FormatNumber(string functionName)
59+
{
60+
_grid._callBack.FormatNumber = functionName;
61+
return this;
62+
}
63+
64+
/// <summary>
65+
/// Set headerCallback function <see href="https://datatables.net/reference/option/headerCallback">Reference:</see>
66+
/// </summary>
67+
/// <param name="functionName"></param>
68+
/// <returns></returns>
69+
public CallbackBuilder<T> HeaderCallback(string functionName)
70+
{
71+
_grid._callBack.HeaderCallback = functionName;
72+
return this;
73+
}
74+
75+
/// <summary>
76+
/// Set infoCallback function <see href="https://datatables.net/reference/option/infoCallback">Reference:</see>
77+
/// </summary>
78+
/// <param name="functionName"></param>
79+
/// <returns></returns>
80+
public CallbackBuilder<T> InfoCallback(string functionName)
81+
{
82+
_grid._callBack.InfoCallback = functionName;
83+
return this;
84+
}
85+
86+
/// <summary>
87+
/// Set initComplete function <see href="https://datatables.net/reference/option/initComplete">Reference:</see>
88+
/// </summary>
89+
/// <param name="functionName"></param>
90+
/// <returns></returns>
91+
public CallbackBuilder<T> InitComplete(string functionName)
92+
{
93+
_grid._callBack.InitComplete = functionName;
94+
return this;
95+
}
96+
97+
/// <summary>
98+
/// Set preDrawCallback function <see href="https://datatables.net/reference/option/preDrawCallback">Reference:</see>
99+
/// </summary>
100+
/// <param name="functionName"></param>
101+
/// <returns></returns>
102+
public CallbackBuilder<T> PreDrawCallback(string functionName)
103+
{
104+
_grid._callBack.PreDrawCallback = functionName;
105+
return this;
106+
}
107+
108+
/// <summary>
109+
/// Set rowCallback function <see href="https://datatables.net/reference/option/rowCallback">Reference:</see>
110+
/// </summary>
111+
/// <param name="functionName"></param>
112+
/// <returns></returns>
113+
public CallbackBuilder<T> RowCallback(string functionName)
114+
{
115+
_grid._callBack.RowCallback = functionName;
116+
return this;
117+
}
118+
119+
/// <summary>
120+
/// Set stateLoadCallback function <see href="https://datatables.net/reference/option/stateLoadCallback">Reference:</see>
121+
/// </summary>
122+
/// <param name="functionName"></param>
123+
/// <returns></returns>
124+
public CallbackBuilder<T> StateLoadCallback(string functionName)
125+
{
126+
_grid._callBack.StateLoadCallback = functionName;
127+
_grid._stateSave = true;
128+
return this;
129+
}
130+
131+
/// <summary>
132+
/// Set stateLoadParams function <see href="https://datatables.net/reference/option/stateLoadParams">Reference:</see>
133+
/// </summary>
134+
/// <param name="functionName"></param>
135+
/// <returns></returns>
136+
public CallbackBuilder<T> StateLoadParams(string functionName)
137+
{
138+
_grid._callBack.StateLoadParams = functionName;
139+
_grid._stateSave = true;
140+
return this;
141+
}
142+
143+
/// <summary>
144+
/// Set stateLoaded function <see href="https://datatables.net/reference/option/stateLoaded">Reference:</see>
145+
/// </summary>
146+
/// <param name="functionName"></param>
147+
/// <returns></returns>
148+
public CallbackBuilder<T> StateLoaded(string functionName)
149+
{
150+
_grid._callBack.StateLoaded = functionName;
151+
_grid._stateSave = true;
152+
return this;
153+
}
154+
155+
/// <summary>
156+
/// Set stateSaveCallback function <see href="https://datatables.net/reference/option/stateSaveCallback">Reference:</see>
157+
/// </summary>
158+
/// <param name="functionName"></param>
159+
/// <returns></returns>
160+
public CallbackBuilder<T> StateSaveCallback(string functionName)
161+
{
162+
_grid._callBack.StateSaveCallback = functionName;
163+
_grid._stateSave = true;
164+
return this;
165+
}
166+
167+
/// <summary>
168+
/// Set stateSaveParams function <see href="https://datatables.net/reference/option/stateSaveParams">Reference:</see>
169+
/// </summary>
170+
/// <param name="functionName"></param>
171+
/// <returns></returns>
172+
public CallbackBuilder<T> StateSaveParams(string functionName)
173+
{
174+
_grid._callBack.StateSaveParams = functionName;
175+
_grid._stateSave = true;
176+
return this;
177+
}
178+
}
179+
}

DatatableJS.Net/Builders/GridBuilder.cs

Lines changed: 38 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -31,28 +31,19 @@ public class GridBuilder<T>
3131
internal int? _pageLength { get; private set; }
3232
internal bool _processing { get; private set; } = true;
3333
internal bool _scrollX { get; private set; }
34+
internal bool _stateSave { get; set; }
3435

3536
internal bool _selectEnable { get; private set; }
3637
internal SelectStyle _selectStyle { get; private set; }
3738
internal SelectItems _selectItems { get; private set; }
3839
internal bool _selectInfo { get; private set; }
3940
internal bool _selectToggleable { get; private set; }
40-
internal string _FunctionAfterLoad { get; set; }
4141

4242
internal List<ColumnDefinition> _columns = new List<ColumnDefinition>();
4343
internal List<FilterDefinition> _filters = new List<FilterDefinition>();
4444
internal List<OrderDefinition> _orders = new List<OrderDefinition>();
4545

46-
/// <summary>
47-
/// Default name is "".
48-
/// </summary>
49-
/// <param name="functionAfterLoad"></param>
50-
/// <returns></returns>
51-
public GridBuilder<T> FunctionAfterLoad(string functionAfterLoad)
52-
{
53-
_FunctionAfterLoad = functionAfterLoad;
54-
return this;
55-
}
46+
internal CallbackModel _callBack = new CallbackModel();
5647

5748
/// <summary>
5849
/// Default name is "DataGrid".
@@ -89,6 +80,31 @@ public GridBuilder<T> Filters(Action<FilterBuilder<T>> config)
8980
return this;
9081
}
9182

83+
/// <summary>
84+
/// Enable ordering and set default orders.
85+
/// </summary>
86+
/// <param name="config"></param>
87+
/// <returns></returns>
88+
public GridBuilder<T> Orders(Action<OrderBuilder<T>> config)
89+
{
90+
_ordering = true;
91+
var builder = new OrderBuilder<T>(this);
92+
config(builder);
93+
return this;
94+
}
95+
96+
/// <summary>
97+
/// Set callback functions. <see href="https://datatables.net/reference/option/">Reference:</see>
98+
/// </summary>
99+
/// <param name="config"></param>
100+
/// <returns></returns>
101+
public GridBuilder<T> Callbacks(Action<CallbackBuilder<T>> config)
102+
{
103+
var builder = new CallbackBuilder<T>(this);
104+
config(builder);
105+
return this;
106+
}
107+
92108
/// <summary>
93109
/// Set the action url and type, default type is GET.
94110
/// </summary>
@@ -123,19 +139,6 @@ public GridBuilder<T> Ordering(bool ordering)
123139
return this;
124140
}
125141

126-
/// <summary>
127-
/// Enable ordering and set default orders.
128-
/// </summary>
129-
/// <param name="config"></param>
130-
/// <returns></returns>
131-
public GridBuilder<T> Orders(Action<OrderBuilder<T>> config)
132-
{
133-
_ordering = true;
134-
var builder = new OrderBuilder<T>(this);
135-
config(builder);
136-
return this;
137-
}
138-
139142
/// <summary>
140143
/// Disable or enable searching, default is true.
141144
/// </summary>
@@ -361,6 +364,17 @@ public GridBuilder<T> ScrollX(bool scrollX)
361364
return this;
362365
}
363366

367+
/// <summary>
368+
/// Enable or disable state saving such as pagination position, display length, filtering and sorting information.
369+
/// </summary>
370+
/// <param name="stateSave"></param>
371+
/// <returns></returns>
372+
public GridBuilder<T> StateSave(bool stateSave)
373+
{
374+
_stateSave = stateSave;
375+
return this;
376+
}
377+
364378
/// <summary>
365379
/// Enable selection and set properties
366380
/// </summary>

DatatableJS.Net/JSHelper.cs

Lines changed: 55 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -81,45 +81,47 @@ public static MvcHtmlString Render<T>(this GridBuilder<T> gridBuilder)
8181

8282
var tfootInit = string.Empty;
8383

84-
if(!String.IsNullOrEmpty(gridBuilder._FunctionAfterLoad) && gridBuilder._columnSearching==false)
85-
{
86-
tfootInit = "initComplete: function () {";
87-
tfootInit += gridBuilder._FunctionAfterLoad + "();";
88-
tfootInit += "},";
89-
} else if(!String.IsNullOrEmpty(gridBuilder._FunctionAfterLoad) && gridBuilder._columnSearching == true)
90-
{
91-
tfootInit = gridBuilder._columnSearching ?
92-
$@"initComplete: function () {{
93-
" + gridBuilder._FunctionAfterLoad + $@"
94-
this.api().columns().every(function() {{
95-
var that = this;
96-
$('input', this.footer()).on('keyup change clear', function () {{
97-
if (that.search() !== this.value) {{
98-
that
99-
.search(this.value)
100-
.draw();
101-
}}
102-
}});
103-
}});
104-
}},"
105-
: string.Empty;
106-
} else if(String.IsNullOrEmpty(gridBuilder._FunctionAfterLoad) && gridBuilder._columnSearching == true)
107-
{
108-
tfootInit = gridBuilder._columnSearching ?
109-
$@"initComplete: function () {{
110-
this.api().columns().every(function() {{
111-
var that = this;
112-
$('input', this.footer()).on('keyup change clear', function () {{
113-
if (that.search() !== this.value) {{
114-
that
115-
.search(this.value)
116-
.draw();
117-
}}
118-
}});
119-
}});
120-
}},"
121-
: string.Empty;
122-
}
84+
if (!String.IsNullOrEmpty(gridBuilder._callBack.InitComplete) && gridBuilder._columnSearching == false)
85+
{
86+
tfootInit = "initComplete: function (settings, json) {";
87+
tfootInit += gridBuilder._callBack.InitComplete + "(settings, json);";
88+
tfootInit += "},";
89+
}
90+
else if (!String.IsNullOrEmpty(gridBuilder._callBack.InitComplete) && gridBuilder._columnSearching == true)
91+
{
92+
tfootInit = gridBuilder._columnSearching ?
93+
$@"initComplete: function () {{
94+
{gridBuilder._callBack.InitComplete}(settings, json);
95+
this.api().columns().every(function() {{
96+
var that = this;
97+
$('input', this.footer()).on('keyup change clear', function () {{
98+
if (that.search() !== this.value) {{
99+
that
100+
.search(this.value)
101+
.draw();
102+
}}
103+
}});
104+
}});
105+
}},"
106+
: string.Empty;
107+
}
108+
else if (String.IsNullOrEmpty(gridBuilder._callBack.InitComplete) && gridBuilder._columnSearching == true)
109+
{
110+
tfootInit = gridBuilder._columnSearching ?
111+
$@"initComplete: function () {{
112+
this.api().columns().every(function() {{
113+
var that = this;
114+
$('input', this.footer()).on('keyup change clear', function () {{
115+
if (that.search() !== this.value) {{
116+
that
117+
.search(this.value)
118+
.draw();
119+
}}
120+
}});
121+
}});
122+
}},"
123+
: string.Empty;
124+
}
123125

124126
var selectInit = gridBuilder._selectEnable ?
125127
$@"select: {{
@@ -153,6 +155,7 @@ public static MvcHtmlString Render<T>(this GridBuilder<T> gridBuilder)
153155
{tfootInit}
154156
processing:{gridBuilder._processing.ToLowString()},
155157
scrollX:{gridBuilder._scrollX.ToLowString()},
158+
stateSave:{gridBuilder._stateSave.ToLowString()},
156159
serverSide:{gridBuilder._serverSide.ToLowString()},
157160
{selectInit}
158161
fixedColumns: {{
@@ -164,6 +167,19 @@ public static MvcHtmlString Render<T>(this GridBuilder<T> gridBuilder)
164167
searching: {gridBuilder._searching.ToLowString()},
165168
paging: {gridBuilder._paging.ToLowString()},
166169
{lengthMenu}
170+
{(!string.IsNullOrEmpty(gridBuilder._callBack.CreatedRow) ? $"createdRow: function (row, data, dataIndex, cells) {{ {gridBuilder._callBack.CreatedRow}(row, data, dataIndex, cells); }}," : string.Empty) }
171+
{(!string.IsNullOrEmpty(gridBuilder._callBack.DrawCallback) ? $"drawCallback: function (settings) {{ {gridBuilder._callBack.DrawCallback}(settings); }}," : string.Empty) }
172+
{(!string.IsNullOrEmpty(gridBuilder._callBack.FooterCallback) ? $"footerCallback: function (tfoot, data, start, end, display) {{ {gridBuilder._callBack.FooterCallback}(tfoot, data, start, end, display); }}," : string.Empty) }
173+
{(!string.IsNullOrEmpty(gridBuilder._callBack.FormatNumber) ? $"formatNumber: function (toFormat) {{ {gridBuilder._callBack.FormatNumber}(toFormat); }}," : string.Empty) }
174+
{(!string.IsNullOrEmpty(gridBuilder._callBack.HeaderCallback) ? $"headerCallback: function (thead, data, start, end, display) {{ {gridBuilder._callBack.HeaderCallback}(thead, data, start, end, display); }}," : string.Empty) }
175+
{(!string.IsNullOrEmpty(gridBuilder._callBack.InfoCallback) ? $"infoCallback: function (settings, start, end, max, total, pre) {{ {gridBuilder._callBack.InfoCallback}(settings, start, end, max, total, pre); }}," : string.Empty) }
176+
{(!string.IsNullOrEmpty(gridBuilder._callBack.PreDrawCallback) ? $"preDrawCallback: function (settings) {{ {gridBuilder._callBack.PreDrawCallback}(settings); }}," : string.Empty) }
177+
{(!string.IsNullOrEmpty(gridBuilder._callBack.RowCallback) ? $"rowCallback: function (row, data, displayNum, displayIndex, dataIndex) {{ {gridBuilder._callBack.RowCallback}(row, data, displayNum, displayIndex, dataIndex); }}," : string.Empty) }
178+
{(!string.IsNullOrEmpty(gridBuilder._callBack.StateLoadCallback) ? $"stateLoadCallback: function (settings, callback) {{ {gridBuilder._callBack.StateLoadCallback}(settings, callback); }}," : string.Empty) }
179+
{(!string.IsNullOrEmpty(gridBuilder._callBack.StateLoadParams) ? $"stateLoadParams: function (settings, data) {{ {gridBuilder._callBack.StateLoadParams}(settings, data); }}," : string.Empty) }
180+
{(!string.IsNullOrEmpty(gridBuilder._callBack.StateLoaded) ? $"stateLoaded: function (settings, data) {{ {gridBuilder._callBack.StateLoaded}(settings, data); }}," : string.Empty) }
181+
{(!string.IsNullOrEmpty(gridBuilder._callBack.StateSaveCallback) ? $"stateSaveCallback: function (settings, data) {{ {gridBuilder._callBack.StateSaveCallback}(settings, data); }}," : string.Empty) }
182+
{(!string.IsNullOrEmpty(gridBuilder._callBack.StateSaveParams) ? $"stateSaveParams: function (settings, data) {{ {gridBuilder._callBack.StateSaveParams}(settings, data); }}," : string.Empty) }
167183
{(!gridBuilder._pageLength.HasValue ? string.Empty : $"pageLength: {gridBuilder._pageLength.Value},")}
168184
language: {{
169185
'url': '{gridBuilder._langUrl}'

0 commit comments

Comments
 (0)