Git Product home page Git Product logo

vue-scroll-table's Introduction

Vue Scroll Table

Example

Version Downloads License

A Vue table component with fully customizable cells (using scoped slots), a sticky first column, horizontal scrolling and pagination.

Demo

Basic

Edit Vue Scroll Table basic example

Installation

npm install --save vue-scroll-table

Usage

ES6 modules, we recommend checking out the CodeSandbox example!

<template>
  <div id="app">
    <h1>Vue Scroll Table</h1>
    <p>A Vue table component with fully customizable cells (using scoped slots), a sticky first column, horizontal scrolling and pagination.</p>
    <scroll-table v-if="headers && rows"
                  :headers="headers"
                  :data="rows"
                  :hasScroll="true"
                  :styles="styles"
                  :classes="classes">
      <template slot="first name"
                slot-scope="{ data }">
        <img :src="data.attributes.avatarUrl" />
        <span>
          {{ data.value }}
        </span>
      </template>
      <template slot="favorite color"
                slot-scope="{ data }">
        <svg width="20"
             height="20">
          <rect width="20"
                height="20"
                :style="`fill:${data};`"></rect>
        </svg>
      </template>
    </scroll-table>
  </div>
</template>
<script>
  import ScrollTable from "vue-scroll-table";

  const getData = () => {
    // Or load your own data.
    return fetch(
      'https://raw.githubusercontent.com/stijlbreuk/vue-scroll-table/master/example/assets/data.json'
    );
  };

  export default {
    name: 'App',
    components: {
      ScrollTable
    },
    created() {
      getData()
        .then(response => response.json())
        .then(data => {
          this.headers = data.headers;
          this.rows = data.rows;
        });
    },
    data() {
      return {
        headers: null,
        rows: null,
        styles: {
          sticky: {
            tableHeader: {
              'font-style': 'italic'
            }
          }
        },
        classes: {
          tableContainer: ['align-text'],
          sticky: {
            container: ['sticky-column'],
            tableHeader: ['header-padding'],
            tableData: ['table-cell']
          },
          scroll: {
            tableHeader: ['header-padding'],
            tableData: ['table-cell']
          }
        }
      };
    }
  };
</script>

<style lang="scss">
#app {
  font-family: "Avenir", Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}

.vst_table-container.align-text {
  text-align: left;
}

.vst_table-container .header-padding {
  padding: 2rem 1.5rem 1.5rem 1.5rem;
}

.vst_table-container .table-cell {
  padding: 0.5rem 2rem;
  vertical-align: middle;

  & img {
    vertical-align: middle;
  }
}

.vst_table-container .sticky-column {
  box-shadow: 10px 0px 10px -12px black;
}
</style>

CommonJS

const VueScrollTable = require('vue-scroll-table');

In a script tag, this loads the component using the global Vue instance.

<script src="https://unpkg.com/vue-scroll-table"></script>

Properties

Property Description Type Default Example
limits The amount of rows a user can choose to show at once. Number array [ 25, 50, 100] :limits="[ 5, 10, 25]"
hasScroll Whether or not the table will be scrollable Boolean false :hasScroll="false"
headers The headers (or columns) for your table. Header object array [] :headers="headers"
:headers="[{ text: 'First name', sortable: true, width: 250 }]"
data The data (or rows) that should be displayed in your table. Array of nested Data objects or String arrays [] :data="data"
:data="[{ value: 'Jane', attributes: { avatarUrl: 'url-to-avatar' } }]"
classes The CSS classes you want to apply to specific elements in the table. Vue Scroll Table classes object {} :classes="classes"
styles The CSS styles you want to apply to specific elements in the table. Vue Scroll Table Style object {} :styles="styles"
translations Translations for certain labels in the table. The only label that exists right now is the label in the 'limit' dropdown Object { limit: 'per page' } :translations="{ limit: 'per pagina' }"

headers

Properties of a header object.

Property Description Type Default Example
text The name of the column which is shown in a table header. String - { text: 'First name' }
sortable Whether or not a column is sortable Boolean false { sortable: true }
width The minimum width of a column Number - { width: 250 }

data

A data entry (or row) can consist of an array containing a value for every column or can consist of a so called data object.

Properties of a data object

