bootstrap-table-cookie.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  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.forEach(cookie => {
  158. if (cookie.text !== '' && element.tagName === 'INPUT') {
  159. element.value = cookie.text
  160. cachedFilters[cookie.field] = cookie.text
  161. } else if (cookie.text !== '' && element.tagName === 'SELECT') {
  162. const option = document.createElement('option')
  163. option.value = cookie.text
  164. option.text = cookie.text
  165. element.add(option, element[1])
  166. element.selectedIndex = 1
  167. cachedFilters[cookie.field] = cookie.text
  168. }
  169. })
  170. }
  171. header.find(searchControls).each(function () {
  172. const field = $(this).closest('[data-field]').data('field')
  173. const filteredCookies = parsedCookieFilters.filter(cookie => cookie.field === field)
  174. applyCookieFilters(this, filteredCookies)
  175. })
  176. bootstrapTable.initColumnSearch(cachedFilters)
  177. bootstrapTable.options.filterControlValuesLoaded = true
  178. bootstrapTable.initServer()
  179. }
  180. }, 250)
  181. }
  182. }
  183. $.extend($.fn.bootstrapTable.defaults, {
  184. cookie: false,
  185. cookieExpire: '2h',
  186. cookiePath: null,
  187. cookieDomain: null,
  188. cookieSecure: null,
  189. cookieIdTable: '',
  190. cookiesEnabled: [
  191. 'bs.table.sortOrder', 'bs.table.sortName',
  192. 'bs.table.pageNumber', 'bs.table.pageList',
  193. 'bs.table.columns', 'bs.table.searchText',
  194. 'bs.table.filterControl', 'bs.table.filterBy'
  195. ],
  196. cookieStorage: 'cookieStorage', // localStorage, sessionStorage
  197. // internal variable
  198. filterControls: [],
  199. filterControlValuesLoaded: false
  200. })
  201. $.fn.bootstrapTable.methods.push('getCookies')
  202. $.fn.bootstrapTable.methods.push('deleteCookie')
  203. $.extend($.fn.bootstrapTable.utils, {
  204. setCookie: UtilsCookie.setCookie,
  205. getCookie: UtilsCookie.getCookie
  206. })
  207. $.BootstrapTable = class extends $.BootstrapTable {
  208. init () {
  209. // FilterBy logic
  210. const filterByCookie = JSON.parse(UtilsCookie.getCookie(this, this.options.cookieIdTable, UtilsCookie.cookieIds.filterBy))
  211. this.filterColumns = filterByCookie ? filterByCookie : {}
  212. // FilterControl logic
  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. const that = this
  221. this.$el.on('column-search.bs.table', (e, field, text) => {
  222. let isNewField = true
  223. for (let 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,
  233. text
  234. })
  235. }
  236. UtilsCookie.setCookie(that, UtilsCookie.cookieIds.filterControl, JSON.stringify(that.options.filterControls))
  237. }).on('created-controls.bs.table', UtilsCookie.initCookieFilters(that))
  238. }
  239. super.init()
  240. }
  241. initServer (...args) {
  242. if (
  243. this.options.cookie &&
  244. this.options.filterControl &&
  245. !this.options.filterControlValuesLoaded
  246. ) {
  247. const cookie = JSON.parse(UtilsCookie.getCookie(this, this.options.cookieIdTable, UtilsCookie.cookieIds.filterControl))
  248. if (cookie) {
  249. return
  250. }
  251. }
  252. super.initServer(...args)
  253. }
  254. initTable (...args) {
  255. super.initTable(...args)
  256. this.initCookie()
  257. }
  258. onSort (...args) {
  259. super.onSort(...args)
  260. UtilsCookie.setCookie(this, UtilsCookie.cookieIds.sortOrder, this.options.sortOrder)
  261. UtilsCookie.setCookie(this, UtilsCookie.cookieIds.sortName, this.options.sortName)
  262. }
  263. onPageNumber (...args) {
  264. super.onPageNumber(...args)
  265. UtilsCookie.setCookie(this, UtilsCookie.cookieIds.pageNumber, this.options.pageNumber)
  266. }
  267. onPageListChange (...args) {
  268. super.onPageListChange(...args)
  269. UtilsCookie.setCookie(this, UtilsCookie.cookieIds.pageList, this.options.pageSize)
  270. UtilsCookie.setCookie(this, UtilsCookie.cookieIds.pageNumber, this.options.pageNumber)
  271. }
  272. onPagePre (...args) {
  273. super.onPagePre(...args)
  274. UtilsCookie.setCookie(this, UtilsCookie.cookieIds.pageNumber, this.options.pageNumber)
  275. }
  276. onPageNext (...args) {
  277. super.onPageNext(...args)
  278. UtilsCookie.setCookie(this, UtilsCookie.cookieIds.pageNumber, this.options.pageNumber)
  279. }
  280. _toggleColumn (...args) {
  281. super._toggleColumn(...args)
  282. const visibleColumns = []
  283. $.each(this.columns, (i, column) => {
  284. if (column.visible) {
  285. visibleColumns.push(column.field)
  286. }
  287. })
  288. UtilsCookie.setCookie(this, UtilsCookie.cookieIds.columns, JSON.stringify(visibleColumns))
  289. }
  290. selectPage (page) {
  291. super.selectPage(page)
  292. UtilsCookie.setCookie(this, UtilsCookie.cookieIds.pageNumber, page)
  293. }
  294. onSearch (event) {
  295. super.onSearch(event)
  296. if (this.options.search) {
  297. UtilsCookie.setCookie(this, UtilsCookie.cookieIds.searchText, this.searchText)
  298. }
  299. UtilsCookie.setCookie(this, UtilsCookie.cookieIds.pageNumber, this.options.pageNumber)
  300. }
  301. filterBy (...args) {
  302. super.filterBy(...args)
  303. UtilsCookie.setCookie(this, UtilsCookie.cookieIds.filterBy, JSON.stringify(this.filterColumns))
  304. }
  305. initCookie () {
  306. if (!this.options.cookie) {
  307. return
  308. }
  309. if ((this.options.cookieIdTable === '') || (this.options.cookieExpire === '') || (!UtilsCookie.cookieEnabled())) {
  310. console.error('Configuration error. Please review the cookieIdTable and the cookieExpire property. If the properties are correct, then this browser does not support cookies.')
  311. this.options.cookie = false // Make sure that the cookie extension is disabled
  312. return
  313. }
  314. const sortOrderCookie = UtilsCookie.getCookie(this, this.options.cookieIdTable, UtilsCookie.cookieIds.sortOrder)
  315. const sortOrderNameCookie = UtilsCookie.getCookie(this, this.options.cookieIdTable, UtilsCookie.cookieIds.sortName)
  316. const pageNumberCookie = UtilsCookie.getCookie(this, this.options.cookieIdTable, UtilsCookie.cookieIds.pageNumber)
  317. const pageListCookie = UtilsCookie.getCookie(this, this.options.cookieIdTable, UtilsCookie.cookieIds.pageList)
  318. const columnsCookie = JSON.parse(UtilsCookie.getCookie(this, this.options.cookieIdTable, UtilsCookie.cookieIds.columns))
  319. const searchTextCookie = UtilsCookie.getCookie(this, this.options.cookieIdTable, UtilsCookie.cookieIds.searchText)
  320. // sortOrder
  321. this.options.sortOrder = sortOrderCookie ? sortOrderCookie : this.options.sortOrder
  322. // sortName
  323. this.options.sortName = sortOrderNameCookie ? sortOrderNameCookie : this.options.sortName
  324. // pageNumber
  325. this.options.pageNumber = pageNumberCookie ? +pageNumberCookie : this.options.pageNumber
  326. // pageSize
  327. this.options.pageSize = pageListCookie ? pageListCookie === this.options.formatAllRows() ? pageListCookie : +pageListCookie : this.options.pageSize
  328. // searchText
  329. this.options.searchText = searchTextCookie ? searchTextCookie : ''
  330. if (columnsCookie) {
  331. $.each(this.columns, (i, column) => {
  332. column.visible = $.inArray(column.field, columnsCookie) !== -1
  333. })
  334. }
  335. }
  336. getCookies () {
  337. const bootstrapTable = this
  338. const cookies = {}
  339. $.each(UtilsCookie.cookieIds, (key, value) => {
  340. cookies[key] = UtilsCookie.getCookie(bootstrapTable, bootstrapTable.options.cookieIdTable, value)
  341. if (key === 'columns') {
  342. cookies[key] = JSON.parse(cookies[key])
  343. }
  344. })
  345. return cookies
  346. }
  347. deleteCookie (cookieName) {
  348. if ((cookieName === '') || (!UtilsCookie.cookieEnabled())) {
  349. return
  350. }
  351. UtilsCookie.deleteCookie(this, this.options.cookieIdTable, UtilsCookie.cookieIds[cookieName])
  352. }
  353. }