npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

vue-scroll-table

v0.3.7

Published

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

Downloads

86

Readme

Vue Scroll Table

Demo

Basic

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