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 (
) } } Datatable.propTypes = { collection: PropTypes.object, columns: PropTypes.array, options: PropTypes.object, showEdit: PropTypes.bool, } 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} = props; if (loading) { return ; } 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 }, { 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 }) => { 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);