grid.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // register the grid component
  2. Vue.component('demo-grid', {
  3. template: '#grid-template',
  4. replace: true,
  5. props: {
  6. data: Array,
  7. columns: Array,
  8. filterKey: String
  9. },
  10. data: function () {
  11. var sortOrders = {}
  12. this.columns.forEach(function (key) {
  13. sortOrders[key] = 1
  14. })
  15. return {
  16. sortKey: '',
  17. sortOrders: sortOrders
  18. }
  19. },
  20. computed: {
  21. filteredData: function () {
  22. var sortKey = this.sortKey
  23. var filterKey = this.filterKey && this.filterKey.toLowerCase()
  24. var order = this.sortOrders[sortKey] || 1
  25. var data = this.data
  26. if (filterKey) {
  27. data = data.filter(function (row) {
  28. return Object.keys(row).some(function (key) {
  29. return String(row[key]).toLowerCase().indexOf(filterKey) > -1
  30. })
  31. })
  32. }
  33. if (sortKey) {
  34. data = data.slice().sort(function (a, b) {
  35. a = a[sortKey]
  36. b = b[sortKey]
  37. return (a === b ? 0 : a > b ? 1 : -1) * order
  38. })
  39. }
  40. return data
  41. }
  42. },
  43. filters: {
  44. capitalize: function (str) {
  45. return str.charAt(0).toUpperCase() + str.slice(1)
  46. }
  47. },
  48. methods: {
  49. sortBy: function (key) {
  50. this.sortKey = key
  51. this.sortOrders[key] = this.sortOrders[key] * -1
  52. }
  53. }
  54. })
  55. // bootstrap the demo
  56. var demo = new Vue({
  57. el: '#demo',
  58. data: {
  59. searchQuery: '',
  60. gridColumns: ['name', 'power'],
  61. gridData: [
  62. { name: 'Chuck Norris', power: Infinity },
  63. { name: 'Bruce Lee', power: 9000 },
  64. { name: 'Jackie Chan', power: 7000 },
  65. { name: 'Jet Li', power: 8000 }
  66. ]
  67. }
  68. })