bootstrap-table-cookie.js 13 KB

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