@atlaskit/dynamic-table
Version:
A dynamic table displays rows of data with built-in pagination, sorting, and re-ordering functionality.
171 lines • 4.33 kB
JavaScript
import _defineProperty from "@babel/runtime/helpers/defineProperty";
import React from 'react';
import noop from '@atlaskit/ds-lib/noop';
import { reorderRows } from '../internal/reorder-rows';
import DynamicTableStateless from './stateless';
/**
* __Dynamic Table__
*
* A table displays rows of data with built-in pagination, sorting, and re-ordering functionality.
*
* - [Examples](https://atlaskit.atlassian.com/packages/design-system/dynamic-table)
* - [Code](https://bitbucket.org/atlassian/atlassian-frontend/packages/design-system/dynamic-table)
*
* @example
* ```jsx
* import DynamicTable from '@atlaskit/dynamic-table';
*
* export default function TableUncontrolled() {
* return (
* <DynamicTable
* head={head}
* rows={rows}
* rowsPerPage={10}
* defaultPage={1}
* loadingSpinnerSize="large"
* isLoading={false}
* />
* );
* }
* ```
*/
// eslint-disable-next-line @repo/internal/react/no-class-components
export default class DynamicTable extends React.Component {
constructor(...args) {
super(...args);
_defineProperty(this, "state", {
page: this.props.defaultPage,
sortKey: this.props.defaultSortKey,
sortOrder: this.props.defaultSortOrder,
rows: this.props.rows
});
_defineProperty(this, "onSetPageHandler", (page, analyticsEvent) => {
const {
onSetPage
} = this.props;
if (onSetPage) {
onSetPage(page, analyticsEvent);
this.setState({
page
});
}
});
_defineProperty(this, "onSortHandler", ({
key,
item,
sortOrder
}, analyticsEvent) => {
const {
onSort
} = this.props;
if (onSort) {
onSort({
key,
item,
sortOrder
}, analyticsEvent);
this.setState({
sortKey: key,
sortOrder
});
}
});
_defineProperty(this, "onRankEndIfExistsHandler", params => {
if (this.props.onRankEnd) {
this.props.onRankEnd(params);
}
});
_defineProperty(this, "onRankEndHandler", params => {
const {
destination
} = params;
const {
rows,
page
} = this.state;
const {
rowsPerPage
} = this.props;
if (!destination || !rows) {
this.onRankEndIfExistsHandler(params);
return;
}
const reordered = reorderRows(params, rows, page, rowsPerPage);
this.setState({
rows: reordered
});
this.onRankEndIfExistsHandler(params);
});
}
UNSAFE_componentWillReceiveProps(newProps) {
const sortKey = newProps.sortKey || this.state.sortKey;
const sortOrder = newProps.sortOrder || this.state.sortOrder;
const page = newProps.page || this.state.page;
this.setState({
page,
sortKey,
sortOrder,
rows: newProps.rows
});
}
render() {
const {
page,
sortKey,
sortOrder,
rows
} = this.state;
const {
caption,
emptyView,
head,
highlightedRowIndex,
loadingSpinnerSize,
isLoading,
loadingLabel,
isFixedSize,
isRankable,
isRankingDisabled,
rowsPerPage,
paginationi18n,
onRankStart,
onPageRowsUpdate,
testId,
label
} = this.props;
return /*#__PURE__*/React.createElement(DynamicTableStateless, {
paginationi18n: paginationi18n,
caption: caption,
emptyView: emptyView,
head: head,
highlightedRowIndex: highlightedRowIndex,
loadingSpinnerSize: loadingSpinnerSize,
isLoading: isLoading,
loadingLabel: loadingLabel,
isFixedSize: isFixedSize,
onSetPage: this.onSetPageHandler,
onSort: this.onSortHandler,
page: page,
rows: rows,
rowsPerPage: rowsPerPage,
sortKey: sortKey,
sortOrder: sortOrder,
isRankable: isRankable,
isRankingDisabled: isRankingDisabled,
onRankEnd: this.onRankEndHandler,
onRankStart: onRankStart,
onPageRowsUpdate: onPageRowsUpdate,
testId: testId,
label: label
});
}
}
_defineProperty(DynamicTable, "defaultProps", {
defaultPage: 1,
isLoading: false,
isFixedSize: false,
isRankable: false,
onSetPage: noop,
onSort: noop,
rowsPerPage: Infinity
});