slickgrid 2.3.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +20 -0
  4. data/README.md +30 -0
  5. data/lib/slickgrid.rb +6 -0
  6. data/lib/slickgrid/version.rb +3 -0
  7. data/slickgrid.gemspec +20 -0
  8. data/vendor/assets/images/slickgrid/CheckboxN.png +0 -0
  9. data/vendor/assets/images/slickgrid/CheckboxY.png +0 -0
  10. data/vendor/assets/images/slickgrid/GrpCheckboxN.png +0 -0
  11. data/vendor/assets/images/slickgrid/GrpCheckboxY.png +0 -0
  12. data/vendor/assets/images/slickgrid/actions.gif +0 -0
  13. data/vendor/assets/images/slickgrid/ajax-loader-small.gif +0 -0
  14. data/vendor/assets/images/slickgrid/arrow-right.gif +0 -0
  15. data/vendor/assets/images/slickgrid/arrow_redo.png +0 -0
  16. data/vendor/assets/images/slickgrid/arrow_right_peppermint.png +0 -0
  17. data/vendor/assets/images/slickgrid/arrow_right_spearmint.png +0 -0
  18. data/vendor/assets/images/slickgrid/arrow_undo.png +0 -0
  19. data/vendor/assets/images/slickgrid/bullet_blue.png +0 -0
  20. data/vendor/assets/images/slickgrid/bullet_star.png +0 -0
  21. data/vendor/assets/images/slickgrid/bullet_toggle_minus.png +0 -0
  22. data/vendor/assets/images/slickgrid/bullet_toggle_plus.png +0 -0
  23. data/vendor/assets/images/slickgrid/calendar.gif +0 -0
  24. data/vendor/assets/images/slickgrid/collapse.gif +0 -0
  25. data/vendor/assets/images/slickgrid/comment_yellow.gif +0 -0
  26. data/vendor/assets/images/slickgrid/delete.png +0 -0
  27. data/vendor/assets/images/slickgrid/down.gif +0 -0
  28. data/vendor/assets/images/slickgrid/drag-handle.png +0 -0
  29. data/vendor/assets/images/slickgrid/editor-helper-bg.gif +0 -0
  30. data/vendor/assets/images/slickgrid/expand.gif +0 -0
  31. data/vendor/assets/images/slickgrid/header-bg.gif +0 -0
  32. data/vendor/assets/images/slickgrid/header-columns-bg.gif +0 -0
  33. data/vendor/assets/images/slickgrid/header-columns-over-bg.gif +0 -0
  34. data/vendor/assets/images/slickgrid/help.png +0 -0
  35. data/vendor/assets/images/slickgrid/info.gif +0 -0
  36. data/vendor/assets/images/slickgrid/listview.gif +0 -0
  37. data/vendor/assets/images/slickgrid/pencil.gif +0 -0
  38. data/vendor/assets/images/slickgrid/row-over-bg.gif +0 -0
  39. data/vendor/assets/images/slickgrid/sort-asc.gif +0 -0
  40. data/vendor/assets/images/slickgrid/sort-asc.png +0 -0
  41. data/vendor/assets/images/slickgrid/sort-desc.gif +0 -0
  42. data/vendor/assets/images/slickgrid/sort-desc.png +0 -0
  43. data/vendor/assets/images/slickgrid/stripes.png +0 -0
  44. data/vendor/assets/images/slickgrid/tag_red.png +0 -0
  45. data/vendor/assets/images/slickgrid/tick.png +0 -0
  46. data/vendor/assets/images/slickgrid/user_identity.gif +0 -0
  47. data/vendor/assets/images/slickgrid/user_identity_plus.gif +0 -0
  48. data/vendor/assets/javascripts/slickgrid.js +5 -0
  49. data/vendor/assets/javascripts/slickgrid/controls/columnpicker.js +221 -0
  50. data/vendor/assets/javascripts/slickgrid/controls/gridmenu.js +429 -0
  51. data/vendor/assets/javascripts/slickgrid/controls/pager.js +154 -0
  52. data/vendor/assets/javascripts/slickgrid/core.js +493 -0
  53. data/vendor/assets/javascripts/slickgrid/dataview.js +1220 -0
  54. data/vendor/assets/javascripts/slickgrid/editors.js +640 -0
  55. data/vendor/assets/javascripts/slickgrid/formatters.js +65 -0
  56. data/vendor/assets/javascripts/slickgrid/grid.js +3990 -0
  57. data/vendor/assets/javascripts/slickgrid/groupitemmetadataprovider.js +172 -0
  58. data/vendor/assets/javascripts/slickgrid/plugins/autotooltips.js +83 -0
  59. data/vendor/assets/javascripts/slickgrid/plugins/cellcopymanager.js +88 -0
  60. data/vendor/assets/javascripts/slickgrid/plugins/cellexternalcopymanager.js +452 -0
  61. data/vendor/assets/javascripts/slickgrid/plugins/cellrangedecorator.js +72 -0
  62. data/vendor/assets/javascripts/slickgrid/plugins/cellrangeselector.js +123 -0
  63. data/vendor/assets/javascripts/slickgrid/plugins/cellselectionmodel.js +168 -0
  64. data/vendor/assets/javascripts/slickgrid/plugins/checkboxselectcolumn.js +202 -0
  65. data/vendor/assets/javascripts/slickgrid/plugins/draggablegrouping.js +207 -0
  66. data/vendor/assets/javascripts/slickgrid/plugins/headerbuttons.js +177 -0
  67. data/vendor/assets/javascripts/slickgrid/plugins/headermenu.js +296 -0
  68. data/vendor/assets/javascripts/slickgrid/plugins/rowdetailview.js +455 -0
  69. data/vendor/assets/javascripts/slickgrid/plugins/rowmovemanager.js +138 -0
  70. data/vendor/assets/javascripts/slickgrid/plugins/rowselectionmodel.js +191 -0
  71. data/vendor/assets/javascripts/slickgrid/remotemodel.js +169 -0
  72. data/vendor/assets/stylesheets/slickgrid.scss +1 -0
  73. data/vendor/assets/stylesheets/slickgrid/controls/columnpicker.css +46 -0
  74. data/vendor/assets/stylesheets/slickgrid/controls/gridmenu.css +113 -0
  75. data/vendor/assets/stylesheets/slickgrid/controls/pager.css +41 -0
  76. data/vendor/assets/stylesheets/slickgrid/default-theme.css +132 -0
  77. data/vendor/assets/stylesheets/slickgrid/grid.css +189 -0
  78. data/vendor/assets/stylesheets/slickgrid/plugins/headerbuttons.css +39 -0
  79. data/vendor/assets/stylesheets/slickgrid/plugins/headermenu.css +59 -0
  80. data/vendor/assets/stylesheets/slickgrid/plugins/rowdetailview.css +39 -0
  81. metadata +165 -0
