0.5.1 • Published 1 year ago

vue-quick-tables v0.5.1

Weekly downloads
-
License
-
Repository
github
Last release
1 year ago

Vue 3 QuickTables

QuickTables is a quick table component for Vue 3. This package is still in development. Tests are still to come. Use at your own discretion.

npm

Installation

Install via NPM

npm install vue-quick-tables

Usage

Global

You can register QuickTables globally:

import { createApp } from 'vue';
import QuickTables from 'vue-quick-tables';
const app = createApp(App);
app.component('QuickTables', QuickTables);

Local

Locally install QuickTables by importing the component.

import QuickTables from 'vue-quick-tables';

export default {
  components: {
    QuickTables
  }
}

Basic Usage

Loading static data

The component accepts static data as an array via the rows property.

<template>
  <QuickTables
    :headers="headers"
    :rows="rows"
    />
</template>

<script>
  import QuickTables from './vue-quick-tables';
  export default {
    data() {
      return {
        headers: ['ID', 'Name'],
        rows: [
          ['1', 'Rhys Hall']
        ]
      }
    }
  }
</script>

Loading server data

You can pull data from your backend server using the request property.

request: {
  url: {your_API_endpoint}, // The URL to your data endpoint
  headers: {Accept: 'application/json'}, // Request headers
  method: 'GET', // The request method
  dataKey: 'data', // The data key in your response. (i.e. Laravel collections return data in the 'data' key.)
  extend: {withCredentials: true}, // Pass additional properties to FETCH or Axios
  queries: {} // Pass additional query params for the request
}

Without the headers or columns properties every item in the returned data rows will be dumped into the table.

<template>
  <QuickTables
    :request="request"
    />
</template>

Use the columns property to manage the returned data.

columns: [
  {
    data: 'name', // The data key of the column in each row
    sort: true, // Determines if the column is sortable
    class: 'text-center', // Custom class is applied to the <td> element
    value: false, // Hardcoded column value
  },

  'name', // A string instead of an object acts as a data key. Use this if you don't need any of the above customization
]

The headers property will set the table headers.

headers: [
  {
    value: 'Name', // The header label
    class: 'text-center', // Custom class is applied to the <th> element
    sort: true // Determines if the column is sortable. This overrides the sort key in the `columns` property
  },
  'Name' // Use a string instead of an object if you don't need the class or sort properties
]
Custom HTML

You can define a custom callback to manipulate the rendered output as raw HTML. The callback will have access to the column data and the entire row. The render method is only available to columns and not headers.

columns: [
  {
    data: 'name',
    render: ({data, row}) => `<a href="/item/${row.id}">${data.toUpperCase()}</a>`
  }
]
Slots

Both columns and headers can parse in custom Vue Slots. For this to work you need to define a slot name using the slot property.

import Button from './Button';

columns: [
  {
    slot: 'button'
  }
]

<quick-tables 
  :columns="columns">
  <template #button="{id, name}">
    <Button :item-id="id"
      :item-name="name" />
  </template>
</quick-tables>

Your component will have full access to the rows data.

<template #button="row">
  <Button :item-id="row.id" />
</template>

This also works for the table headers with the exception of there being no row data.

headers: [
  {
    slot: 'item'
  }
]

<quick-tables 
  :headers="headers">
  <template #item>
    <span>Custom header!</span>
  </template>
</quick-table>
Row Classes

You can add a custom class to the table header row using the rowClass property in your header setup.

headers: [
  {
    rowClass: 'bg-cool-gray',
  },
  'ID',
  'Name'
]

The positioning of the rowClass property does not matter as it will not be rendered with the other headers.

Setting a custom class on a body row works a littler differently. You'll need to set a value against the rowClass property of each row using the onBuildRows callback.

<template>
  <QuickTables
    :onBuildRows="onBuildRowsCallback"
    />
</template>

<script>
  export default {
    data() {
      return {
        onBuildRowsCallback: (rows) => {
          for(const[,i] of Object.entries(rows)) {
            i.rowClass = i.archived ? 'text-muted' : 'text-body';
          }
          return rows;
        }
      }
    }
  }
</script>
Using Axios

The component uses JS Fetch by default. If you prefer Axios then add the use-axios property.

<template>
  <QuickTables
    :request="request"
    use-axios
    />
</template>
Loading data on mount

By default the component will not fetch any data until it has been told to. The request-on-mount property will tell the component to fetch data as soon as it has finished mounting.

<template>
  <QuickTables
    :request="request"
    request-on-mount
    />
