import React from 'react'; import BootstrapTable from 'react-bootstrap-table-next'; import paginationFactory from 'react-bootstrap-table2-paginator'; import filterFactory, { Comparator, dateFilter } from 'react-bootstrap-table2-filter' import ToolkitProvider from 'react-bootstrap-table2-toolkit'; import _ from 'lodash'; import faker from 'faker/locale/en_US'; import moment from 'moment'; import { Badge, Button, CustomInput, StarRating, ButtonGroup } from './../../../../components'; import { CustomExportCSV } from './CustomExportButton'; import { CustomSearch } from './CustomSearch'; import { CustomPaginationPanel } from './CustomPaginationPanel'; import { CustomSizePerPageButton } from './CustomSizePerPageButton'; import { CustomPaginationTotal } from './CustomPaginationTotal'; import { randomArray } from './../../../../utilities'; import { buildCustomTextFilter, buildCustomSelectFilter, buildCustomNumberFilter } from './../filters'; const INITIAL_PRODUCTS_COUNT = 500; const ProductQuality = { Good: 'product-quality__good', Bad: 'product-quality__bad', Unknown: 'product-quality__unknown' }; const sortCaret = (order) => { if (!order) return ; if (order) return } const generateRow = (index) => ({ id: index, name: faker.commerce.productName(), quality: randomArray([ ProductQuality.Bad, ProductQuality.Good, ProductQuality.Unknown ]), price: (1000 + Math.random() * 1000).toFixed(2), satisfaction: Math.round(Math.random() * 6), inStockDate: faker.date.past() }); export class AdvancedTableA extends React.Component { constructor() { super(); this.state = { products: _.times(INITIAL_PRODUCTS_COUNT, generateRow), selected: [] }; this.headerCheckboxRef = React.createRef(); } handleSelect(row, isSelected) { if (isSelected) { this.setState({ selected: [...this.state.selected, row.id] }) } else { this.setState({ selected: this.state.selected.filter(itemId => itemId !== row.id) }) } } handleSelectAll(isSelected, rows) { if (isSelected) { this.setState({ selected: _.map(rows, 'id') }) } else { this.setState({ selected: [] }); } } handleAddRow() { const currentSize = this.state.products.length; this.setState({ products: [ generateRow(currentSize + 1), ...this.state.products, ] }); } handleDeleteRow() { this.setState({ products: _.filter(this.state.products, product => !_.includes(this.state.selected, product.id)) }) } handleResetFilters() { this.nameFilter(''); this.qualityFilter(''); this.priceFilter(''); this.satisfactionFilter(''); } createColumnDefinitions() { return [{ dataField: 'id', text: 'Product ID', headerFormatter: column => ( { column.text } Reset Filters ) }, { dataField: 'name', text: 'Product Name', sort: true, sortCaret, formatter: (cell) => ( { cell } ), ...buildCustomTextFilter({ placeholder: 'Enter product name...', getFilter: filter => { this.nameFilter = filter; } }) }, { dataField: 'quality', text: 'Product Quality', formatter: (cell) => { let pqProps; switch (cell) { case ProductQuality.Good: pqProps = { color: 'success', text: 'Good' } break; case ProductQuality.Bad: pqProps = { color: 'danger', text: 'Bad' } break; case ProductQuality.Unknown: default: pqProps = { color: 'secondary', text: 'Unknown' } } return ( { pqProps.text } ) }, sort: true, sortCaret, ...buildCustomSelectFilter({ placeholder: 'Select Quality', options: [ { value: ProductQuality.Good, label: 'Good' }, { value: ProductQuality.Bad, label: 'Bad' }, { value: ProductQuality.Unknown, label: 'Unknown' } ], getFilter: filter => { this.qualityFilter = filter; } }) }, { dataField: 'price', text: 'Product Price', sort: true, sortCaret, ...buildCustomNumberFilter({ comparators: [Comparator.EQ, Comparator.GT, Comparator.LT], getFilter: filter => { this.priceFilter = filter; } }) }, { dataField: 'satisfaction', text: 'Buyer Satisfaction', sort: true, sortCaret, formatter: (cell) => , ...buildCustomSelectFilter({ placeholder: 'Select Satisfaction', options: _.times(6, (i) => ({ value: i + 1, label: i + 1 })), getFilter: filter => { this.satisfactionFilter = filter; } }) }, { dataField: 'inStockDate', text: 'In Stock From', formatter: (cell) => moment(cell).format('DD/MM/YYYY'), filter: dateFilter({ className: 'd-flex align-items-center', comparatorClassName: 'd-none', dateClassName: 'form-control form-control-sm', comparator: Comparator.GT, getFilter: filter => { this.stockDateFilter = filter; } }), sort: true, sortCaret }]; } render() { const columnDefs = this.createColumnDefinitions(); const paginationDef = paginationFactory({ paginationSize: 5, showTotal: true, pageListRenderer: (props) => ( ), sizePerPageRenderer: (props) => ( ), paginationTotalRenderer: (from, to, size) => ( ) }); const selectRowConfig = { mode: 'checkbox', selected: this.state.selected, onSelect: this.handleSelect.bind(this), onSelectAll: this.handleSelectAll.bind(this), selectionRenderer: ({ mode, checked, disabled }) => ( ), selectionHeaderRenderer: ({ mode, checked, indeterminate }) => ( el && (el.indeterminate = indeterminate)} /> ) }; return ( { props => (
AdvancedTable A
Export
) }
); } }