Compare commits

..
18 Commits
Author SHA1 Message Date
Tanner Linsley 4a871db71f 4.2.4 2017-01-18 09:08:21 -07:00
Tanner Linsley 505db8d43e Fixed a bug present when no column groups are used. 2017-01-18 09:08:05 -07:00
Tanner Linsley 387f22028a Pass linting 2017-01-17 11:40:14 -07:00
Tanner Linsley f2839dcc6d Docs update 2017-01-17 11:37:50 -07:00
Tanner Linsley 8a74b2b795 Better storybook 2017-01-17 11:36:30 -07:00
Tanner Linsley 9bbdd762e6 Added CNAME 2017-01-17 11:01:48 -07:00
Tanner Linsley 37cf57e1d0 Removed zab 2017-01-17 10:58:25 -07:00
Tanner Linsley cd507d39a4 Docs now serve using Github Pages 2017-01-17 10:48:53 -07:00
Tanner Linsley 4873af8c99 Readme updates 2017-01-17 09:55:41 -07:00
Tanner Linsley 6c05306d99 Readme Updates 2017-01-17 09:17:02 -07:00
Tanner Linsley ac2f9a2467 Readme Updates 2017-01-17 09:15:57 -07:00
Tanner Linsley 69eccc8909 Reamde Updates 2017-01-17 09:13:41 -07:00
Tanner Linsley 721d193883 Remade updates 2017-01-17 08:28:34 -07:00
Tanner Linsley 21cae2416f Readme Update 2017-01-17 07:59:32 -07:00
Tanner Linsley 0bf363aeaf 4.2.3 2017-01-16 15:52:47 -07:00
Tanner Linsley 517702922e Fix padRows key 2017-01-16 15:52:42 -07:00
Tanner Linsley ba1325336f 4.2.2 2017-01-16 15:01:44 -07:00
Tanner Linsley 7bd30b623c Improved Sorting Performance 2017-01-16 15:01:37 -07:00
20 changed files with 245 additions and 92 deletions
+2 -2
View File
@@ -15,7 +15,7 @@ import ServerSide from '../stories/ServerSide.js'
import SubComponents from '../stories/SubComponents.js'
import Pivoting from '../stories/Pivoting.js'
import PivotingSubComponents from '../stories/PivotingSubComponents.js'
import MillionRows from '../stories/MillionRows.js'
import OneHundredKRows from '../stories/OneHundredKRows.js'
//
configure(() => {
storiesOf('1. Docs')
@@ -36,5 +36,5 @@ configure(() => {
.add('Sub Components', SubComponents)
.add('Pivoting & Aggregation', Pivoting)
.add('Pivoting & Aggregation w/ Sub Components', PivotingSubComponents)
.add('1 Million Rows w/ Pivoting & Sub Components', MillionRows)
.add('100k Rows w/ Pivoting & Sub Components', OneHundredKRows)
}, module)
+1
View File
@@ -0,0 +1 @@
react-table.js.org
+27 -15
View File
@@ -1,5 +1,5 @@
<div align="center">
<a href="https://github.com/tannerlinsley/react-table"><img src="https://github.com/tannerlinsley/react-table/raw/master/media/Banner.png" alt="React Table Logo" style="width:450px;"/></a>
<a href="https://github.com/tannerlinsley/react-table" target="\_parent"><img src="https://github.com/tannerlinsley/react-table/raw/master/media/Banner.png" alt="React Table Logo" style="width:450px;"/></a>
<br />
<br />
@@ -8,7 +8,22 @@
# React Table
`react-table` is a **lightweight, fast and extendable datagrid** built for React
[![Build Status](https://travis-ci.org/tannerlinsley/react-table.svg?branch=master)](https://travis-ci.org/tannerlinsley/react-table) [![npm](https://img.shields.io/npm/dm/react-table.svg)](https://npmjs.com/packag/react-table) [![react-table on Slack](https://img.shields.io/badge/slack-react--table-blue.svg)](https://react-table-slack.herokuapp.com/) [![GitHub stars](https://img.shields.io/github/stars/tannerlinsley/react-table.svg?style=social&label=Star)](https://github.com/tannerlinsley/react-table) [![Twitter Follow](https://img.shields.io/twitter/follow/tannerlinsley.svg?style=social&label=Follow)](https://twitter.com/tannerlinsley)
<a href="https://travis-ci.org/tannerlinsley/react-table" target="\_parent">
<img alt="" src="https://travis-ci.org/tannerlinsley/react-table.svg?branch=master" />
</a>
<a href="https://npmjs.com/package/react-table" target="\_parent">
<img alt="" src="https://img.shields.io/npm/dm/react-table.svg" />
</a>
<a href="https://react-table-slack.herokuapp.com/" target="\_parent">
<img alt="" src="https://img.shields.io/badge/slack-react--table-blue.svg" />
</a>
<a href="https://github.com/tannerlinsley/react-table" target="\_parent">
<img alt="" src="https://img.shields.io/github/stars/tannerlinsley/react-table.svg?style=social&label=Star" />
</a>
<a href="https://twitter.com/tannerlinsley" target="\_parent">
<img alt="" src="https://img.shields.io/twitter/follow/tannerlinsley.svg?style=social&label=Follow" />
</a>
## Features
@@ -18,9 +33,9 @@
- Column Pivoting & Aggregation
- Minimal design & easily themeable
- Fully controllable via optional props and callbacks
- <a href="https://medium.com/@tannerlinsley/why-i-wrote-react-table-and-the-problems-it-has-solved-for-nozzle-others-445c4e93d4a8#.axza4ixba" target="\_blank">"Why I wrote React Table and the problems it has solved for Nozzle.io</a> by Tanner Linsley
- <a href="https://medium.com/@tannerlinsley/why-i-wrote-react-table-and-the-problems-it-has-solved-for-nozzle-others-445c4e93d4a8#.axza4ixba" target="\_parent">"Why I wrote React Table and the problems it has solved for Nozzle.io</a> by Tanner Linsley
## <a href="http://react-table.zabapps.com/?selectedKind=2.%20Demos&selectedStory=Client-side%20Data&full=0&down=1&left=1&panelRight=0&downPanel=kadirahq%2Fstorybook-addon-actions%2Factions-panel" target="\_blank">Demo</a>
## <a href="http://react-table.zabapps.com/?selectedKind=2.%20Demos&selectedStory=Client-side%20Data&full=0&down=1&left=1&panelRight=0&downPanel=kadirahq%2Fstorybook-addon-actions%2Factions-panel" target="\_parent">Demo</a>
## Table of Contents
- [Installation](#installation)
@@ -30,8 +45,8 @@
- [Columns](#columns)
- [Styles](#styles)
- [Header Groups](#header-groups)
- [Pivoting & Aggregation](#pivoting-aggregation)
- [Sub Tables & Sub Components](#sub-tables-sub-components)
- [Pivoting & Aggregation](#pivoting--aggregation)
- [Sub Tables & Sub Components](#sub-tables--sub-components)
- [Server-side Data](#server-side-data)
- [Fully Controlled Component](#fully-controlled-component)
- [Multi-sort](#multi-sort)
@@ -302,7 +317,7 @@ If you want to handle pagination, and sorting on the server, `react-table` makes
/>
```
For a detailed example, take a peek at our [async table mockup](https://github.com/tannerlinsley/react-table/blob/master/example/src/screens/async.js)
For a detailed example, take a peek at our <a href="https://github.com/tannerlinsley/react-table/blob/master/stories/ServerSide.js" target="\_parent">async table mockup</a>
## Fully Controlled Component
React Table by default works fantastically out of the box, but you can achieve even more control and customization if you choose to maintain the state yourself. It is very easy to do, even if you only want to manage *parts* of the state.
@@ -368,7 +383,7 @@ Object.assign(ReactTableDefaults, {
/>
```
If you choose to change the core components React-Table uses to render, you must make sure your replacement components consume and utilize all of the supplied and inherited props that are needed for that component to function properly. We would suggest investigating [the source](https://github.com/tannerlinsley/react-table/blob/master/src/index.js) for the component you wish to replace.
If you choose to change the core components React-Table uses to render, you must make sure your replacement components consume and utilize all of the supplied and inherited props that are needed for that component to function properly. We would suggest investigating <a href="https://github.com/tannerlinsley/react-table/blob/master/src/index.js" target="\_parent">the source</a> for the component you wish to replace.
## Contributing
@@ -381,18 +396,15 @@ If you would like to help develop a suggested feature follow these steps:
- Implement your changes to files in the `src/` directory
- Submit PR for review
If you would like to preview your changes, you can link and utilize the example like so:
If you would like to preview your changes as you develop, you can link and utilize our <a href="https://github.com/storybooks/react-storybook" target="\_parent">React Storybook</a> like so:
- `npm link`
- `cd example`
- `npm install`
- `npm link react-table`
- `npm run watch`
- Make changes to the example in `src/screens/index.js` if needed
- `run storybook` (or run them in separate tabs)
- Make changes to stories in `/stories`, or create a new one if needed
- View changes at `localhost:8000`
## Used By
<a href='https://nozzle.io'>
<a href='https://nozzle.io' target="\_parent">
<img src='https://nozzle.io/img/logo-blue.png' alt='Nozzle Logo' style='width:300px;'/>
</a>
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

+22
View File
@@ -0,0 +1,22 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script>
if (window.parent !== window) {
window.__REACT_DEVTOOLS_GLOBAL_HOOK__ = window.parent.__REACT_DEVTOOLS_GLOBAL_HOOK__;
}
</script>
<title>React Storybook</title>
</head>
<body>
<div id="root"></div>
<div id="error-display"></div>
<script src="static/preview.30adfa2464622c0f1904.bundle.js"></script>
</body>
</html>
+44
View File
@@ -0,0 +1,44 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="storybook-version" content="2.35.2">
<title>React Storybook</title>
<style>
/*
When resizing panels, the drag event breaks if the cursor
moves over the iframe. Add the 'dragging' class to the body
at drag start and remove it when the drag ends.
*/
.dragging iframe {
pointer-events: none;
}
/* Styling the fuzzy search box placeholders */
.searchBox::-webkit-input-placeholder { /* Chrome/Opera/Safari */
color: #ddd;
font-size: 16px;
}
.searchBox::-moz-placeholder { /* Firefox 19+ */
color: #ddd;
font-size: 16px;
}
.searchBox:focus{
border-color: #EEE !important;
}
.btn:hover{
background-color: #eee
}
</style>
</head>
<body style="margin: 0;">
<div id="root"></div>
<script src="static/manager.32cbfa2b6d56d1f8fbac.bundle.js"></script>
</body>
</html>
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"version":3,"file":"static/manager.32cbfa2b6d56d1f8fbac.bundle.js","sources":["webpack:///static/manager.32cbfa2b6d56d1f8fbac.bundle.js"],"mappings":"AAAA;AA4zDA;AAg4DA;AAwgEA;AAqiEA;AAk0EA;AA67CA;AA0qDA;AAy4DA;AA8lDA;AA4hDA;AA62DA;AA+/DA;AA6mDA;AAsyCA;AA2gDA;AA+2DA;AA+jEA;AAixDA;AA6lDA;AA+nDA;AA0qEA;AAinDA;AAs3DA;AA80GA;AAhvCA;AAuqGA;AAuqEA;AA6wEA;AAleA;AA+gEA;AA+mCA","sourceRoot":""}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"version":3,"file":"static/preview.30adfa2464622c0f1904.bundle.js","sources":["webpack:///static/preview.30adfa2464622c0f1904.bundle.js"],"mappings":"AAAA;AAwxDA;AA45DA;AAo9DA;AA24DA;AAg3CA;AAkoIA;AAgwGA;AA+sPA;AAk6CA;AAq4DA;AA4gDA;AAmpDA;AA05DA;AAkoDA;AAu+CA;AA0rDA;AAiqEA;AAyoDA;AA8xCA;AAmnDA;AAqzDA;AAqhEA;AAqwDA;AAk7DA;AAw1CA;AAisFA;AAw3GA;AAo/CA;AAikCA;AA29BA;AA+vBA;AAy1CA","sourceRoot":""}
+4 -3
View File
@@ -1,6 +1,6 @@
{
"name": "react-table",
"version": "4.2.1",
"version": "4.2.4",
"description": "A fast, lightweight, opinionated table and datagrid built on React",
"license": "MIT",
"homepage": "https://github.com/tannerlinsley/react-table#readme",
@@ -32,7 +32,7 @@
"umd": "rm -rf react-table.js && browserify lib/index.js -s reactTable -x react -t babelify -g uglifyify -o react-table.js",
"prepublish": "npm-run-all build:* && npm run umd",
"storybook": "start-storybook -p 8000 -c .storybook",
"deploy": "build-storybook && zab deploy"
"docs": "build-storybook -o docs"
},
"dependencies": {
"classnames": "^2.2.5"
@@ -73,7 +73,8 @@
"lib",
"example",
"react-table.js",
"stories"
"stories",
"docs"
]
},
"babel": {
+42 -26
View File
@@ -170,18 +170,23 @@ export default React.createClass({
oldState.pivotBy !== newState.pivotBy ||
oldState.sorting !== newState.sorting
) {
this.setState(this.getDataModel(nextProps, nextState))
this.setStateWithData(this.getDataModel(nextProps, nextState))
}
},
setStateWithData (newState, cb) {
const oldState = this.getResolvedState()
const newResolvedState = this.getResolvedState({}, newState)
if (oldState.sorting !== newResolvedState.sorting) {
Object.assign(newState, this.getDataModel({}, newState))
if (
oldState.resolvedData !== newResolvedState.resolvedData ||
oldState.sorting !== newResolvedState.sorting
) {
Object.assign(newState, this.getSortedData({}, newState))
}
// Calculate pageSize all the time
newState.pages = newResolvedState.manual ? newResolvedState.pages : Math.ceil(newResolvedState.resolvedData.length / newResolvedState.pageSize)
if (newResolvedState.resolvedData) {
newState.pages = newResolvedState.manual ? newResolvedState.pages : Math.ceil(newResolvedState.resolvedData.length / newResolvedState.pageSize)
}
return this.setState(newState, cb)
},
@@ -190,8 +195,7 @@ export default React.createClass({
const newState = this.getResolvedState(nextProps, nextState)
// State changes that trigger a render
if (
oldState.sorting !== newState.sorting ||
oldState.resolvedData !== newState.resolvedData ||
oldState.sortedData !== newState.sortedData ||
oldState.page !== newState.page ||
oldState.pageSize !== newState.pageSize ||
oldState.expandedRows !== newState.expandedRows
@@ -259,13 +263,15 @@ export default React.createClass({
headerGroups,
standardColumns,
allDecoratedColumns,
hasHeaderGroups
hasHeaderGroups,
// Sorted Data
sortedData
} = resolvedProps
// Pagination
const startRow = pageSize * page
const endRow = startRow + pageSize
const pageRows = manual ? resolvedData : resolvedData.slice(startRow, endRow)
const pageRows = manual ? resolvedData : sortedData.slice(startRow, endRow)
const minRows = this.getMinRows()
const padRows = pages > 1 ? _.range(pageSize - pageRows.length)
: minRows ? _.range(Math.max(minRows - pageRows.length, 0))
@@ -332,7 +338,7 @@ export default React.createClass({
>
{typeof column.header === 'function' ? (
<column.header
data={resolvedData}
data={sortedData}
column={column}
/>
) : column.header}
@@ -377,7 +383,7 @@ export default React.createClass({
<span key={column.id}>
{typeof column.header === 'function' ? (
<column.header
data={resolvedData}
data={sortedData}
column={column}
/>
) : column.header}
@@ -427,7 +433,7 @@ export default React.createClass({
>
{typeof column.header === 'function' ? (
<column.header
data={resolvedData}
data={sortedData}
column={column}
/>
) : column.header}
@@ -450,7 +456,7 @@ export default React.createClass({
const rowPivotColumn = allDecoratedColumns.find(d => d.id === row[pivotIDKey])
const PivotCell = rowPivotColumn && rowPivotColumn.pivotRender
return (
<TrGroupComponent key={i}>
<TrGroupComponent key={rowInfo.nestingPath.join('_')}>
<TrComponent
onClick={event => onTrClick(rowInfo.row, event)}
className={classnames(trClassName, trClassCallback(rowInfo), row._viewIndex % 2 ? '-even' : '-odd')}
@@ -535,9 +541,10 @@ export default React.createClass({
const makePadRow = (row, i) => {
return (
<TrGroupComponent>
<TrGroupComponent
key={i}
>
<TrComponent
key={i}
className={classnames(trClassName, '-padRow')}
style={trStyle}
>
@@ -618,9 +625,7 @@ export default React.createClass({
data,
pivotIDKey,
pivotValKey,
subRowsKey,
manual,
sorting
subRowsKey
} = this.getResolvedState(nextProps, nextState)
// Determine Header Groups
@@ -657,7 +662,7 @@ export default React.createClass({
columns: column.columns.map(decorateAndAddToAll)
}
} else {
decorateAndAddToAll(column)
return decorateAndAddToAll(column)
}
})
@@ -715,7 +720,7 @@ export default React.createClass({
const columnPercentage = 100 / allVisibleColumns.length
// Access the data
let accessedData = data.map((d, i) => {
let resolvedData = data.map((d, i) => {
const row = {
__original: d,
__index: i
@@ -768,18 +773,13 @@ export default React.createClass({
})
return groupedRows
}
accessedData = groupRecursively(accessedData, pivotBy)
resolvedData = groupRecursively(resolvedData, pivotBy)
}
const resolvedSorting = sorting.length ? sorting : this.getInitSorting(allDecoratedColumns)
// Resolve the data from either manual data or sorted data
const resolvedData = manual ? accessedData : this.sortData(accessedData, resolvedSorting)
return {
resolvedData,
columnPercentage,
pivotColumn,
resolvedData,
allVisibleColumns,
headerGroups,
standardColumns,
@@ -788,6 +788,22 @@ export default React.createClass({
}
},
getSortedData (nextProps, nextState) {
const {
manual,
sorting,
allDecoratedColumns,
resolvedData
} = this.getResolvedState(nextProps, nextState)
const resolvedSorting = sorting.length ? sorting : this.getInitSorting(allDecoratedColumns)
// Resolve the data from either manual data or sorted data
return {
sortedData: manual ? resolvedData : this.sortData(resolvedData, resolvedSorting)
}
},
fireOnChange () {
this.props.onChange(this.getResolvedState(), this)
},
@@ -3,10 +3,10 @@ import _ from 'lodash'
import namor from 'namor'
import CodeHighlight from './components/codeHighlight'
import ReactTable from '../lib/index'
import ReactTable from '../src/index'
export default () => {
const data = _.map(_.range(1000000), d => {
const data = _.map(_.range(100000), d => {
return {
firstName: namor.generate({ words: 1, numLen: 0 }),
lastName: namor.generate({ words: 1, numLen: 0 }),
+1 -1
View File
@@ -3,7 +3,7 @@ import _ from 'lodash'
import namor from 'namor'
import CodeHighlight from './components/codeHighlight'
import ReactTable from '../lib/index'
import ReactTable from '../src/index'
export default () => {
const data = _.map(_.range(10000), d => {
+1 -1
View File
@@ -3,7 +3,7 @@ import _ from 'lodash'
import namor from 'namor'
import CodeHighlight from './components/codeHighlight'
import ReactTable from '../lib/index'
import ReactTable from '../src/index'
export default () => {
const data = _.map(_.range(1000), d => {
+28 -18
View File
@@ -3,7 +3,7 @@ import _ from 'lodash'
import namor from 'namor'
import CodeHighlight from './components/codeHighlight'
import ReactTable from '../lib/index'
import ReactTable from '../src/index'
const rawData = _.map(_.range(3424), d => {
return {
@@ -69,21 +69,15 @@ const ServerSide = React.createClass({
<div className='table-wrap'>
<ReactTable
columns={[{
header: 'Name',
columns: [{
header: 'First Name',
accessor: 'firstName'
}, {
header: 'Last Name',
id: 'lastName',
accessor: d => d.lastName
}]
header: 'First Name',
accessor: 'firstName'
}, {
header: 'Info',
columns: [{
header: 'Age',
accessor: 'age'
}]
header: 'Last Name',
id: 'lastName',
accessor: d => d.lastName
}, {
header: 'Age',
accessor: 'age'
}]}
manual // Forces table not to paginate or sort automatically, so we can handle it server-side
defaultPageSize={10}
@@ -161,14 +155,30 @@ export default React.createClass({
return (
<ReactTable
columns={columns}
manual // This forces table not to paginate or sort automatically, so we can handle things server-side
columns={[{
header: 'Name',
columns: [{
header: 'First Name',
accessor: 'firstName'
}, {
header: 'Last Name',
id: 'lastName',
accessor: d => d.lastName
}]
}, {
header: 'Info',
columns: [{
header: 'Age',
accessor: 'age'
}]
}]}
manual // Forces table not to paginate or sort automatically, so we can handle it server-side
defaultPageSize={10}
data={this.state.data} // Set the rows to be displayed
pages={this.state.pages} // Display the total number of pages
loading={this.state.loading} // Display the loading overlay when we need it
onChange={this.fetchData} // Request new data when things change
/>
)
}
})
`
+1 -1
View File
@@ -3,7 +3,7 @@ import _ from 'lodash'
import namor from 'namor'
import CodeHighlight from './components/codeHighlight'
import ReactTable from '../lib/index'
import ReactTable from '../src/index'
export default () => {
const data = _.map(_.range(5553), d => {
+1 -1
View File
@@ -3,7 +3,7 @@ import _ from 'lodash'
import namor from 'namor'
import CodeHighlight from './components/codeHighlight'
import ReactTable from '../lib/index'
import ReactTable from '../src/index'
export default () => {
const data = _.map(_.range(5553), d => {
-14
View File
@@ -1,14 +0,0 @@
import React from 'react'
import banner from '../../media/Banner.png'
export default () => (
<div>
<div style={{textAlign: 'center'}}>
<a href='https://github.com/tannerlinsley/react-table' target='_blank'>
<img src={banner} className='logo' />
</a>
<br />
<br />
</div>
</div>
)
-8
View File
@@ -1,8 +0,0 @@
{
"name": "react-table",
"root": "storybook-static",
"routes": [{
"src": "/**",
"dest": "index.html"
}]
}