Property Description Type Default Example
value The value which is displayed. Any - { value: 'Jane Doe' }
attributes An object in which custom data for a cell can be saved, useful when using slots to customize cells of a specific table column. Any - { attributes: { avatarUrl: 'url-to-avatar' } }

Classes & styles

The 'classes' and 'styles' objects can be used to change the look of the Vue Scroll Table. Both objects allow the same properties.

classes

In the classes object, CSS classes for different parts of the table can be specified. Using the classes object is recommended when you want to apply your own static styling to the table or when you want to override the basic styling that is applied by default.

Every property accepts an array of CSS class names (without a dot).

const classes = {
  // Pagination classes
  pagination: {
      container: [],
      limit: {
          container: [],
          dropdown: []
      },
      // Numbered pagination buttons
      links: {
          container: [],
          buttons: []
      }
  },
  // The container element in which both the 'sticky' column table and the underlying 'scroll' table can be found
  tableContainer: ["align-text"],
  sticky: {
      container: ["sticky-column"],
      table: [],
      tableHeader: ["header-padding"],
      tableRow: [],
      tableData: ["table-cell"]
  },
  scroll: {
      container: [],
      table: [],
      tableHeader: ["header-padding"],
      tableRow: [],
      tableData: ["table-cell"]
  },
  // Classes for the sort buttons which can be found in the table headers
  sortButtons: {
      button: [],
      active: []
  }
}

styles

In the styles object, CSS styles for different parts of the table can be specified. You might want to use the styles object when you want dynamically / reactively change the style of (a part) of the table.

Every property accepts an object which can contain any CSS style rule.

const styles = {
  // Pagination classes
  pagination: {
      container: {},
      limit: {
          container: {},
          dropdown: {}
      },
      // Numbered pagination buttons
      links: {
          container: {},
          buttons: {}
      }
  },
  // The container element in which both the 'sticky' column table and the underlying 'scroll' table can be found
  tableContainer: {},
  sticky: {
      container: {},
      table: {},
      tableHeader: {
        'font-style': 'italic'
      },
      tableRow: {},
      tableData: {}
  },
  scroll: {
      container: {},
      table: {},
      tableHeader: {},
      tableRow: {},
      tableData: {}
  },
  // Classes for the sort buttons which can be found in the table headers
  sortButtons: {
      button: {},
      active: {}
  }
}

Events

The Vue Scroll Table doesn't emit any events.

Slots

Slots can be used to customize cells of a specific column. A use case for slots can be seen in de basic CodePen example where slots are used to display an avatar for in the 'first name' column of a person.

The name of a slot should correspond with the lowercase text of one of the table headers.

Slots can be extremely powerful when used in combination with data objects. As you can see in the example, a custom property called 'avatarUrl' is present under 'attributes' which is exposed through the 'slot-scope' so it can be referenced in your template.

<template slot="first name"
          slot-scope="{ data, index, row, header }">
  <!-- Data is the data object to which you can add custom properties or it contains the plain value that will be displayed in the table cell -->
  <img :src="data.attributes.avatarUrl"/>
  <span>
    {{ data.value }} <!-- Regular display value, which is someone's first name in our example -->
  </span>
</template>

Slot scope

Property Description Type
data The data object or a string containing the value for the table cell. Data object or string
index The index of the column the table cell belongs to. Number
row The full row object the table cell belongs to. Array Data objects or strings
header The header object of the column you wanted to customize cells for. Header object

For more info about scoped slots, check out Vue's documentation.

Contributing

Checkout GitHub issues for any issues we need some help with.

# Serve with hot reload (default at localhost:8080)
vue serve --open ./example/App.vue

# Build all variants
npm run build

License

MIT

Created by Stijlbreuk

vue-scroll-table's People

Contributors

nino-vrijman avatar stijlbreuk-dev avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

vue-scroll-table's Issues

Search global table contents

Allow users to search through the entire table

  • add text input to the component
  • search data of all columns on change
  • only show filtered data

Lazy data loading

Lazy data loading instead of providing all data before loading Vue Scroll Table.
Requires:

  • specifying a total amount of records to ensure the correct amount of pagination buttons are shown
  • specifying a callback which is invoked after a user clicked on a pagination button

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.