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-js/faker/locale/fr';
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
)
}
);
}
}