Vue.js 2.0 data-table

Vue.js 2.0 dynamic table component example

by Michael Menaker

HTML

<script src="https://unpkg.com/[email protected]/dist/vue.js"></script>
<script type="text/javascript" src="https://unpkg.com/v-data-table/dist/v-data-table.js"></script>

<!-- demo root element -->
<div id="demo">
  <data-table :data="gridData">
    <template slot="caption">Basic Table</template>
  </data-table>
  <br/>
  <br/>
  <form id="search">
    Search
    <input name="query" v-model="searchQuery">
  </form>
  <data-table :data="gridData" :columns-to-display="gridColumns" :filter-key="searchQuery" :display-names="displayNames" :child-hideable="true" :child-init-hide="true" :columns-to-not-sort="['action']">
    <template slot="caption">Table with options</template>
    <template slot="child" scope="props">
      This is my child row: {{props.entry.name}}
    </template>
    <template slot="name" scope="props">
      <b>{{props.entry.name}}</b>
      <br />
    </template>
    <template slot="action" scope="props">
      <button @click="showPower(props.entry.power)">
        Show Power
      </button>
    </template>
  </data-table>
  <data-table :data="[]" :columns-to-display="['col1', 'col2']">
  <template slot="nodata">No data found</template>
</data-table>
</div>

CSS

body {
  font-family: Helvetica Neue, Arial, sans-serif;
  font-size: 14px;
  color: #444;
}

table {
  border: 2px solid #42b983;
  border-radius: 3px;
  background-color: #fff;
}

th {
  background-color: #42b983;
  color: rgba(255, 255, 255, 0.66);
  cursor: pointer;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}

td {
  background-color: #f9f9f9;
}

th,
td {
  min-width: 120px;
  padding: 10px 20px;
}

th.active {
  color: #fff;
}

th.active .arrow {
  opacity: 1;
}

.arrow {
  display: inline-block;
  vertical-align: middle;
  width: 0;
  height: 0;
  margin-left: 5px;
  opacity: 0.66;
}

.arrow.asc {
  border-left: 4px solid transparent;
  border-right: 4px solid transparent;
  border-bottom: 4px solid #fff;
}

.arrow.dsc {
  border-left: 4px solid transparent;
  border-right: 4px solid transparent;
  border-top: 4px solid #fff;
}

JavaScript

// bootstrap the demo
Vue.use(DataTable)

var demo = new Vue({
  el: '#demo',
  data: {
    searchQuery: '',
    gridColumns: ['name', 'power', 'action'],
    displayNames: {
      'power': 'Super Powers'
    },
    gridData: [{
      name: 'Chuck Norris',
      power: Infinity
    }, {
      name: 'Bruce Lee',
      power: 9000
    }, {
      name: 'Jackie Chan',
      power: 7000
    }, {
    name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    }, {name: 'Jackie Chan',
      power: 7000
    },...