slickgrid 2.3.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +4 -0
- data/LICENSE +20 -0
- data/README.md +30 -0
- data/lib/slickgrid.rb +6 -0
- data/lib/slickgrid/version.rb +3 -0
- data/slickgrid.gemspec +20 -0
- data/vendor/assets/images/slickgrid/CheckboxN.png +0 -0
- data/vendor/assets/images/slickgrid/CheckboxY.png +0 -0
- data/vendor/assets/images/slickgrid/GrpCheckboxN.png +0 -0
- data/vendor/assets/images/slickgrid/GrpCheckboxY.png +0 -0
- data/vendor/assets/images/slickgrid/actions.gif +0 -0
- data/vendor/assets/images/slickgrid/ajax-loader-small.gif +0 -0
- data/vendor/assets/images/slickgrid/arrow-right.gif +0 -0
- data/vendor/assets/images/slickgrid/arrow_redo.png +0 -0
- data/vendor/assets/images/slickgrid/arrow_right_peppermint.png +0 -0
- data/vendor/assets/images/slickgrid/arrow_right_spearmint.png +0 -0
- data/vendor/assets/images/slickgrid/arrow_undo.png +0 -0
- data/vendor/assets/images/slickgrid/bullet_blue.png +0 -0
- data/vendor/assets/images/slickgrid/bullet_star.png +0 -0
- data/vendor/assets/images/slickgrid/bullet_toggle_minus.png +0 -0
- data/vendor/assets/images/slickgrid/bullet_toggle_plus.png +0 -0
- data/vendor/assets/images/slickgrid/calendar.gif +0 -0
- data/vendor/assets/images/slickgrid/collapse.gif +0 -0
- data/vendor/assets/images/slickgrid/comment_yellow.gif +0 -0
- data/vendor/assets/images/slickgrid/delete.png +0 -0
- data/vendor/assets/images/slickgrid/down.gif +0 -0
- data/vendor/assets/images/slickgrid/drag-handle.png +0 -0
- data/vendor/assets/images/slickgrid/editor-helper-bg.gif +0 -0
- data/vendor/assets/images/slickgrid/expand.gif +0 -0
- data/vendor/assets/images/slickgrid/header-bg.gif +0 -0
- data/vendor/assets/images/slickgrid/header-columns-bg.gif +0 -0
- data/vendor/assets/images/slickgrid/header-columns-over-bg.gif +0 -0
- data/vendor/assets/images/slickgrid/help.png +0 -0
- data/vendor/assets/images/slickgrid/info.gif +0 -0
- data/vendor/assets/images/slickgrid/listview.gif +0 -0
- data/vendor/assets/images/slickgrid/pencil.gif +0 -0
- data/vendor/assets/images/slickgrid/row-over-bg.gif +0 -0
- data/vendor/assets/images/slickgrid/sort-asc.gif +0 -0
- data/vendor/assets/images/slickgrid/sort-asc.png +0 -0
- data/vendor/assets/images/slickgrid/sort-desc.gif +0 -0
- data/vendor/assets/images/slickgrid/sort-desc.png +0 -0
- data/vendor/assets/images/slickgrid/stripes.png +0 -0
- data/vendor/assets/images/slickgrid/tag_red.png +0 -0
- data/vendor/assets/images/slickgrid/tick.png +0 -0
- data/vendor/assets/images/slickgrid/user_identity.gif +0 -0
- data/vendor/assets/images/slickgrid/user_identity_plus.gif +0 -0
- data/vendor/assets/javascripts/slickgrid.js +5 -0
- data/vendor/assets/javascripts/slickgrid/controls/columnpicker.js +221 -0
- data/vendor/assets/javascripts/slickgrid/controls/gridmenu.js +429 -0
- data/vendor/assets/javascripts/slickgrid/controls/pager.js +154 -0
- data/vendor/assets/javascripts/slickgrid/core.js +493 -0
- data/vendor/assets/javascripts/slickgrid/dataview.js +1220 -0
- data/vendor/assets/javascripts/slickgrid/editors.js +640 -0
- data/vendor/assets/javascripts/slickgrid/formatters.js +65 -0
- data/vendor/assets/javascripts/slickgrid/grid.js +3990 -0
- data/vendor/assets/javascripts/slickgrid/groupitemmetadataprovider.js +172 -0
- data/vendor/assets/javascripts/slickgrid/plugins/autotooltips.js +83 -0
- data/vendor/assets/javascripts/slickgrid/plugins/cellcopymanager.js +88 -0
- data/vendor/assets/javascripts/slickgrid/plugins/cellexternalcopymanager.js +452 -0
- data/vendor/assets/javascripts/slickgrid/plugins/cellrangedecorator.js +72 -0
- data/vendor/assets/javascripts/slickgrid/plugins/cellrangeselector.js +123 -0
- data/vendor/assets/javascripts/slickgrid/plugins/cellselectionmodel.js +168 -0
- data/vendor/assets/javascripts/slickgrid/plugins/checkboxselectcolumn.js +202 -0
- data/vendor/assets/javascripts/slickgrid/plugins/draggablegrouping.js +207 -0
- data/vendor/assets/javascripts/slickgrid/plugins/headerbuttons.js +177 -0
- data/vendor/assets/javascripts/slickgrid/plugins/headermenu.js +296 -0
- data/vendor/assets/javascripts/slickgrid/plugins/rowdetailview.js +455 -0
- data/vendor/assets/javascripts/slickgrid/plugins/rowmovemanager.js +138 -0
- data/vendor/assets/javascripts/slickgrid/plugins/rowselectionmodel.js +191 -0
- data/vendor/assets/javascripts/slickgrid/remotemodel.js +169 -0
- data/vendor/assets/stylesheets/slickgrid.scss +1 -0
- data/vendor/assets/stylesheets/slickgrid/controls/columnpicker.css +46 -0
- data/vendor/assets/stylesheets/slickgrid/controls/gridmenu.css +113 -0
- data/vendor/assets/stylesheets/slickgrid/controls/pager.css +41 -0
- data/vendor/assets/stylesheets/slickgrid/default-theme.css +132 -0
- data/vendor/assets/stylesheets/slickgrid/grid.css +189 -0
- data/vendor/assets/stylesheets/slickgrid/plugins/headerbuttons.css +39 -0
- data/vendor/assets/stylesheets/slickgrid/plugins/headermenu.css +59 -0
- data/vendor/assets/stylesheets/slickgrid/plugins/rowdetailview.css +39 -0
- metadata +165 -0
@@ -0,0 +1,207 @@
|
|
1
|
+
/**
|
2
|
+
*
|
3
|
+
* Draggable Grouping contributed by: Muthukumar Selvarasu
|
4
|
+
* muthukumar{dot}se{at}gmail{dot}com
|
5
|
+
* github.com/muthukumarse/Slickgrid
|
6
|
+
*
|
7
|
+
* NOTES:
|
8
|
+
* This plugin provides the Draggable Grouping feature
|
9
|
+
*/
|
10
|
+
|
11
|
+
(function ($) {
|
12
|
+
// Register namespace
|
13
|
+
$.extend(true, window, {
|
14
|
+
"Slick": {
|
15
|
+
"DraggableGrouping": DraggableGrouping
|
16
|
+
}
|
17
|
+
});
|
18
|
+
|
19
|
+
/**
|
20
|
+
* DraggableGrouping plugin to show/hide tooltips when columns are too narrow to fit content.
|
21
|
+
* @constructor
|
22
|
+
* @param {boolean} [options.enableForCells=true] - Enable tooltip for grid cells
|
23
|
+
* @param {boolean} [options.enableForHeaderCells=false] - Enable tooltip for header cells
|
24
|
+
* @param {number} [options.maxToolTipLength=null] - The maximum length for a tooltip
|
25
|
+
*/
|
26
|
+
function DraggableGrouping(options) {
|
27
|
+
var _grid;
|
28
|
+
var _gridUid;
|
29
|
+
var _gridColumns;
|
30
|
+
var _dataView;
|
31
|
+
var dropbox;
|
32
|
+
var dropboxPlaceholder;
|
33
|
+
var _self = this;
|
34
|
+
var _defaults = {
|
35
|
+
};
|
36
|
+
|
37
|
+
/**
|
38
|
+
* Initialize plugin.
|
39
|
+
*/
|
40
|
+
function init(grid) {
|
41
|
+
options = $.extend(true, {}, _defaults, options);
|
42
|
+
_grid = grid;
|
43
|
+
_gridUid = _grid.getUID();
|
44
|
+
_gridColumns = _grid.getColumns();
|
45
|
+
_dataView = _grid.getData();
|
46
|
+
|
47
|
+
dropbox = $(_grid.getPreHeaderPanel());
|
48
|
+
dropbox.html("<div class='slick-placeholder'>Drop a column header here to group by the column</div>");
|
49
|
+
|
50
|
+
dropboxPlaceholder = dropbox.find(".slick-placeholder");
|
51
|
+
setupColumnDropbox();
|
52
|
+
}
|
53
|
+
|
54
|
+
/**
|
55
|
+
* Destroy plugin.
|
56
|
+
*/
|
57
|
+
function destroy() {
|
58
|
+
}
|
59
|
+
|
60
|
+
|
61
|
+
function setColumns(col) {
|
62
|
+
_gridColumns = col;
|
63
|
+
}
|
64
|
+
|
65
|
+
var emptyDropbox;
|
66
|
+
|
67
|
+
function setupColumnDropbox() {
|
68
|
+
dropbox.droppable({
|
69
|
+
activeClass: "ui-state-default",
|
70
|
+
hoverClass: "ui-state-hover",
|
71
|
+
accept: ":not(.ui-sortable-helper)",
|
72
|
+
deactivate: function(event, ui) {
|
73
|
+
dropbox.removeClass("slick-header-column-denied");
|
74
|
+
},
|
75
|
+
drop: function(event, ui) {
|
76
|
+
handleGroupByDrop(this, ui.draggable);
|
77
|
+
},
|
78
|
+
over: function(event, ui) {
|
79
|
+
var id = (ui.draggable).attr('id').replace(_gridUid, "");
|
80
|
+
_gridColumns.forEach(function(e, i, a) {
|
81
|
+
if (e.id == id) {
|
82
|
+
if (e.grouping == null) {
|
83
|
+
dropbox.addClass("slick-header-column-denied");
|
84
|
+
}
|
85
|
+
}
|
86
|
+
});
|
87
|
+
}
|
88
|
+
});
|
89
|
+
dropbox.sortable({
|
90
|
+
items: "div.slick-dropped-grouping",
|
91
|
+
cursor: "default",
|
92
|
+
tolerance: "pointer",
|
93
|
+
helper: "clone",
|
94
|
+
update: function(event, ui) {
|
95
|
+
var sortArray = $(this).sortable('toArray', {
|
96
|
+
attribute: 'data-id'
|
97
|
+
}),
|
98
|
+
newGroupingOrder = [];
|
99
|
+
for (var i = 0, l = sortArray.length; i < l; i++) {
|
100
|
+
for (var a = 0, b = columnsGroupBy.length; a < b; a++) {
|
101
|
+
if (columnsGroupBy[a].id == sortArray[i]) {
|
102
|
+
newGroupingOrder.push(columnsGroupBy[a]);
|
103
|
+
break;
|
104
|
+
}
|
105
|
+
}
|
106
|
+
}
|
107
|
+
columnsGroupBy = newGroupingOrder;
|
108
|
+
updateGroupBy();
|
109
|
+
}
|
110
|
+
});
|
111
|
+
emptyDropbox = dropbox.html();
|
112
|
+
}
|
113
|
+
|
114
|
+
var columnsGroupBy = [];
|
115
|
+
var groupBySorters = [];
|
116
|
+
|
117
|
+
function handleGroupByDrop(container, column) {
|
118
|
+
var columnid = column.attr('id').replace(_gridUid, "");
|
119
|
+
var columnAllowed = true;
|
120
|
+
columnsGroupBy.forEach(function(e, i, a) {
|
121
|
+
if (e.id == columnid) {
|
122
|
+
columnAllowed = false;
|
123
|
+
}
|
124
|
+
});
|
125
|
+
if (columnAllowed) {
|
126
|
+
_gridColumns.forEach(function(e, i, a) {
|
127
|
+
if (e.id == columnid) {
|
128
|
+
if (e.grouping != null) {
|
129
|
+
var entry = $("<div id='" + _gridUid + e.id + "_entry' data-id='" + e.id + "' class='slick-dropped-grouping'>");
|
130
|
+
var span = $("<span class='slick-groupby-remove'></span>").text(column.text() + " ")
|
131
|
+
span.appendTo(entry);
|
132
|
+
$("</div>").appendTo(entry);
|
133
|
+
entry.appendTo(container);
|
134
|
+
addColumnGroupBy(e, column, container, entry);
|
135
|
+
addGroupByRemoveClickHandler(e.id, container, column, entry);
|
136
|
+
}
|
137
|
+
}
|
138
|
+
});
|
139
|
+
}
|
140
|
+
}
|
141
|
+
|
142
|
+
function addColumnGroupBy(column) {
|
143
|
+
columnsGroupBy.push(column);
|
144
|
+
updateGroupBy();
|
145
|
+
}
|
146
|
+
|
147
|
+
function addGroupByRemoveClickHandler(id, container, column, entry) {
|
148
|
+
var text = entry;
|
149
|
+
$("#" + _gridUid + id + "_entry").on('click', function() {
|
150
|
+
$(this).off('click');
|
151
|
+
removeGroupBy(id, column, text);
|
152
|
+
});
|
153
|
+
}
|
154
|
+
|
155
|
+
function clearDroppedGroups() {
|
156
|
+
columnsGroupBy = [];
|
157
|
+
}
|
158
|
+
|
159
|
+
function removeFromArray(arr) {
|
160
|
+
var what, a = arguments,
|
161
|
+
L = a.length,
|
162
|
+
ax;
|
163
|
+
while (L > 1 && arr.length) {
|
164
|
+
what = a[--L];
|
165
|
+
while ((ax = arr.indexOf(what)) != -1) {
|
166
|
+
arr.splice(ax, 1);
|
167
|
+
}
|
168
|
+
}
|
169
|
+
return arr;
|
170
|
+
}
|
171
|
+
|
172
|
+
function removeGroupBy(id, column, entry) {
|
173
|
+
entry.remove();
|
174
|
+
var groupby = [];
|
175
|
+
_gridColumns.forEach(function(e, i, a) {
|
176
|
+
groupby[e.id] = e;
|
177
|
+
});
|
178
|
+
removeFromArray(columnsGroupBy, groupby[id]);
|
179
|
+
if(columnsGroupBy.length == 0){
|
180
|
+
dropboxPlaceholder.show();
|
181
|
+
}
|
182
|
+
updateGroupBy();
|
183
|
+
}
|
184
|
+
|
185
|
+
function updateGroupBy() {
|
186
|
+
if (columnsGroupBy.length == 0) {
|
187
|
+
_dataView.setGrouping([]);
|
188
|
+
return;
|
189
|
+
}
|
190
|
+
var groupingArray = [];
|
191
|
+
columnsGroupBy.forEach(function(element, index, array) {
|
192
|
+
groupingArray.push(element.grouping);
|
193
|
+
});
|
194
|
+
_dataView.setGrouping(groupingArray);
|
195
|
+
/*
|
196
|
+
collapseAllGroups();
|
197
|
+
*/
|
198
|
+
}
|
199
|
+
|
200
|
+
// Public API
|
201
|
+
$.extend(this, {
|
202
|
+
"init": init,
|
203
|
+
"destroy": destroy,
|
204
|
+
"clearDroppedGroups": clearDroppedGroups
|
205
|
+
});
|
206
|
+
}
|
207
|
+
})(jQuery);
|
@@ -0,0 +1,177 @@
|
|
1
|
+
(function ($) {
|
2
|
+
// register namespace
|
3
|
+
$.extend(true, window, {
|
4
|
+
"Slick": {
|
5
|
+
"Plugins": {
|
6
|
+
"HeaderButtons": HeaderButtons
|
7
|
+
}
|
8
|
+
}
|
9
|
+
});
|
10
|
+
|
11
|
+
|
12
|
+
/***
|
13
|
+
* A plugin to add custom buttons to column headers.
|
14
|
+
*
|
15
|
+
* USAGE:
|
16
|
+
*
|
17
|
+
* Add the plugin .js & .css files and register it with the grid.
|
18
|
+
*
|
19
|
+
* To specify a custom button in a column header, extend the column definition like so:
|
20
|
+
*
|
21
|
+
* var columns = [
|
22
|
+
* {
|
23
|
+
* id: 'myColumn',
|
24
|
+
* name: 'My column',
|
25
|
+
*
|
26
|
+
* // This is the relevant part
|
27
|
+
* header: {
|
28
|
+
* buttons: [
|
29
|
+
* {
|
30
|
+
* // button options
|
31
|
+
* },
|
32
|
+
* {
|
33
|
+
* // button options
|
34
|
+
* }
|
35
|
+
* ]
|
36
|
+
* }
|
37
|
+
* }
|
38
|
+
* ];
|
39
|
+
*
|
40
|
+
* Available button options:
|
41
|
+
* cssClass: CSS class to add to the button.
|
42
|
+
* image: Relative button image path.
|
43
|
+
* tooltip: Button tooltip.
|
44
|
+
* showOnHover: Only show the button on hover.
|
45
|
+
* handler: Button click handler.
|
46
|
+
* command: A command identifier to be passed to the onCommand event handlers.
|
47
|
+
*
|
48
|
+
* The plugin exposes the following events:
|
49
|
+
* onCommand: Fired on button click for buttons with 'command' specified.
|
50
|
+
* Event args:
|
51
|
+
* grid: Reference to the grid.
|
52
|
+
* column: Column definition.
|
53
|
+
* command: Button command identified.
|
54
|
+
* button: Button options. Note that you can change the button options in your
|
55
|
+
* event handler, and the column header will be automatically updated to
|
56
|
+
* reflect them. This is useful if you want to implement something like a
|
57
|
+
* toggle button.
|
58
|
+
*
|
59
|
+
*
|
60
|
+
* @param options {Object} Options:
|
61
|
+
* buttonCssClass: a CSS class to use for buttons (default 'slick-header-button')
|
62
|
+
* @class Slick.Plugins.HeaderButtons
|
63
|
+
* @constructor
|
64
|
+
*/
|
65
|
+
function HeaderButtons(options) {
|
66
|
+
var _grid;
|
67
|
+
var _self = this;
|
68
|
+
var _handler = new Slick.EventHandler();
|
69
|
+
var _defaults = {
|
70
|
+
buttonCssClass: "slick-header-button"
|
71
|
+
};
|
72
|
+
|
73
|
+
|
74
|
+
function init(grid) {
|
75
|
+
options = $.extend(true, {}, _defaults, options);
|
76
|
+
_grid = grid;
|
77
|
+
_handler
|
78
|
+
.subscribe(_grid.onHeaderCellRendered, handleHeaderCellRendered)
|
79
|
+
.subscribe(_grid.onBeforeHeaderCellDestroy, handleBeforeHeaderCellDestroy);
|
80
|
+
|
81
|
+
// Force the grid to re-render the header now that the events are hooked up.
|
82
|
+
_grid.setColumns(_grid.getColumns());
|
83
|
+
}
|
84
|
+
|
85
|
+
|
86
|
+
function destroy() {
|
87
|
+
_handler.unsubscribeAll();
|
88
|
+
}
|
89
|
+
|
90
|
+
|
91
|
+
function handleHeaderCellRendered(e, args) {
|
92
|
+
var column = args.column;
|
93
|
+
|
94
|
+
if (column.header && column.header.buttons) {
|
95
|
+
// Append buttons in reverse order since they are floated to the right.
|
96
|
+
var i = column.header.buttons.length;
|
97
|
+
while (i--) {
|
98
|
+
var button = column.header.buttons[i];
|
99
|
+
var btn = $("<div></div>")
|
100
|
+
.addClass(options.buttonCssClass)
|
101
|
+
.data("column", column)
|
102
|
+
.data("button", button);
|
103
|
+
|
104
|
+
if (button.showOnHover) {
|
105
|
+
btn.addClass("slick-header-button-hidden");
|
106
|
+
}
|
107
|
+
|
108
|
+
if (button.image) {
|
109
|
+
btn.css("backgroundImage", "url(" + button.image + ")");
|
110
|
+
}
|
111
|
+
|
112
|
+
if (button.cssClass) {
|
113
|
+
btn.addClass(button.cssClass);
|
114
|
+
}
|
115
|
+
|
116
|
+
if (button.tooltip) {
|
117
|
+
btn.attr("title", button.tooltip);
|
118
|
+
}
|
119
|
+
|
120
|
+
if (button.command) {
|
121
|
+
btn.data("command", button.command);
|
122
|
+
}
|
123
|
+
|
124
|
+
if (button.handler) {
|
125
|
+
btn.on("click", button.handler);
|
126
|
+
}
|
127
|
+
|
128
|
+
btn
|
129
|
+
.on("click", handleButtonClick)
|
130
|
+
.appendTo(args.node);
|
131
|
+
}
|
132
|
+
}
|
133
|
+
}
|
134
|
+
|
135
|
+
|
136
|
+
function handleBeforeHeaderCellDestroy(e, args) {
|
137
|
+
var column = args.column;
|
138
|
+
|
139
|
+
if (column.header && column.header.buttons) {
|
140
|
+
// Removing buttons via jQuery will also clean up any event handlers and data.
|
141
|
+
// NOTE: If you attach event handlers directly or using a different framework,
|
142
|
+
// you must also clean them up here to avoid memory leaks.
|
143
|
+
$(args.node).find("." + options.buttonCssClass).remove();
|
144
|
+
}
|
145
|
+
}
|
146
|
+
|
147
|
+
|
148
|
+
function handleButtonClick(e) {
|
149
|
+
var command = $(this).data("command");
|
150
|
+
var columnDef = $(this).data("column");
|
151
|
+
var button = $(this).data("button");
|
152
|
+
|
153
|
+
if (command != null) {
|
154
|
+
_self.onCommand.notify({
|
155
|
+
"grid": _grid,
|
156
|
+
"column": columnDef,
|
157
|
+
"command": command,
|
158
|
+
"button": button
|
159
|
+
}, e, _self);
|
160
|
+
|
161
|
+
// Update the header in case the user updated the button definition in the handler.
|
162
|
+
_grid.updateColumnHeader(columnDef.id);
|
163
|
+
}
|
164
|
+
|
165
|
+
// Stop propagation so that it doesn't register as a header click event.
|
166
|
+
e.preventDefault();
|
167
|
+
e.stopPropagation();
|
168
|
+
}
|
169
|
+
|
170
|
+
$.extend(this, {
|
171
|
+
"init": init,
|
172
|
+
"destroy": destroy,
|
173
|
+
|
174
|
+
"onCommand": new Slick.Event()
|
175
|
+
});
|
176
|
+
}
|
177
|
+
})(jQuery);
|
@@ -0,0 +1,296 @@
|
|
1
|
+
(function ($) {
|
2
|
+
// register namespace
|
3
|
+
$.extend(true, window, {
|
4
|
+
"Slick": {
|
5
|
+
"Plugins": {
|
6
|
+
"HeaderMenu": HeaderMenu
|
7
|
+
}
|
8
|
+
}
|
9
|
+
});
|
10
|
+
|
11
|
+
|
12
|
+
/***
|
13
|
+
* A plugin to add drop-down menus to column headers.
|
14
|
+
*
|
15
|
+
* USAGE:
|
16
|
+
*
|
17
|
+
* Add the plugin .js & .css files and register it with the grid.
|
18
|
+
*
|
19
|
+
* To specify a menu in a column header, extend the column definition like so:
|
20
|
+
*
|
21
|
+
* var columns = [
|
22
|
+
* {
|
23
|
+
* id: 'myColumn',
|
24
|
+
* name: 'My column',
|
25
|
+
*
|
26
|
+
* // This is the relevant part
|
27
|
+
* header: {
|
28
|
+
* menu: {
|
29
|
+
* items: [
|
30
|
+
* {
|
31
|
+
* // menu item options
|
32
|
+
* },
|
33
|
+
* {
|
34
|
+
* // menu item options
|
35
|
+
* }
|
36
|
+
* ]
|
37
|
+
* }
|
38
|
+
* }
|
39
|
+
* }
|
40
|
+
* ];
|
41
|
+
*
|
42
|
+
*
|
43
|
+
* Available menu options:
|
44
|
+
* tooltip: Menu button tooltip.
|
45
|
+
*
|
46
|
+
*
|
47
|
+
* Available menu item options:
|
48
|
+
* title: Menu item text.
|
49
|
+
* disabled: Whether the item is disabled.
|
50
|
+
* tooltip: Item tooltip.
|
51
|
+
* command: A command identifier to be passed to the onCommand event handlers.
|
52
|
+
* iconCssClass: A CSS class to be added to the menu item icon.
|
53
|
+
* iconImage: A url to the icon image.
|
54
|
+
* minWidth: Minimum width that the drop menu will have
|
55
|
+
* autoAlign: Auto-align drop menu to the left when not enough viewport space to show on the right
|
56
|
+
* autoAlignOffset: When drop menu is aligned to the left, it might not be perfectly aligned with the header menu icon, if that is the case you can add an offset (positive/negative number to move right/left)
|
57
|
+
*
|
58
|
+
*
|
59
|
+
* The plugin exposes the following events:
|
60
|
+
* onBeforeMenuShow: Fired before the menu is shown. You can customize the menu or dismiss it by returning false.
|
61
|
+
* Event args:
|
62
|
+
* grid: Reference to the grid.
|
63
|
+
* column: Column definition.
|
64
|
+
* menu: Menu options. Note that you can change the menu items here.
|
65
|
+
*
|
66
|
+
* onCommand: Fired on menu item click for buttons with 'command' specified.
|
67
|
+
* Event args:
|
68
|
+
* grid: Reference to the grid.
|
69
|
+
* column: Column definition.
|
70
|
+
* command: Button command identified.
|
71
|
+
* button: Button options. Note that you can change the button options in your
|
72
|
+
* event handler, and the column header will be automatically updated to
|
73
|
+
* reflect them. This is useful if you want to implement something like a
|
74
|
+
* toggle button.
|
75
|
+
*
|
76
|
+
*
|
77
|
+
* @param options {Object} Options:
|
78
|
+
* buttonCssClass: an extra CSS class to add to the menu button
|
79
|
+
* buttonImage: a url to the menu button image (default '../slickgrid/down.gif')
|
80
|
+
* @class Slick.Plugins.HeaderButtons
|
81
|
+
* @constructor
|
82
|
+
*/
|
83
|
+
function HeaderMenu(options) {
|
84
|
+
var _grid;
|
85
|
+
var _self = this;
|
86
|
+
var _handler = new Slick.EventHandler();
|
87
|
+
var _defaults = {
|
88
|
+
buttonCssClass: null,
|
89
|
+
buttonImage: null,
|
90
|
+
minWidth: 100,
|
91
|
+
autoAlign: true,
|
92
|
+
autoAlignOffset: 0
|
93
|
+
};
|
94
|
+
var $menu;
|
95
|
+
var $activeHeaderColumn;
|
96
|
+
|
97
|
+
|
98
|
+
function init(grid) {
|
99
|
+
options = $.extend(true, {}, _defaults, options);
|
100
|
+
_grid = grid;
|
101
|
+
_handler
|
102
|
+
.subscribe(_grid.onHeaderCellRendered, handleHeaderCellRendered)
|
103
|
+
.subscribe(_grid.onBeforeHeaderCellDestroy, handleBeforeHeaderCellDestroy);
|
104
|
+
|
105
|
+
// Force the grid to re-render the header now that the events are hooked up.
|
106
|
+
_grid.setColumns(_grid.getColumns());
|
107
|
+
|
108
|
+
// Hide the menu on outside click.
|
109
|
+
$(document.body).on("mousedown", handleBodyMouseDown);
|
110
|
+
}
|
111
|
+
|
112
|
+
function setOptions(newOptions) {
|
113
|
+
options = $.extend(true, {}, options, newOptions);
|
114
|
+
}
|
115
|
+
|
116
|
+
|
117
|
+
function destroy() {
|
118
|
+
_handler.unsubscribeAll();
|
119
|
+
$(document.body).off("mousedown", handleBodyMouseDown);
|
120
|
+
}
|
121
|
+
|
122
|
+
|
123
|
+
function handleBodyMouseDown(e) {
|
124
|
+
if ($menu && $menu[0] != e.target && !$.contains($menu[0], e.target)) {
|
125
|
+
hideMenu();
|
126
|
+
}
|
127
|
+
}
|
128
|
+
|
129
|
+
|
130
|
+
function hideMenu() {
|
131
|
+
if ($menu) {
|
132
|
+
$menu.remove();
|
133
|
+
$menu = null;
|
134
|
+
$activeHeaderColumn
|
135
|
+
.removeClass("slick-header-column-active");
|
136
|
+
}
|
137
|
+
}
|
138
|
+
|
139
|
+
function handleHeaderCellRendered(e, args) {
|
140
|
+
var column = args.column;
|
141
|
+
var menu = column.header && column.header.menu;
|
142
|
+
|
143
|
+
if (menu) {
|
144
|
+
var $el = $("<div></div>")
|
145
|
+
.addClass("slick-header-menubutton")
|
146
|
+
.data("column", column)
|
147
|
+
.data("menu", menu);
|
148
|
+
|
149
|
+
if (options.buttonCssClass) {
|
150
|
+
$el.addClass(options.buttonCssClass);
|
151
|
+
}
|
152
|
+
|
153
|
+
if (options.buttonImage) {
|
154
|
+
$el.css("background-image", "url(" + options.buttonImage + ")");
|
155
|
+
}
|
156
|
+
|
157
|
+
if (menu.tooltip) {
|
158
|
+
$el.attr("title", menu.tooltip);
|
159
|
+
}
|
160
|
+
|
161
|
+
$el
|
162
|
+
.on("click", showMenu)
|
163
|
+
.appendTo(args.node);
|
164
|
+
}
|
165
|
+
}
|
166
|
+
|
167
|
+
|
168
|
+
function handleBeforeHeaderCellDestroy(e, args) {
|
169
|
+
var column = args.column;
|
170
|
+
|
171
|
+
if (column.header && column.header.menu) {
|
172
|
+
$(args.node).find(".slick-header-menubutton").remove();
|
173
|
+
}
|
174
|
+
}
|
175
|
+
|
176
|
+
|
177
|
+
function showMenu(e) {
|
178
|
+
var $menuButton = $(this);
|
179
|
+
var menu = $menuButton.data("menu");
|
180
|
+
var columnDef = $menuButton.data("column");
|
181
|
+
|
182
|
+
// Let the user modify the menu or cancel altogether,
|
183
|
+
// or provide alternative menu implementation.
|
184
|
+
if (_self.onBeforeMenuShow.notify({
|
185
|
+
"grid": _grid,
|
186
|
+
"column": columnDef,
|
187
|
+
"menu": menu
|
188
|
+
}, e, _self) == false) {
|
189
|
+
return;
|
190
|
+
}
|
191
|
+
|
192
|
+
|
193
|
+
if (!$menu) {
|
194
|
+
$menu = $("<div class='slick-header-menu' style='min-width: " + options.minWidth + "px'></div>")
|
195
|
+
.appendTo(_grid.getContainerNode());
|
196
|
+
}
|
197
|
+
$menu.empty();
|
198
|
+
|
199
|
+
|
200
|
+
// Construct the menu items.
|
201
|
+
for (var i = 0; i < menu.items.length; i++) {
|
202
|
+
var item = menu.items[i];
|
203
|
+
|
204
|
+
var $li = $("<div class='slick-header-menuitem'></div>")
|
205
|
+
.data("command", item.command || '')
|
206
|
+
.data("column", columnDef)
|
207
|
+
.data("item", item)
|
208
|
+
.on("click", handleMenuItemClick)
|
209
|
+
.appendTo($menu);
|
210
|
+
|
211
|
+
if (item.disabled) {
|
212
|
+
$li.addClass("slick-header-menuitem-disabled");
|
213
|
+
}
|
214
|
+
|
215
|
+
if (item.tooltip) {
|
216
|
+
$li.attr("title", item.tooltip);
|
217
|
+
}
|
218
|
+
|
219
|
+
var $icon = $("<div class='slick-header-menuicon'></div>")
|
220
|
+
.appendTo($li);
|
221
|
+
|
222
|
+
if (item.iconCssClass) {
|
223
|
+
$icon.addClass(item.iconCssClass);
|
224
|
+
}
|
225
|
+
|
226
|
+
if (item.iconImage) {
|
227
|
+
$icon.css("background-image", "url(" + item.iconImage + ")");
|
228
|
+
}
|
229
|
+
|
230
|
+
$("<span class='slick-header-menucontent'></span>")
|
231
|
+
.text(item.title)
|
232
|
+
.appendTo($li);
|
233
|
+
}
|
234
|
+
|
235
|
+
var leftPos = $(this).offset().left;
|
236
|
+
|
237
|
+
// when auto-align is set, it will calculate whether it has enough space in the viewport to show the drop menu on the right (default)
|
238
|
+
// if there isn't enough space on the right, it will automatically align the drop menu to the left
|
239
|
+
// to simulate an align left, we actually need to know the width of the drop menu
|
240
|
+
if (options.autoAlign) {
|
241
|
+
var gridPos = _grid.getGridPosition();
|
242
|
+
if ((leftPos + options.minWidth) >= gridPos.width) {
|
243
|
+
leftPos = leftPos - options.minWidth + options.autoAlignOffset;
|
244
|
+
}
|
245
|
+
}
|
246
|
+
|
247
|
+
$menu
|
248
|
+
.offset({ top: $(this).offset().top + $(this).height(), left: leftPos });
|
249
|
+
|
250
|
+
|
251
|
+
// Mark the header as active to keep the highlighting.
|
252
|
+
$activeHeaderColumn = $menuButton.closest(".slick-header-column");
|
253
|
+
$activeHeaderColumn
|
254
|
+
.addClass("slick-header-column-active");
|
255
|
+
|
256
|
+
// Stop propagation so that it doesn't register as a header click event.
|
257
|
+
e.preventDefault();
|
258
|
+
e.stopPropagation();
|
259
|
+
}
|
260
|
+
|
261
|
+
|
262
|
+
function handleMenuItemClick(e) {
|
263
|
+
var command = $(this).data("command");
|
264
|
+
var columnDef = $(this).data("column");
|
265
|
+
var item = $(this).data("item");
|
266
|
+
|
267
|
+
if (item.disabled) {
|
268
|
+
return;
|
269
|
+
}
|
270
|
+
|
271
|
+
hideMenu();
|
272
|
+
|
273
|
+
if (command != null && command != '') {
|
274
|
+
_self.onCommand.notify({
|
275
|
+
"grid": _grid,
|
276
|
+
"column": columnDef,
|
277
|
+
"command": command,
|
278
|
+
"item": item
|
279
|
+
}, e, _self);
|
280
|
+
}
|
281
|
+
|
282
|
+
// Stop propagation so that it doesn't register as a header click event.
|
283
|
+
e.preventDefault();
|
284
|
+
e.stopPropagation();
|
285
|
+
}
|
286
|
+
|
287
|
+
$.extend(this, {
|
288
|
+
"init": init,
|
289
|
+
"destroy": destroy,
|
290
|
+
"setOptions": setOptions,
|
291
|
+
|
292
|
+
"onBeforeMenuShow": new Slick.Event(),
|
293
|
+
"onCommand": new Slick.Event()
|
294
|
+
});
|
295
|
+
}
|
296
|
+
})(jQuery);
|