bootstrap-table-cookie.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. /**
  2. * @author: Dennis Hernández
  3. * @webSite: http://djhvscf.github.io/Blog
  4. * @version: v1.2.3
  5. *
  6. * @update zhixin wen <wenzhixin2010@gmail.com>
  7. */
  8. (function ($) {
  9. 'use strict';
  10. var cookieIds = {
  11. sortOrder: 'bs.table.sortOrder',
  12. sortName: 'bs.table.sortName',
  13. pageNumber: 'bs.table.pageNumber',
  14. pageList: 'bs.table.pageList',
  15. columns: 'bs.table.columns',
  16. searchText: 'bs.table.searchText',
  17. filterControl: 'bs.table.filterControl'
  18. };
  19. var getCurrentHeader = function (that) {
  20. var header = that.$header;
  21. if (that.options.height) {
  22. header = that.$tableHeader;
  23. }
  24. return header;
  25. };
  26. var getCurrentSearchControls = function (that) {
  27. var searchControls = 'select, input';
  28. if (that.options.height) {
  29. searchControls = 'table select, table input';
  30. }
  31. return searchControls;
  32. };
  33. var cookieEnabled = function () {
  34. return !!(navigator.cookieEnabled);
  35. };
  36. var inArrayCookiesEnabled = function (cookieName, cookiesEnabled) {
  37. var index = -1;
  38. for (var i = 0; i < cookiesEnabled.length; i++) {
  39. if (cookieName.toLowerCase() === cookiesEnabled[i].toLowerCase()) {
  40. index = i;
  41. break;
  42. }
  43. }
  44. return index;
  45. };
  46. var setCookie = function (that, cookieName, cookieValue) {
  47. if ((!that.options.cookie) || (!cookieEnabled()) || (that.options.cookieIdTable === '')) {
  48. return;
  49. }
  50. if (inArrayCookiesEnabled(cookieName, that.options.cookiesEnabled) === -1) {
  51. return;
  52. }
  53. cookieName = that.options.cookieIdTable + '.' + cookieName;
  54. switch(that.options.cookieStorage) {
  55. case 'cookieStorage':
  56. document.cookie = [
  57. cookieName, '=', cookieValue,
  58. '; expires=' + calculateExpiration(that.options.cookieExpire),
  59. that.options.cookiePath ? '; path=' + that.options.cookiePath : '',
  60. that.options.cookieDomain ? '; domain=' + that.options.cookieDomain : '',
  61. that.options.cookieSecure ? '; secure' : ''
  62. ].join('');
  63. case 'localStorage':
  64. localStorage.setItem(cookieName, cookieValue);
  65. break;
  66. case 'sessionStorage':
  67. sessionStorage.setItem(cookieName, cookieValue);
  68. break;
  69. default:
  70. return false;
  71. }
  72. return true;
  73. };
  74. var getCookie = function (that, tableName, cookieName) {
  75. if (!cookieName) {
  76. return null;
  77. }
  78. if (inArrayCookiesEnabled(cookieName, that.options.cookiesEnabled) === -1) {
  79. return null;
  80. }
  81. cookieName = tableName + '.' + cookieName;
  82. switch(that.options.cookieStorage) {
  83. case 'cookieStorage':
  84. var value = '; ' + document.cookie;
  85. var parts = value.split('; ' + cookieName + '=');
  86. return parts.length === 2 ? parts.pop().split(';').shift() : null;
  87. case 'localStorage':
  88. return localStorage.getItem(cookieName);
  89. case 'sessionStorage':
  90. return sessionStorage.getItem(cookieName);
  91. default:
  92. return null;
  93. }
  94. };
  95. var deleteCookie = function (that, tableName, cookieName) {
  96. cookieName = tableName + '.' + cookieName;
  97. switch(that.options.cookieStorage) {
  98. case 'cookieStorage':
  99. document.cookie = [
  100. encodeURIComponent(cookieName), '=',
  101. '; expires=Thu, 01 Jan 1970 00:00:00 GMT',
  102. that.options.cookiePath ? '; path=' + that.options.cookiePath : '',
  103. that.options.cookieDomain ? '; domain=' + that.options.cookieDomain : '',
  104. ].join('');
  105. break;
  106. case 'localStorage':
  107. localStorage.removeItem(cookieName);
  108. break;
  109. case 'sessionStorage':
  110. sessionStorage.removeItem(cookieName);
  111. break;
  112. }
  113. return true;
  114. };
  115. var calculateExpiration = function(cookieExpire) {
  116. var time = cookieExpire.replace(/[0-9]*/, ''); //s,mi,h,d,m,y
  117. cookieExpire = cookieExpire.replace(/[A-Za-z]{1,2}/, ''); //number
  118. switch (time.toLowerCase()) {
  119. case 's':
  120. cookieExpire = +cookieExpire;
  121. break;
  122. case 'mi':
  123. cookieExpire = cookieExpire * 60;
  124. break;
  125. case 'h':
  126. cookieExpire = cookieExpire * 60 * 60;
  127. break;
  128. case 'd':
  129. cookieExpire = cookieExpire * 24 * 60 * 60;
  130. break;
  131. case 'm':
  132. cookieExpire = cookieExpire * 30 * 24 * 60 * 60;
  133. break;
  134. case 'y':
  135. cookieExpire = cookieExpire * 365 * 24 * 60 * 60;
  136. break;
  137. default:
  138. cookieExpire = undefined;
  139. break;
  140. }
  141. if (!cookieExpire) {
  142. return '';
  143. }
  144. var d = new Date();
  145. d.setTime(d.getTime() + cookieExpire * 1000);
  146. return d.toGMTString();
  147. };
  148. var initCookieFilters = function (bootstrapTable) {
  149. setTimeout(function () {
  150. var parsedCookieFilters = JSON.parse(getCookie(bootstrapTable, bootstrapTable.options.cookieIdTable, cookieIds.filterControl));
  151. if (!bootstrapTable.options.filterControlValuesLoaded && parsedCookieFilters) {
  152. var cachedFilters = {},
  153. header = getCurrentHeader(bootstrapTable),
  154. searchControls = getCurrentSearchControls(bootstrapTable),
  155. applyCookieFilters = function (element, filteredCookies) {
  156. $(filteredCookies).each(function (i, cookie) {
  157. if (cookie.text !== '') {
  158. $(element).val(cookie.text);
  159. cachedFilters[cookie.field] = cookie.text;
  160. }
  161. });
  162. };
  163. header.find(searchControls).each(function () {
  164. var field = $(this).closest('[data-field]').data('field'),
  165. filteredCookies = $.grep(parsedCookieFilters, function (cookie) {
  166. return cookie.field === field;
  167. });
  168. applyCookieFilters(this, filteredCookies);
  169. });
  170. bootstrapTable.initColumnSearch(cachedFilters);
  171. bootstrapTable.options.filterControlValuesLoaded = true;
  172. bootstrapTable.initServer();
  173. }
  174. }, 250);
  175. };
  176. $.extend($.fn.bootstrapTable.defaults, {
  177. cookie: false,
  178. cookieExpire: '2h',
  179. cookiePath: null,
  180. cookieDomain: null,
  181. cookieSecure: null,
  182. cookieIdTable: '',
  183. cookiesEnabled: [
  184. 'bs.table.sortOrder', 'bs.table.sortName',
  185. 'bs.table.pageNumber', 'bs.table.pageList',
  186. 'bs.table.columns', 'bs.table.searchText',
  187. 'bs.table.filterControl'
  188. ],
  189. cookieStorage: 'cookieStorage', //localStorage, sessionStorage
  190. //internal variable
  191. filterControls: [],
  192. filterControlValuesLoaded: false
  193. });
  194. $.fn.bootstrapTable.methods.push('getCookies');
  195. $.fn.bootstrapTable.methods.push('deleteCookie');
  196. $.extend($.fn.bootstrapTable.utils, {
  197. setCookie: setCookie,
  198. getCookie: getCookie
  199. });
  200. var BootstrapTable = $.fn.bootstrapTable.Constructor,
  201. _init = BootstrapTable.prototype.init,
  202. _initTable = BootstrapTable.prototype.initTable,
  203. _initServer = BootstrapTable.prototype.initServer,
  204. _onSort = BootstrapTable.prototype.onSort,
  205. _onPageNumber = BootstrapTable.prototype.onPageNumber,
  206. _onPageListChange = BootstrapTable.prototype.onPageListChange,
  207. _onPagePre = BootstrapTable.prototype.onPagePre,
  208. _onPageNext = BootstrapTable.prototype.onPageNext,
  209. _toggleColumn = BootstrapTable.prototype.toggleColumn,
  210. _selectPage = BootstrapTable.prototype.selectPage,
  211. _onSearch = BootstrapTable.prototype.onSearch;
  212. BootstrapTable.prototype.init = function () {
  213. this.options.filterControls = [];
  214. this.options.filterControlValuesLoaded = false;
  215. this.options.cookiesEnabled = typeof this.options.cookiesEnabled === 'string' ?
  216. this.options.cookiesEnabled.replace('[', '').replace(']', '')
  217. .replace(/ /g, '').toLowerCase().split(',') :
  218. this.options.cookiesEnabled;
  219. if (this.options.filterControl) {
  220. var that = this;
  221. this.$el.on('column-search.bs.table', function (e, field, text) {
  222. var isNewField = true;
  223. for (var i = 0; i < that.options.filterControls.length; i++) {
  224. if (that.options.filterControls[i].field === field) {
  225. that.options.filterControls[i].text = text;
  226. isNewField = false;
  227. break;
  228. }
  229. }
  230. if (isNewField) {
  231. that.options.filterControls.push({
  232. field: field,
  233. text: text
  234. });
  235. }
  236. setCookie(that, cookieIds.filterControl, JSON.stringify(that.options.filterControls));
  237. }).on('post-body.bs.table', initCookieFilters(that));
  238. }
  239. _init.apply(this, Array.prototype.slice.apply(arguments));
  240. };
  241. BootstrapTable.prototype.initServer = function () {
  242. var bootstrapTable = this;
  243. if (bootstrapTable.options.cookie && bootstrapTable.options.filterControl && !bootstrapTable.options.filterControlValuesLoaded) {
  244. var cookie = JSON.parse(getCookie(bootstrapTable, bootstrapTable.options.cookieIdTable, cookieIds.filterControl));
  245. if (cookie)
  246. return;
  247. }
  248. _initServer.apply(this, Array.prototype.slice.apply(arguments));
  249. };
  250. BootstrapTable.prototype.initTable = function () {
  251. _initTable.apply(this, Array.prototype.slice.apply(arguments));
  252. this.initCookie();
  253. };
  254. BootstrapTable.prototype.initCookie = function () {
  255. if (!this.options.cookie) {
  256. return;
  257. }
  258. if ((this.options.cookieIdTable === '') || (this.options.cookieExpire === '') || (!cookieEnabled())) {
  259. console.error("Configuration error. Please review the cookieIdTable, cookieExpire properties, if those properties are ok, then this browser does not support the cookies");
  260. this.options.cookie = false; //Make sure that the cookie extension is disabled
  261. return;
  262. }
  263. var sortOrderCookie = getCookie(this, this.options.cookieIdTable, cookieIds.sortOrder),
  264. sortOrderNameCookie = getCookie(this, this.options.cookieIdTable, cookieIds.sortName),
  265. pageNumberCookie = getCookie(this, this.options.cookieIdTable, cookieIds.pageNumber),
  266. pageListCookie = getCookie(this, this.options.cookieIdTable, cookieIds.pageList),
  267. columnsCookie = JSON.parse(getCookie(this, this.options.cookieIdTable, cookieIds.columns)),
  268. searchTextCookie = getCookie(this, this.options.cookieIdTable, cookieIds.searchText);
  269. //sortOrder
  270. this.options.sortOrder = sortOrderCookie ? sortOrderCookie : this.options.sortOrder;
  271. //sortName
  272. this.options.sortName = sortOrderNameCookie ? sortOrderNameCookie : this.options.sortName;
  273. //pageNumber
  274. this.options.pageNumber = pageNumberCookie ? +pageNumberCookie : this.options.pageNumber;
  275. //pageSize
  276. this.options.pageSize = pageListCookie ? pageListCookie === this.options.formatAllRows() ? pageListCookie : +pageListCookie : this.options.pageSize;
  277. //searchText
  278. this.options.searchText = searchTextCookie ? searchTextCookie : '';
  279. if (columnsCookie) {
  280. $.each(this.columns, function (i, column) {
  281. column.visible = $.inArray(column.field, columnsCookie) !== -1;
  282. });
  283. }
  284. };
  285. BootstrapTable.prototype.onSort = function () {
  286. _onSort.apply(this, Array.prototype.slice.apply(arguments));
  287. setCookie(this, cookieIds.sortOrder, this.options.sortOrder);
  288. setCookie(this, cookieIds.sortName, this.options.sortName);
  289. };
  290. BootstrapTable.prototype.onPageNumber = function () {
  291. _onPageNumber.apply(this, Array.prototype.slice.apply(arguments));
  292. setCookie(this, cookieIds.pageNumber, this.options.pageNumber);
  293. return false;
  294. };
  295. BootstrapTable.prototype.onPageListChange = function () {
  296. _onPageListChange.apply(this, Array.prototype.slice.apply(arguments));
  297. setCookie(this, cookieIds.pageList, this.options.pageSize);
  298. setCookie(this, cookieIds.pageNumber, this.options.pageNumber);
  299. return false;
  300. };
  301. BootstrapTable.prototype.onPagePre = function () {
  302. _onPagePre.apply(this, Array.prototype.slice.apply(arguments));
  303. setCookie(this, cookieIds.pageNumber, this.options.pageNumber);
  304. return false;
  305. };
  306. BootstrapTable.prototype.onPageNext = function () {
  307. _onPageNext.apply(this, Array.prototype.slice.apply(arguments));
  308. setCookie(this, cookieIds.pageNumber, this.options.pageNumber);
  309. return false;
  310. };
  311. BootstrapTable.prototype.toggleColumn = function () {
  312. _toggleColumn.apply(this, Array.prototype.slice.apply(arguments));
  313. var visibleColumns = [];
  314. $.each(this.columns, function (i, column) {
  315. if (column.visible) {
  316. visibleColumns.push(column.field);
  317. }
  318. });
  319. setCookie(this, cookieIds.columns, JSON.stringify(visibleColumns));
  320. };
  321. BootstrapTable.prototype.selectPage = function (page) {
  322. _selectPage.apply(this, Array.prototype.slice.apply(arguments));
  323. setCookie(this, cookieIds.pageNumber, page);
  324. };
  325. BootstrapTable.prototype.onSearch = function () {
  326. var target = Array.prototype.slice.apply(arguments);
  327. _onSearch.apply(this, target);
  328. if ($(target[0].currentTarget).parent().hasClass('search')) {
  329. setCookie(this, cookieIds.searchText, this.searchText);
  330. }
  331. setCookie(this, cookieIds.pageNumber, this.options.pageNumber);
  332. };
  333. BootstrapTable.prototype.getCookies = function () {
  334. var bootstrapTable = this;
  335. var cookies = {};
  336. $.each(cookieIds, function(key, value) {
  337. cookies[key] = getCookie(bootstrapTable, bootstrapTable.options.cookieIdTable, value);
  338. if (key === 'columns') {
  339. cookies[key] = JSON.parse(cookies[key]);
  340. }
  341. });
  342. return cookies;
  343. };
  344. BootstrapTable.prototype.deleteCookie = function (cookieName) {
  345. if ((cookieName === '') || (!cookieEnabled())) {
  346. return;
  347. }
  348. deleteCookie(this, this.options.cookieIdTable, cookieIds[cookieName]);
  349. };
  350. })(jQuery);