|
1 | 1 | (function ($) { |
2 | 2 | function SlickColumnPicker(columns, grid, options) { |
| 3 | + var $list; |
3 | 4 | var $menu; |
4 | 5 | var columnCheckboxes; |
5 | 6 |
|
6 | 7 | var defaults = { |
7 | | - fadeSpeed:250 |
| 8 | + fadeSpeed: 250 |
8 | 9 | }; |
9 | 10 |
|
10 | 11 | function init() { |
11 | 12 | grid.onHeaderContextMenu.subscribe(handleHeaderContextMenu); |
12 | 13 | grid.onColumnsReordered.subscribe(updateColumnOrder); |
13 | 14 | options = $.extend({}, defaults, options); |
14 | 15 |
|
15 | | - $menu = $("<span class='slick-columnpicker' style='display:none;position:absolute;z-index:20;overflow-y:scroll;' />").appendTo(document.body); |
| 16 | + $menu = $("<div class='slick-columnpicker' style='display:none' />").appendTo(document.body); |
| 17 | + $close = $("<button type='button' class='close' data-dismiss='slick-columnpicker' aria-label='Close'><span class='close' aria-hidden='true'>×</span></button>").appendTo($menu); |
| 18 | + |
| 19 | + // user could pass a title on top of the columns list |
| 20 | + if(options.columnPickerTitle) { |
| 21 | + $title = $("<div class='title'/>").append(options.columnPickerTitle); |
| 22 | + $title.appendTo($menu); |
| 23 | + } |
16 | 24 |
|
17 | | - $menu.on("mouseleave", function (e) { |
18 | | - $(this).fadeOut(options.fadeSpeed) |
19 | | - }); |
20 | 25 | $menu.on("click", updateColumn); |
| 26 | + $list = $("<span class='slick-columnpicker-list' />"); |
21 | 27 |
|
| 28 | + // Hide the menu on outside click. |
| 29 | + $(document.body).on("mousedown", handleBodyMouseDown); |
| 30 | + |
| 31 | + // destroy the picker if user leaves the page |
| 32 | + $(window).on("beforeunload", destroy); |
22 | 33 | } |
23 | 34 |
|
24 | 35 | function destroy() { |
25 | 36 | grid.onHeaderContextMenu.unsubscribe(handleHeaderContextMenu); |
26 | 37 | grid.onColumnsReordered.unsubscribe(updateColumnOrder); |
| 38 | + $(document.body).off("mousedown", handleBodyMouseDown); |
| 39 | + $("div.slick-columnpicker").hide(options.fadeSpeed); |
27 | 40 | $menu.remove(); |
28 | 41 | } |
29 | 42 |
|
| 43 | + function handleBodyMouseDown(e) { |
| 44 | + if (($menu && $menu[0] != e.target && !$.contains($menu[0], e.target)) || e.target.className == "close") { |
| 45 | + $menu.hide(options.fadeSpeed); |
| 46 | + } |
| 47 | + } |
| 48 | + |
30 | 49 | function handleHeaderContextMenu(e, args) { |
31 | 50 | e.preventDefault(); |
32 | | - $menu.empty(); |
| 51 | + $list.empty(); |
33 | 52 | updateColumnOrder(); |
34 | 53 | columnCheckboxes = []; |
35 | 54 |
|
36 | 55 | var $li, $input; |
37 | 56 | for (var i = 0; i < columns.length; i++) { |
38 | | - $li = $("<li />").appendTo($menu); |
| 57 | + $li = $("<li />").appendTo($list); |
39 | 58 | $input = $("<input type='checkbox' />").data("column-id", columns[i].id); |
40 | 59 | columnCheckboxes.push($input); |
41 | 60 |
|
|
49 | 68 | .appendTo($li); |
50 | 69 | } |
51 | 70 |
|
52 | | - $("<hr/>").appendTo($menu); |
53 | | - $li = $("<li />").appendTo($menu); |
| 71 | + $("<hr/>").appendTo($list); |
| 72 | + $li = $("<li />").appendTo($list); |
54 | 73 | $input = $("<input type='checkbox' />").data("option", "autoresize"); |
55 | 74 | $("<label />") |
56 | 75 | .text("Force fit columns") |
|
60 | 79 | $input.attr("checked", "checked"); |
61 | 80 | } |
62 | 81 |
|
63 | | - $li = $("<li />").appendTo($menu); |
| 82 | + $li = $("<li />").appendTo($list); |
64 | 83 | $input = $("<input type='checkbox' />").data("option", "syncresize"); |
65 | 84 | $("<label />") |
66 | 85 | .text("Synchronous resize") |
|
75 | 94 | .css("left", e.pageX - 10) |
76 | 95 | .css("max-height", $(window).height() - e.pageY -10) |
77 | 96 | .fadeIn(options.fadeSpeed); |
| 97 | + |
| 98 | + $list.appendTo($menu); |
78 | 99 | } |
79 | 100 |
|
80 | 101 | function updateColumnOrder() { |
|
0 commit comments