UNPKG

4.24 kBJavaScriptView Raw
1(function ($) {
2 // register namespace
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 * API
144 */
145 $.extend(this, {
146 "init": init,
147 "destroy": destroy,
148 "save": save,
149 "restore": restore,
150 "onStateChanged": onStateChanged
151 });
152 }
153})(jQuery);