Created
January 11, 2015 22:00
-
-
Save ryanlanciaux/d7fa52911b3b6f87fa03 to your computer and use it in GitHub Desktop.
Griddle with Simulated External Data
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<div id="griddle-external-simulated"></div> | |
<script type="text/jsx"> | |
var externalData = fakeData.slice(0, 53); | |
var SimulatedExternalComponent = React.createClass({ | |
getInitialState: function(){ | |
var initial = { "results": [], | |
"currentPage": 0, | |
"maxPages": 0, | |
"externalResultsPerPage": 5, | |
"externalSortColumn":null, | |
"externalSortAscending":true, | |
"pretendServerData": externalData | |
}; | |
return initial; | |
}, | |
componentWillMount: function(){ | |
this.setState({ | |
maxPages: Math.round(this.state.pretendServerData.length/this.state.externalResultsPerPage), | |
"results": this.state.pretendServerData.slice(0,this.state.externalResultsPerPage) | |
}) | |
}, | |
setPage: function(index){ | |
//This should interact with the data source to get the page at the given index | |
var number = index === 0 ? 0 : index * this.state.externalResultsPerPage; | |
this.setState( | |
{ | |
"results": this.state.pretendServerData.slice(number, number+5>this.state.pretendServerData.length ? this.state.pretendServerData.length : number+this.state.externalResultsPerPage), | |
"currentPage": index | |
}); | |
}, | |
sortData: function(sort, sortAscending, data){ | |
//sorting should generally happen wherever the data is coming from | |
shows as and all that | |
sortedData = _.sortBy(data, function(item){ | |
return item[sort]; | |
}); | |
if(sortAscending === false){ | |
sortedData.reverse(); | |
} | |
return { | |
"currentPage": 0, | |
"externalSortColumn": sort, | |
"externalSortAscending": sortAscending, | |
"pretendServerData": sortedData, | |
"results": sortedData.slice(0,this.state.externalResultsPerPage) | |
}; | |
}, | |
changeSort: function(sort, sortAscending){ | |
//this should change the sort for the given column | |
this.setState(this.sortData(sort, sortAscending, this.state.pretendServerData)); | |
}, | |
setFilter: function(filter){ | |
//filtering should generally occur on the server (or wherever) | |
//this is a lot of code for what should normally just be a method that is used to pass data back and forth | |
var sortedData = this.sortData(this.state.externalSortColumn, this.state.externalSortAscending, externalData); | |
if(filter === ""){ | |
this.setState(_.extend(sortedData, {maxPages: Math.round(sortedData.pretendServerData.length > this.state.externalResultsPerPage ? sortedData.pretendServerData.length/this.state.externalResultsPerPage : 1)})); | |
return; | |
} | |
var filteredData = _.filter(sortedData.pretendServerData, | |
function(item) { | |
var arr = _.values(item); | |
for(var i = 0; i < arr.length; i++){ | |
if ((arr[i]||"").toString().toLowerCase().indexOf(filter.toLowerCase()) >= 0){ | |
return true; | |
} | |
} | |
return false; | |
}); | |
this.setState({ | |
pretendServerData: filteredData, | |
maxPages: Math.round(filteredData.length > this.state.externalResultsPerPage ? filteredData.length/this.state.externalResultsPerPage : 1), | |
"results": filteredData.slice(0,this.state.externalResultsPerPage) | |
}); | |
}, | |
setPageSize: function(size){ | |
this.setState({ | |
currentPage: 0, | |
externalResultsPerPage: size, | |
maxPages: Math.round(this.state.pretendServerData.length > size ? this.state.pretendServerData.length/size : 1), | |
results: this.state.pretendServerData.slice(0,size) | |
}); | |
}, | |
render: function(){ | |
return <Griddle useExternal={true} externalSetPage={this.setPage} | |
externalChangeSort={this.changeSort} externalSetFilter={this.setFilter} | |
externalSetPageSize={this.setPageSize} externalMaxPage={this.state.maxPages} | |
externalCurrentPage={this.state.currentPage} results={this.state.results} tableClassName="table" resultsPerPage={this.state.externalResultsPerPage} | |
externalSortColumn={this.state.externalSortColumn} externalSortAscending={this.state.externalSortAscending} showFilter={true} showSettings={true} /> | |
} | |
}); | |
React.render(<SimulatedExternalComponent />, document.getElementById("griddle-external-simulated")); | |
</script> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks for the code snippet helped out a lot to understand how to use griddle