import { registerComponent, Components } from 'meteor/vulcan:lib';
import React, { PureComponent } from 'react';
import PropTypes from 'prop-types';
import withCurrentUser from '../containers/withCurrentUser.js';
import withList from '../containers/withList.js';
import { FormattedMessage, intlShape } from 'meteor/vulcan:i18n';
import Button from 'react-bootstrap/lib/Button';
import { getFieldValue } from './Card.jsx';
/*
Datatable Component
*/
// see: http://stackoverflow.com/questions/1909441/jquery-keyup-delay
const delay = (function(){
var timer = 0;
return function(callback, ms){
clearTimeout (timer);
timer = setTimeout(callback, ms);
};
})();
class Datatable extends PureComponent {
constructor() {
super();
this.updateQuery = this.updateQuery.bind(this);
this.state = {
value: '',
query: ''
}
}
updateQuery(e) {
e.persist()
e.preventDefault();
this.setState({
value: e.target.value
});
delay(() => {
this.setState({
query: e.target.value
});
}, 700 );
}
render() {
const options = {
collection: this.props.collection,
...this.props.options
}
const DatatableWithList = withList(options)(Components.DatatableContents);
return (
{this.props.showSearch ? : null}
)
}
}
Datatable.propTypes = {
collection: PropTypes.object,
columns: PropTypes.array,
options: PropTypes.object,
showEdit: PropTypes.bool,
showSearch: PropTypes.bool,
}
Datatable.defaultProps = {
showEdit: true,
showSearch: true,
}
registerComponent('Datatable', Datatable, withCurrentUser);
/*
DatatableHeader Component
*/
const DatatableHeader = ({ collection, column }, { intl }) => {
const schema = collection.simpleSchema()._schema;
const columnName = typeof column === 'string' ? column : column.name;
/*
use either:
1. the column name translation
2. the column name label in the schema (if the column name matches a schema field)
3. the raw column name.
*/
const formattedLabel = intl.formatMessage({ id: `${collection._name}.${columnName}`, defaultMessage: schema[columnName] ? schema[columnName].label : columnName });
return {formattedLabel} | ;
}
DatatableHeader.contextTypes = {
intl: intlShape
};
registerComponent('DatatableHeader', DatatableHeader);
/*
DatatableContents Component
*/
const DatatableContents = (props) => {
const {collection, columns, results, loading, loadMore, count, totalCount, networkStatus, showEdit, currentUser, emptyState} = props;
if (loading) {
return ;
} else if (!results.length) {
return emptyState || null;
}
const isLoadingMore = networkStatus === 2;
const hasMore = totalCount > results.length;
return (
{_.sortBy(columns, column => column.order).map((column, index) => )}
{showEdit ? | : null}
{results.map((document, index) => )}
{hasMore ?
isLoadingMore ?
:
: null
}
)
}
registerComponent('DatatableContents', DatatableContents);
/*
DatatableRow Component
*/
const DatatableRow = ({ collection, columns, document, showEdit, currentUser }, { intl }) => {
return (
{_.sortBy(columns, column => column.order).map((column, index) => )}
{showEdit ?
}
>
|
: null}
)
}
registerComponent('DatatableRow', DatatableRow);
DatatableRow.contextTypes = {
intl: intlShape
};
/*
DatatableEditForm Component
*/
const DatatableEditForm = ({ collection, document, closeModal }) =>
{
closeModal();
}}
/>
registerComponent('DatatableEditForm', DatatableEditForm);
/*
DatatableCell Component
*/
const DatatableCell = ({ column, document, currentUser }) => {
const Component = column.component || Components[column.componentName] || Components.DatatableDefaultCell;
const columnName = column.name || column;
return (
|
)
}
registerComponent('DatatableCell', DatatableCell);
/*
DatatableDefaultCell Component
*/
const DatatableDefaultCell = ({ column, document }) =>
{typeof column === 'string' ? getFieldValue(document[column]) : getFieldValue(document[column.name])}
registerComponent('DatatableDefaultCell', DatatableDefaultCell);