bootstrap-table-cookie.js 13 KB

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