infinite-table
An infinite scrolling table with editable features. No jQuery.
Usage
Minimum required setup:
var InfiniteScroll = require('infinite-table');
new InfiniteScroll('<table element ID>', {
url: <url to get data from>,
fields: {
<returned data property> : {}
}
});
For the spinner, include
<link rel="stylesheet" href="/css/style.css"/>
Options:
new InfiniteScroll('<table element ID>', {
url: <url to get data from>,
fields: {
<returned data property> : {
data: {
<data-attribute>: ':<returned data property>:'
// for example:
id: ':id:' // will create a data-attribute like data-id="1"
},
// setup listener, e.g. "click" listener (set as many as you wish):
listener: [{
handle: (e) => {alert(e.target.innerHTML)}, // callback
on: 'click' // listen for event
}],
// if editable is provided, the td will be given contenteditable attribute,
// same signature as above for listeners
editable: [{
handle: (e) => {alert(e.target.innerHTML)},
on: 'blur'
}]
}
},
perPage: 20, // how many entries should be fetched per "page"
loadTiming: 2, // when should the loading happen (defaults to the penultimate tr)
transport: 'ajax', // possible transports: ajax/websockets,
spinner: 0 // possible 0, 1, 2
});
An ajax (default) / websockets GET
request is made whenever you hit the trigger. The signature is:
<url>?skip=<skip>&limit=<limit>
So your backend only has to GET
skip and limit to query for the data.
Example query
SELECT * FROM `foo` LIMIT <limit> OFFSET <skip>
If you're using sails.js you're in luck - simply create the contoller and model, everything else works out of the box.
The scroller expects json data as returned object.
INCLUDED DEPENDENCIES
lodash, bluebird
included: SpinKit from https://github.com/tobiasahlin/SpinKit
LICENSE
MIT
DEMO
Balance is editable, name and phone both have click event listeners attached. Try it out! See the table below and click and edit it. Example data at gh-pages/example/exampleData.jsonExample configuration:
new InfiniteScroll('example', {
transport: 'faker', // switch to ajax
url: '/example/exampleData.json', // switch to url
fields: {
name:{
data: {
id: ':_id:'
},
listener: [{
handle: (e) => {alert('Attribute id: ' + e.target.getAttribute('data-id'))}, // callback
on: 'click' // listen for event
}]
},
balance:{
editable: [{
handle: (e) => {
alert('New balance: ' + e.target.innerHTML)
},
on: 'blur'
}]
},
phone:{
data: {
phone: ':phone:'
},
listener: [{
handle: (e) => {alert('Attribute phone: ' + e.target.getAttribute('data-phone'))},
on: 'click'
}]
}
}
});
Required HTML:
<div>
<table id="<tableId>">
<thead>
<tr>
<th>name</th>
<th>balance</th>
<th>phone</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
name | balance | phone |
---|