Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

105 linhas
2.8 KiB

  1. /*
  2. columns: <displayed columns>,
  3. serial: true/false,
  4. model_options: <model.options>
  5. */
  6. export default initial_vnode => {
  7. // component state
  8. let model = initial_vnode.attrs.model
  9. // displayed columns
  10. let columns = initial_vnode.attrs.columns
  11. if (!columns) {
  12. if (model.configs().selects) {
  13. columns = model.configs().selects.map(select => ({
  14. label: select.alias || select.label
  15. }))
  16. }
  17. }
  18. // pagination
  19. let offset = 0
  20. let limit = initial_vnode.attrs.pagination && initial_vnode.attrs.pagination.size || Infinity
  21. let pages = [] // [{activie: boolean, show: boolean}]
  22. function generate_pages() {
  23. if (limit > 0 && limit < Infinity && model.cache().count) {
  24. let active_page = offset / limit
  25. pages = Array.from(Array(Math.floor(model.cache().count / limit) + 1))
  26. .map((_,i) => active_page == i ? {active: true} : {active: false})
  27. if (pages.length <= 10) {
  28. pages.forEach((_, i, pages) => pages[i].show = true)
  29. } else {
  30. // some wicked calculation
  31. let _showed_pages = new Set([0, active_page, pages.length -1])
  32. let l = active_page, r = active_page
  33. while (_showed_pages.size < 10) {
  34. l -= 1
  35. if (l < 0) {
  36. _showed_pages.add(r+1)
  37. r += 1
  38. } else {
  39. _showed_pages.add(l)
  40. }
  41. if (_showed_pages.size < 10) {
  42. r += 1
  43. if (r >= pages.length) {
  44. _showed_pages.add(l-1)
  45. l -= 1
  46. } else {
  47. _showed_pages.add(r)
  48. }
  49. }
  50. }
  51. _showed_pages.forEach(v => pages[v].show = true)
  52. }
  53. }
  54. }
  55. return {
  56. view: vnode => {
  57. // try to generate columns if it is still uninitialized
  58. if (typeof columns == 'undefined' || columns.length == 0) {
  59. columns = model.data(offset, limit) && model.data(offset, limit).length && Object.keys(model.data(offset, limit)[0]).map(key => ({label: key})) || []
  60. }
  61. // refresh paginations
  62. generate_pages()
  63. return [
  64. m('table', [
  65. // always show table header
  66. m('thead', m('tr', [
  67. vnode.attrs.serial ? m('th.centered', '序号') : undefined,
  68. ...columns.map(column => m('th.centered', column.label))
  69. ])),
  70. model.data(offset, limit).length ? m('tbody', model.data(offset, limit).map((row, i) => m('tr', [
  71. vnode.attrs.serial ? m('td.centered', offset+i+1) : undefined,
  72. ...columns.map(column => {
  73. let v = row[column.label] || ''
  74. if (typeof column.tag != 'undefined')
  75. v = m(column.tag, v)
  76. return m(`td${column.class || ''}`, v)
  77. })
  78. ]))) : m('', 'Empty')
  79. ]),
  80. pages.length > 1 ?
  81. m('.centered',
  82. m('.pagination.centered', pages.map((page, i) => page.show ? m('a', {
  83. class: page.active ? 'active' : '',
  84. onclick: e => {
  85. offset = i*limit
  86. model.select(offset, limit)
  87. }
  88. }, i+1) : undefined))
  89. ) : undefined
  90. ]
  91. }
  92. }
  93. }