</template>

Pagination

The pagination property allows you to enable server-side pagination for your data.

pagination: {
  pageKey: 'page', // The query key used by your endpoint
  type: 'numbers', // Sets the pagination type. See all options below
  tabs: 4, // The number of tabs to display when using numbered pagination
  showCount: true, // Shows the number of results
  map: {
    currentPage: 'meta.current_page', // The data key for the current page
    lastPage: 'meta.last_page', // The data key for the last page
    from: 'meta.from',  // The data key for the current page from (start)
    to: 'meta.to', // The data key for the current page to (end)
    total: 'meta.total' // The data key for the total number of pages
  }
}

You can fetch a specific page with the page property.

<template>
  <QuickTables
    :request="request"
    :page="2"
    />
</template>
Types of pagination
ValueDescription
simpleIncludes a previous and next button. This is the default option.
numbersNumbered pagination. The tab option can be used to set the number of buttons.
fullIncludes first, last, previous and next buttons.
simple_numbersNumbered pagination with previous and net buttons.
full_numbersNumbered pagination with first, last, previous and next buttons.
first_last_numbersNumbered pagination with first and last buttons.

Filtering data

The filter property can be used to filter data through searching, sorting and limiting.

Search
filter: {
  search: 'Your search string', // The string to search
  searchKey: 'search' // The search query key used by your endpoint
}
Sorting
filter: {
  orderBy: 'created_at', // The column on your endpoint to sort by
  orderDir: 'desc', // The direction to sort. Accepts either asc or desc
  orderByKey: 'order_by', // The order by query key used by your endpoint
  orderDirKey: 'order_dir', // The order direction query key used by your endpoint
  map: {
    asc: 'asc', // The value used by your endpoint to represent ascending order
    desc: 'desc' // The value used by your endpoint to represent descending order
  }
}
Limiting results
filter: {
  limit: 20, // The number of results to return
  limitKey: 'limit' // The limit query key used by your endpoint
}

Language

You can change the default language used across the table with the messages property.

messages: {
  loading: 'Fetching new data..',
  noRows: 'No results found.',
  prev: 'Previous',
  next: 'Next',
  first: 'First',
  last: 'Last',
  counter: function({total, to, from}) {
    return `Showing ${from} to ${to} of ${total} entries`
  }
}

Styling the table

The component includes a basic theme located in assets/DefaultTheme.css.

You can set a class prefix for each part of the component which will make writing a custom theme easier.

<template>
  <QuickTables
    :classPrefix="QuickTables"
    />
</template>

Manipulating server data

Use the onBuildRows property to manipulate data before it is rendered. You must ensure your callback returns the rows as an array.

<template>
  <QuickTables
    :onBuildRows="onBuildRowsCallback"
    />
</template>

<script>
  export default {
    data() {
      return {
        onBuildRowsCallback: (rows) => {
          // Do something with the rows.
          return updatedRows;
        }
      }
    }
  }
</script>

Draggable Rows

Basic support for draggable table rows is available as an optional setting.

Enable draggable rows with the draggable-rows attributes.

<template>
  <QuickTables
    draggable-rows />
</template>

The draggable-rows attribute supports the following properties.

PropertyDefaultDescription
draggingClassis-draggingThe class applied to a row while it is being dragged. Use this to apply any styling.
onDrop(row) => {}Is called when the row is dropped.
onDragStart(row) => {}Is called when the drag is first initiated.

Both the onDrop and onDragStart callbacks return the current rows data. Because this data is a proxy you can mutate it in your callbacks which will result in a re-render of that specific row.

<template>
  <QuickTables
    :draggable-rows="draggableConfig" />
</template>

<script>
  export default {
    data() {
      return {
        draggableConfig: {
          onDrop: this.onDrop
        }
      }
    },
    methods: {
      onDrop(rowData) {
        rowData[0] = 'A new value for the first column!'
      }
    }
  }
</script>

Contributing

Help improve this package by contributing.

Before opening a pull request, please first discuss the proposed changes via Github issue or email.

License

This project is licensed under the MIT License - see the LICENSE file for details

0.5.1

1 year ago

0.5.0

2 years ago

0.4.4

2 years ago

0.4.3

2 years ago

0.4.2

2 years ago

0.4.1

2 years ago

0.4.0

2 years ago

0.3.0

2 years ago

0.2.1

2 years ago

0.2.0

2 years ago

0.1.2

2 years ago

0.1.1

2 years ago

0.1.0

2 years ago