1 | (function ($) {
|
2 |
|
3 | $.extend(true, window, {
|
4 | Slick: {
|
5 | State: State
|
6 | }
|
7 | });
|
8 |
|
9 | var localStorageWrapper = function() {
|
10 | var localStorage = window.localStorage;
|
11 |
|
12 | if (typeof localStorage === 'undefined') {
|
13 | console.error('localStorage is not available. slickgrid statepersistor disabled.');
|
14 | }
|
15 |
|
16 | return {
|
17 | get: function(key) {
|
18 | return $.Deferred(function(dfd) {
|
19 | if (!localStorage) return dfd.reject("missing localStorage");
|
20 | try {
|
21 | var d = localStorage.getItem(key);
|
22 | if (d) {
|
23 | return dfd.resolve(JSON.parse(d));
|
24 | }
|
25 | dfd.resolve();
|
26 | }
|
27 | catch (exc) {
|
28 | dfd.reject(exc);
|
29 | }
|
30 | });
|
31 | },
|
32 | set: function(key, obj) {
|
33 | if (!localStorage) return;
|
34 | if (typeof obj !== 'undefined') {
|
35 | obj = JSON.stringify(obj);
|
36 | }
|
37 | localStorage.setItem(key, obj);
|
38 | }
|
39 | };
|
40 | };
|
41 |
|
42 | var defaults = {
|
43 | key_prefix: "slickgrid:",
|
44 | storage: new localStorageWrapper()
|
45 | };
|
46 |
|
47 | function State(options) {
|
48 | options = $.extend(true, {}, defaults, options);
|
49 |
|
50 | var _grid, _cid,
|
51 | _store = options.storage,
|
52 | onStateChanged = new Slick.Event();
|
53 |
|
54 | function init(grid) {
|
55 | _grid = grid;
|
56 | _cid = grid.cid || options.cid;
|
57 | if (_cid) {
|
58 | grid.onColumnsResized.subscribe(save);
|
59 | grid.onColumnsReordered.subscribe(save);
|
60 | grid.onSort.subscribe(save);
|
61 | } else {
|
62 | console.warn("grid has no client id. state persisting is disabled.");
|
63 | }
|
64 | }
|
65 |
|
66 | function destroy() {
|
67 | grid.onSort.unsubscribe(save);
|
68 | grid.onColumnsReordered.unsubscribe(save);
|
69 | grid.onColumnsResized.unsubscribe(save);
|
70 | save();
|
71 | }
|
72 |
|
73 | function save() {
|
74 | if (_cid && _store) {
|
75 | var state = {
|
76 | sortcols: getSortColumns(),
|
77 | viewport: _grid.getViewport(),
|
78 | columns: getColumns()
|
79 | };
|
80 | onStateChanged.notify(state);
|
81 | return _store.set(options.key_prefix + _cid, state);
|
82 | }
|
83 | }
|
84 |
|
85 | function restore() {
|
86 | return $.Deferred(function(dfd) {
|
87 | if (!_cid) { return dfd.reject("missing client id"); }
|
88 | if (!_store) { return dfd.reject("missing store"); }
|
89 |
|
90 | _store.get(options.key_prefix + _cid)
|
91 | .then(function success(state) {
|
92 | if (state) {
|
93 | if (state.sortcols) {
|
94 | _grid.setSortColumns(state.sortcols);
|
95 | }
|
96 | if (state.viewport) {
|
97 | _grid.scrollRowIntoView(state.viewport.top, true);
|
98 | }
|
99 | if (state.columns) {
|
100 | var defaultColumns = options.defaultColumns;
|
101 | if (defaultColumns) {
|
102 | var defaultColumnsLookup = {};
|
103 | $.each(defaultColumns, function(idx, colDef) {
|
104 | defaultColumnsLookup[colDef.id] = colDef;
|
105 | });
|
106 |
|
107 | var cols = [];
|
108 | $.each(state.columns, function(idx, columnDef) {
|
109 | if (defaultColumnsLookup[columnDef.id]) {
|
110 | cols.push($.extend(true, {}, defaultColumnsLookup[columnDef.id], {
|
111 | width: columnDef.width,
|
112 | headerCssClass: columnDef.headerCssClass
|
113 | }));
|
114 | }
|
115 | });
|
116 |
|
117 | state.columns = cols;
|
118 | }
|
119 |
|
120 | _grid.setColumns(state.columns);
|
121 | }
|
122 | }
|
123 | dfd.resolve(state);
|
124 | }, dfd.reject);
|
125 | });
|
126 | }
|
127 |
|
128 | function getColumns() {
|
129 | return $.map(_grid.getColumns(), function(col) {
|
130 | return {
|
131 | id: col.id,
|
132 | width: col.width
|
133 | };
|
134 | });
|
135 | }
|
136 |
|
137 | function getSortColumns() {
|
138 | var sortCols = _grid.getSortColumns();
|
139 | return sortCols;
|
140 | }
|
141 |
|
142 | |
143 |
|
144 |
|
145 | $.extend(this, {
|
146 | "init": init,
|
147 | "destroy": destroy,
|
148 | "save": save,
|
149 | "restore": restore,
|
150 | "onStateChanged": onStateChanged
|
151 | });
|
152 | }
|
153 | })(jQuery);
|