bgerm / react-table-sorter-demo Goto Github PK
View Code? Open in Web Editor NEWA React.js Table Sorter Component
License: MIT License
A React.js Table Sorter Component
License: MIT License
@bgerm I got this table to work on my data but it seems to have trouble with php json_encode JSON output. I tried using json file( copy pasted from same url output that uses json_encode) and it works fine.
It is also receiving data fine and I can confirm this from the console.
I am seeing columns as this:
Here is my console output
/** @jsx React.DOM */
// TableSorter Config
var CONFIG = {
sort: { column: "col2", order: "desc" },
columns: {
MASTER_MAIN_ALL_ID: { name: "Col1", filterText: "", defaultSortOrder: "desc"},
Change_Date_REVIEW: { name: "Col2", filterText: "", defaultSortOrder: "desc"},
Location: { name: "Col3", filterText: "", defaultSortOrder: "desc"}
}
};
// Inequality function map for the filtering
var operators = {
"<": function(x, y) { return x < y; },
"<=": function(x, y) { return x <= y; },
">": function(x, y) { return x > y; },
">=": function(x, y) { return x >= y; },
"==": function(x, y) { return x == y; }
};
// TableSorter React Component
var TableSorter = React.createClass({
getInitialState: function() {
return {
items: this.props.initialItems || [],
sort: this.props.config.sort || { column: "", order: "" },
columns: this.props.config.columns
};
},
componentWillReceiveProps: function(nextProps) {
// Load new data when the dataSource property changes.
if (nextProps.dataSource != this.props.dataSource) {
this.loadData(nextProps.dataSource);
}
},
componentWillMount: function() {
this.loadData(this.props.dataSource);
},
loadData: function(dataSource) {
if (!dataSource) return;
$.ajax({type:'get',url:dataSource}).done(function(data) {
console.log("Received data");
this.setState({items: data});
}.bind(this)).fail(function(error, a, b) {
console.log("Error loading JSON");
});
},
handleFilterTextChange: function(column) {
return function(newValue) {
var obj = this.state.columns;
obj[column].filterText = newValue;
// Since we have already mutated the state, just call forceUpdate().
// Ideally we'd copy and setState or use an immutable data structure.
this.forceUpdate();
}.bind(this);
},
columnNames: function() {
return Object.keys(this.state.columns);
},
sortColumn: function(column) {
return function(event) {
var newSortOrder = (this.state.sort.order == "asc") ? "desc" : "asc";
if (this.state.sort.column != column) {
newSortOrder = this.state.columns[column].defaultSortOrder;
}
this.setState({sort: { column: column, order: newSortOrder }});
}.bind(this);
},
sortClass: function(column) {
var ascOrDesc = (this.state.sort.order == "asc") ? "headerSortAsc" : "headerSortDesc";
return (this.state.sort.column == column) ? ascOrDesc : "";
},
render: function() {
var rows = [];
var columnNames = this.columnNames();
var filters = {};
var operandRegex = /^((?:(?:[<>]=?)|==))\s?([-]?\d+(?:\.\d+)?)$/;
columnNames.forEach(function(column) {
var filterText = this.state.columns[column].filterText;
filters[column] = null;
if (filterText.length > 0) {
operandMatch = operandRegex.exec(filterText);
if (operandMatch && operandMatch.length == 3) {
//filters[column] = Function.apply(null, ["x", "return x " + operandMatch[1] + " " + operandMatch[2]]);
filters[column] = function(match) { return function(x) { return operators[match[1]](x, match[2]); }; }(operandMatch);
} else {
filters[column] = function(x) {
return (x.toString().toLowerCase().indexOf(filterText.toLowerCase()) > -1);
};
}
}
}, this);
var filteredItems = _.filter(this.state.items, function(item) {
return _.every(columnNames, function(c) {
return (!filters[c] || filters[c](item[c]));
}, this);
}, this);
var sortedItems = _.sortBy(filteredItems, this.state.sort.column);
if (this.state.sort.order === "desc") sortedItems.reverse();
var headerExtra = function() {
return columnNames.map(function(c) {
return <th className="header-extra">{this.state.columns[c].name}</th>;
}, this);
}.bind(this);
var cell = function(x) {
return columnNames.map(function(c) {
return <td>{x[c]}</td>;
}, this);
}.bind(this);
sortedItems.forEach(function(item, idx) {
var headerRepeat = parseInt(this.props.headerRepeat, 10);
if ((this.props.headerRepeat > 0) &&
(idx > 0) &&
(idx % this.props.headerRepeat === 0)) {
rows.push (
<tr>
{ headerExtra() }
</tr>
)
}
rows.push(
<tr key={item.id}>
{ cell(item) }
</tr>
);
}.bind(this));
var filterLink = function(column) {
return {
value: this.state.columns[column].filterText,
requestChange: this.handleFilterTextChange(column)
};
}.bind(this);
var header = columnNames.map(function(c) {
return <th onClick={this.sortColumn(c)} className={"header " + this.sortClass(c)}>{this.state.columns[c].name}</th>;
}, this);
var filterInputs = columnNames.map(function(c) {
return <td><input type="text" valueLink={filterLink(c)} /></td>;
}, this);
return (
<table cellSpacing="0" className="tablesorter">
<thead>
<tr>
{ header }
</tr>
<tr>
{ filterInputs }
</tr>
</thead>
<tbody>
{ rows }
</tbody>
</table>
);
}
});
/* Here we create a two selects to control the remote data source of the
* TableSorter component. The purpose of this is to show how to control a
* component with another component.
*/
var DataSourceSelectors = React.createClass({
handleSourceChange: function(event) {
this.props.onSourceChange({
source: event.target.value,
limit: this.props.source.limit
});
},
handleLimitChange: function(event) {
this.props.onSourceChange({
source: this.props.source.source,
limit: event.target.value
});
},
render: function() {
return (
<div id="tools">
<strong>Source:</strong>
<select onChange={this.handleSourceChange} value={this.props.source.source}>
<option value="source1">Source 1</option>
<option value="source2">Source 2</option>
</select>
<strong>Limit:</strong>
<select onChange={this.handleLimitChange} value={this.props.source.limit}>
<option value="10">10</option>
<option value="200">200</option>
</select>
</div>
);
}
});
function urlForDataSource(source) {
return "/" + source.source + "_" + source.limit + ".json";
}
var App = React.createClass({
getInitialState: function() {
return {source: {limit: "200", source: "source1"}};
},
handleSourceChange: function(source) {
this.setState({source: source});
},
render: function() {
return (
<div>
<DataSourceSelectors onSourceChange={this.handleSourceChange} source={this.state.source} />
<TableSorter dataSource={urlForDataSource(this.state.source)} config={CONFIG} headerRepeat="5" />
</div>
);
}
});
//React.renderComponent(<App />, document.getElementById("app"));
React.renderComponent(<TableSorter dataSource="/master/test/source1_200.php" config={CONFIG} headerRepeat="5" />, document.getElementById("app"));
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.