bootstrap-table-cookie.js 17 KB

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