@@ -0,0 +1,455 @@
1
+ /***
2
+ * A plugin to add row detail panel
3
+ * Original StackOverflow question & article making this possible (thanks to violet313)
4
+ * https://stackoverflow.com/questions/10535164/can-slickgrids-row-height-be-dynamically-altered#29399927
5
+ * http://violet313.org/slickgrids/#intro
6
+ *
7
+ *
8
+ * USAGE:
9
+ *
10
+ * Add the slick.rowDetailView.(js|css) files and register the plugin with the grid.
11
+ *
12
+ * AVAILABLE ROW DETAIL OPTIONS:
13
+ * cssClass: A CSS class to be added to the row detail
14
+ * loadOnce: Booleang flag, when True will load the data once and then reuse it.
15
+ * preTemplate: Template that will be used before the async process (typically used to show a spinner/loading)
16
+ * postTemplate: Template that will be loaded once the async function finishes
17
+ * process: Async server function call
18
+ * panelRows: Row count to use for the template panel
19
+ * useRowClick: Boolean flag, when True will open the row detail on a row click (from any column), default to False
20
+ *
21
+ * AVAILABLE PUBLIC OPTIONS:
22
+ * init: initiliaze the plugin
23
+ * destroy: destroy the plugin and it's events
24
+ * collapseAll: collapse all opened row detail panel
25
+ * getColumnDefinition: get the column definitions
26
+ * getOptions: get current plugin options
27
+ * setOptions: set or change some of the plugin options
28
+ *
29
+ * THE PLUGIN EXPOSES THE FOLLOWING SLICK EVENTS:
30
+ * onAsyncResponse: This event must be used with the "notify" by the end user once the Asynchronous Server call returns the item detail
31
+ * Event args:
32
+ * itemDetail: Item detail returned from the async server call
33
+ * detailView: An explicit view to use instead of template (Optional)
34
+ *
35
+ * onAsyncEndUpdate: Fired when the async response finished
36
+ * Event args:
37
+ * grid: Reference to the grid.
38
+ * itemDetail: Column definition.
39
+ *
40
+ * onBeforeRowDetailToggle: Fired before the row detail gets toggled
41
+ * Event args:
42
+ * grid: Reference to the grid.
43
+ * item: Column definition.
44
+ *
45
+ * onAfterRowDetailToggle: Fired after the row detail gets toggled
46
+ * Event args:
47
+ * grid: Reference to the grid.
48
+ * item: Column definition.
49
+ *
50
+ */
51
+ (function ($) {
52
+ // register namespace
53
+ $.extend(true, window, {
54
+ "Slick": {
55
+ "Plugins": {
56
+ "RowDetailView": RowDetailView
57
+ }
58
+ }
59
+ });
60
+
61
+
62
+ function RowDetailView(options) {
63
+ var _grid;
64
+ var _self = this;
65
+ var _expandedRows = [];
66
+ var _handler = new Slick.EventHandler();
67
+ var _defaults = {
68
+ columnId: "_detail_selector",
69
+ cssClass: null,
70
+ toolTip: "",
71
+ width: 30
72
+ };
73
+
74
+ var _options = $.extend(true, {}, _defaults, options);
75
+
76
+ function init(grid) {
77
+ _grid = grid;
78
+ _dataView = _grid.getData();
79
+
80
+ // Update the minRowBuffer so that the view doesn't disappear when it's at top of screen + the original default 3
81
+ _grid.getOptions().minRowBuffer = _options.panelRows + 3;
82
+
83
+ _handler
84
+ .subscribe(_grid.onClick, handleClick)
85
+ .subscribe(_grid.onSort, handleSort)
86
+ .subscribe(_grid.onScroll, handleScroll);
87
+
88
+ _grid.getData().onRowCountChanged.subscribe(function () { _grid.updateRowCount(); _grid.render(); });
89
+ _grid.getData().onRowsChanged.subscribe(function (e, a) { _grid.invalidateRows(a.rows); _grid.render(); });
90
+
91
+ // subscribe to the onAsyncResponse so that the plugin knows when the user server side calls finished
92
+ subscribeToOnAsyncResponse();
93
+ }
94
+
95
+ function destroy() {
96
+ _handler.unsubscribeAll();
97
+ _self.onAsyncResponse.unsubscribe();
98
+ _self.onAsyncEndUpdate.unsubscribe();
99
+ _self.onAfterRowDetailToggle.unsubscribe();
100
+ _self.onBeforeRowDetailToggle.unsubscribe();
101
+ }
102
+
103
+ function getOptions(options) {
104
+ return _options;
105
+ }
106
+
107
+ function setOptions(options) {
108
+ _options = $.extend(true, {}, _options, options);
109
+ }
110
+
111
+ function handleClick(e, args) {
112
+ // clicking on a row select checkbox
113
+ if (_options.useRowClick || _grid.getColumns()[args.cell].id === _options.columnId && $(e.target).hasClass("detailView-toggle")) {
114
+ // if editing, try to commit
115
+ if (_grid.getEditorLock().isActive() && !_grid.getEditorLock().commitCurrentEdit()) {
116
+ e.preventDefault();
117
+ e.stopImmediatePropagation();
118
+ return;
119
+ }
120
+
121
+ var item = _dataView.getItem(args.row);
122
+
123
+ // trigger an event before toggling
124
+ _self.onBeforeRowDetailToggle.notify({
125
+ "grid": _grid,
126
+ "item": item
127
+ }, e, _self);
128
+
129
+ toggleRowSelection(item);
130
+
131
+ // trigger an event after toggling
132
+ _self.onAfterRowDetailToggle.notify({
133
+ "grid": _grid,
134
+ "item": item
135
+ }, e, _self);
136
+
137
+ e.stopPropagation();
138
+ e.stopImmediatePropagation();
139
+ }
140
+ }
141
+
142
+ // Sort will just collapse all of the open items
143
+ function handleSort(e, args) {
144
+ collapseAll();
145
+ }
146
+
147
+ // If we scroll save detail views that go out of cache range
148
+ function handleScroll(e, args) {
149
+
150
+ var range = _grid.getRenderedRange();
151
+
152
+ var start = (range.top > 0 ? range.top : 0);
153
+ var end = (range.bottom > _dataView.getLength() ? range.bottom : _dataView.getLength());
154
+
155
+ // Get the item at the top of the view
156
+ var topMostItem = _dataView.getItemByIdx(start);
157
+
158
+ // Check it is a parent item
159
+ if (topMostItem._parent == undefined)
160
+ {
161
+ // This is a standard row as we have no parent.
162
+ var nextItem = _dataView.getItemByIdx(start + 1);
163
+ if(nextItem !== undefined && nextItem._parent !== undefined)
164
+ {
165
+ // This is likely the expanded Detail Row View
166
+ // Check for safety
167
+ if(nextItem._parent == topMostItem)
168
+ {
169
+ saveDetailView(topMostItem);
170
+ }
171
+ }
172
+ }
173
+
174
+ // Find the bottom most item that is likely to go off screen
175
+ var bottomMostItem = _dataView.getItemByIdx(end - 1);
176
+
177
+ // If we are a detailView and we are about to go out of cache view
178
+ if(bottomMostItem._parent !== undefined)
179
+ {
180
+ saveDetailView(bottomMostItem._parent);
181
+
182
+ }
183
+ }
184
+
185
+ // Toggle between showing and hiding a row
186
+ function toggleRowSelection(row) {
187
+ _grid.getData().beginUpdate();
188
+ HandleAccordionShowHide(row);
189
+ _grid.getData().endUpdate();
190
+ }
191
+
192
+ // Collapse all of the open items
193
+ function collapseAll() {
194
+ for (var i = _expandedRows.length - 1; i >= 0; i--) {
195
+ collapseItem(_expandedRows[i]);
196
+ }
197
+ }
198
+
199
+ // Saves the current state of the detail view
200
+ function saveDetailView(item)
201
+ {
202
+ var view = $("#innerDetailView_" + item.id);
203
+ if (view)
204
+ {
205
+ var html = $("#innerDetailView_" + item.id).html();
206
+ if(html !== undefined)
207
+ {
208
+ item._detailContent = html;
209
+ }
210
+ }
211
+ }
212
+
213
+ // Colapse an Item so it is notlonger seen
214
+ function collapseItem(item) {
215
+
216
+ // Save the details on the collapse assuming onetime loading
217
+ if (_options.loadOnce) {
218
+ saveDetailView(item);
219
+ }
220
+
221
+ item._collapsed = true;
222
+ for (var idx = 1; idx <= item._sizePadding; idx++) {
223
+ _dataView.deleteItem(item.id + "." + idx);
224
+ }
225
+ item._sizePadding = 0;
226
+ _dataView.updateItem(item.id, item);
227
+
228
+ // Remove the item from the expandedRows
229
+ _expandedRows = _expandedRows.filter(function (r) {
230
+ return r.id !== item.id;
231
+ });
232
+ }
233
+
234
+ // Expand a row given the dataview item that is to be expanded
235
+ function expandItem(item) {
236
+ item._collapsed = false;
237
+ _expandedRows.push(item);
238
+
239
+ // In the case something went wrong loading it the first time such a scroll of screen before loaded
240
+ if (!item._detailContent) item._detailViewLoaded = false;
241
+
242
+ // display pre-loading template
243
+ if (!item._detailViewLoaded || _options.loadOnce !== true) {
244
+ item._detailContent = _options.preTemplate(item);
245
+ } else {
246
+ _self.onAsyncResponse.notify({
247
+ "itemDetail": item,
248
+ "detailView": item._detailContent
249
+ }, undefined, this);
250
+ applyTemplateNewLineHeight(item);
251
+ _dataView.updateItem(item.id, item);
252
+
253
+ return;
254
+ }
255
+
256
+ applyTemplateNewLineHeight(item);
257
+ _dataView.updateItem(item.id, item);
258
+
259
+ // async server call
260
+ _options.process(item);
261
+ }
262
+
263
+ /**
264
+ * subscribe to the onAsyncResponse so that the plugin knows when the user server side calls finished
265
+ * the response has to be as "args.itemDetail" with it's data back
266
+ */
267
+ function subscribeToOnAsyncResponse() {
268
+ _self.onAsyncResponse.subscribe(function (e, args) {
269
+ if (!args || !args.itemDetail) {
270
+ throw 'Slick.RowDetailView plugin requires the onAsyncResponse() to supply "args.itemDetail" property.'
271
+ }
272
+
273
+ // If we just want to load in a view directly we can use detailView property to do so
274
+ if (args.detailView) {
275
+ args.itemDetail._detailContent = args.detailView;
276
+ } else {
277
+ args.itemDetail._detailContent = _options.postTemplate(args.itemDetail);
278
+ }
279
+
280
+ args.itemDetail._detailViewLoaded = true;
281
+
282
+ var idxParent = _dataView.getIdxById(args.itemDetail.id);
283
+ _dataView.updateItem(args.itemDetail.id, args.itemDetail);
284
+
285
+ // trigger an event once the post template is finished loading
286
+ _self.onAsyncEndUpdate.notify({
287
+ "grid": _grid,
288
+ "itemDetail": args.itemDetail
289
+ }, e, _self);
290
+ });
291
+ }
292
+
293
+ function HandleAccordionShowHide(item) {
294
+ if (item) {
295
+ if (!item._collapsed) {
296
+ collapseItem(item);
297
+ } else {
298
+ expandItem(item);
299
+ }
300
+ }
301
+ }
302
+
303
+ //////////////////////////////////////////////////////////////
304
+ //////////////////////////////////////////////////////////////
305
+ var getPaddingItem = function (parent, offset) {
306
+ var item = {};
307
+
308
+ for (var prop in _grid.getData()) {
309
+ item[prop] = null;
310
+ }
311
+ item.id = parent.id + "." + offset;
312
+
313
+ //additional hidden padding metadata fields
314
+ item._collapsed = true;
315
+ item._isPadding = true;
316
+ item._parent = parent;
317
+ item._offset = offset;
318
+
319
+ return item;
320
+ }
321
+
322
+ //////////////////////////////////////////////////////////////
323
+ //create the detail ctr node. this belongs to the dev & can be custom-styled as per
324
+ //////////////////////////////////////////////////////////////
325
+ function applyTemplateNewLineHeight(item) {
326
+ // the height seems to be calculated by the template row count (how many line of items does the template have)
327
+ var rowCount = _options.panelRows;
328
+
329
+ //calculate padding requirements based on detail-content..
330
+ //ie. worst-case: create an invisible dom node now &find it's height.
331
+ var lineHeight = 13; //we know cuz we wrote the custom css innit ;)
332
+ item._sizePadding = Math.ceil(((rowCount * 2) * lineHeight) / _grid.getOptions().rowHeight);
333
+ item._height = (item._sizePadding * _grid.getOptions().rowHeight);
334
+
335
+ var idxParent = _dataView.getIdxById(item.id);
336
+ for (var idx = 1; idx <= item._sizePadding; idx++) {
337
+ _dataView.insertItem(idxParent + idx, getPaddingItem(item, idx));
338
+ }
339
+ }
340
+
341
+
342
+ function getColumnDefinition() {
343
+ return {
344
+ id: _options.columnId,
345
+ name: "",
346
+ toolTip: _options.toolTip,
347
+ field: "sel",
348
+ width: _options.width,
349
+ resizable: false,
350
+ sortable: false,
351
+ cssClass: _options.cssClass,
352
+ formatter: detailSelectionFormatter
353
+ };
354
+ }
355
+
356
+ function detailSelectionFormatter(row, cell, value, columnDef, dataContext) {
357
+
358
+ if (dataContext._collapsed == undefined) {
359
+ dataContext._collapsed = true,
360
+ dataContext._sizePadding = 0, //the required number of pading rows
361
+ dataContext._height = 0, //the actual height in pixels of the detail field
362
+ dataContext._isPadding = false,
363
+ dataContext._parent = undefined,
364
+ dataContext._offset = 0
365
+ }
366
+
367
+ if (dataContext._isPadding == true) {
368
+ //render nothing
369
+ } else if (dataContext._collapsed) {
370
+ return "<div class='detailView-toggle expand'></div>";
371
+ } else {
372
+ var html = [];
373
+ var rowHeight = _grid.getOptions().rowHeight;
374
+ var bottomMargin = 5;
375
+
376
+ //V313HAX:
377
+ //putting in an extra closing div after the closing toggle div and ommiting a
378
+ //final closing div for the detail ctr div causes the slickgrid renderer to
379
+ //insert our detail div as a new column ;) ~since it wraps whatever we provide
380
+ //in a generic div column container. so our detail becomes a child directly of
381
+ //the row not the cell. nice =) ~no need to apply a css change to the parent
382
+ //slick-cell to escape the cell overflow clipping.
383
+
384
+ //sneaky extra </div> inserted here-----------------v
385
+ html.push("<div class='detailView-toggle collapse'></div></div>");
386
+
387
+ html.push("<div id='cellDetailView_", dataContext.id, "' class='dynamic-cell-detail' "); //apply custom css to detail
388
+ html.push("style='height:", dataContext._height, "px;"); //set total height of padding
389
+ html.push("top:", rowHeight, "px'>"); //shift detail below 1st row
390
+ html.push("<div id='detailViewContainer_", dataContext.id, "' class='detail-container' style='max-height:" + (dataContext._height - rowHeight + bottomMargin) + "px'>"); //sub ctr for custom styling
391
+ html.push("<div id='innerDetailView_" , dataContext.id , "'>" , dataContext._detailContent, "</div></div>");
392
+ //&omit a final closing detail container </div> that would come next
393
+
394
+ return html.join("");
395
+ }
396
+ return null;
397
+ }
398
+
399
+ function resizeDetailView(item) {
400
+ if (!item) return;
401
+
402
+ // Grad each of the dom items
403
+ var mainContainer = document.getElementById('detailViewContainer_' + item.id);
404
+ var cellItem = document.getElementById('cellDetailView_' + item.id);
405
+ var inner = document.getElementById('innerDetailView_' + item.id);
406
+
407
+ if (!mainContainer || !cellItem || !inner) return;
408
+
409
+ for (var idx = 1; idx <= item._sizePadding; idx++) {
410
+ _dataView.deleteItem(item.id + "." + idx);
411
+ }
412
+
413
+ var rowHeight = _grid.getOptions().rowHeight; // height of a row
414
+ var lineHeight = 13; //we know cuz we wrote the custom css innit ;)
415
+
416
+ // Get the inner Item height as this will be the actual size
417
+ var itemHeight = inner.clientHeight;
418
+
419
+ // Now work out how many rows
420
+ var rowCount = Math.ceil(itemHeight / rowHeight) + 1;
421
+
422
+ item._sizePadding = Math.ceil(((rowCount * 2) * lineHeight) / rowHeight);
423
+ item._height = (item._sizePadding * rowHeight);
424
+
425
+ // If the padding is now more than the original minRowBuff we need to increase it
426
+ if (_grid.getOptions().minRowBuffer < item._sizePadding)
427
+ {
428
+ // Update the minRowBuffer so that the view doesn't disappear when it's at top of screen + the original default 3
429
+ _grid.getOptions().minRowBuffer =item._sizePadding + 3;
430
+ }
431
+
432
+ mainContainer.setAttribute("style", "max-height: " + item._height + "px");
433
+ if (cellItem) cellItem.setAttribute("style", "height: " + item._height + "px;top:" + rowHeight + "px");
434
+
435
+ var idxParent = _dataView.getIdxById(item.id);
436
+ for (var idx = 1; idx <= item._sizePadding; idx++) {
437
+ _dataView.insertItem(idxParent + idx, getPaddingItem(item, idx));
438
+ }
439
+ }
440
+
441
+ $.extend(this, {
442
+ "init": init,
443
+ "destroy": destroy,
444
+ "collapseAll": collapseAll,
445
+ "getColumnDefinition": getColumnDefinition,
446
+ "getOptions": getOptions,
447
+ "setOptions": setOptions,
448
+ "onAsyncResponse": new Slick.Event(),
449
+ "onAsyncEndUpdate": new Slick.Event(),
450
+ "onAfterRowDetailToggle": new Slick.Event(),
451
+ "onBeforeRowDetailToggle": new Slick.Event(),
452
+ "resizeDetailView": resizeDetailView
453
+ });
454
+ }
455
+ })(jQuery);