@appbuckets/react-ui
Version:
Just Another React UI Framework
332 lines (325 loc) • 10.4 kB
JavaScript
'use strict';
var tslib = require('tslib');
var React = require('react');
var clsx = require('clsx');
var reactUiCore = require('@appbuckets/react-ui-core');
var useElementSize = require('../hooks/useElementSize.js');
require('../BucketTheme/BucketTheme.js');
var BucketContext = require('../BucketTheme/BucketContext.js');
var RxTable_context = require('./RxTable.context.js');
var RxTable_factory = require('./RxTable.factory.js');
var Table = require('../Table/Table.js');
var BodyRow = require('./components/BodyRow.js');
var FiltersRow = require('./components/FiltersRow.js');
var FooterRow = require('./components/FooterRow.js');
var HeaderRow = require('./components/HeaderRow.js');
var StateDependentBodyRow = require('./components/StateDependentBodyRow.js');
var RxTableBodyCell = require('./defaults/RxTableBodyCell.js');
var RxTableBodyRow = require('./defaults/RxTableBodyRow.js');
var RxTableEmptyContent = require('./defaults/RxTableEmptyContent.js');
var RxTableFooterCell = require('./defaults/RxTableFooterCell.js');
var RxTableError = require('./defaults/RxTableError.js');
var RxTableHeaderCell = require('./defaults/RxTableHeaderCell.js');
var RxTableLoader = require('./defaults/RxTableLoader.js');
function _interopDefaultLegacy(e) {
return e && typeof e === 'object' && 'default' in e ? e : { default: e };
}
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(
n,
k,
d.get
? d
: {
enumerable: true,
get: function () {
return e[k];
},
}
);
}
});
}
n['default'] = e;
return Object.freeze(n);
}
var React__namespace = /*#__PURE__*/ _interopNamespace(React);
var clsx__default = /*#__PURE__*/ _interopDefaultLegacy(clsx);
/* --------
* Component Render
* -------- */
var RxTable = function (receivedProps) {
var props = BucketContext.useWithDefaultProps('rxTable', receivedProps);
props.as;
var userDefinedClasses = props.classes,
className = props.className,
columns = props.columns,
userDefinedComponents = props.Components,
compressed = props.compressed,
data = props.data,
defaultData = props.defaultData,
userDefinedDefaultReverseSorting = props.defaultReverseSorting,
userDefinedSelectedData = props.defaultSelectedData,
userDefinedDefaultSort = props.defaultSort,
disableHeader = props.disableHeader,
filterLogic = props.filterLogic,
userDefinedGetRowKey = props.getRowKey,
initiallyLoading = props.initiallyLoading,
loaderProps = props.loaderProps,
maximumWidth = props.maximumWidth,
minimumWidth = props.minimumWidth,
noFilteredDataEmptyContentProps = props.noFilteredDataEmptyContentProps,
noDataEmptyContentProps = props.noDataEmptyContentProps,
onRowClick = props.onRowClick,
onSortChange = props.onSortChange,
onSelectedDataChange = props.onSelectedDataChange,
reloadDependency = props.reloadDependency,
reloadSilently = props.reloadSilently,
userDefinedReverseSorting = props.reverseSorting,
selectable = props.selectable,
selectColumnProps = props.selectColumnProps,
userDefinedSort = props.sort,
subtractToWidth = props.subtractToWidth,
userDefinedStyles = props.styles,
userDefinedWidth = props.width,
rest = tslib.__rest(props, [
'as',
'classes',
'className',
'columns',
'Components',
'compressed',
'data',
'defaultData',
'defaultReverseSorting',
'defaultSelectedData',
'defaultSort',
'disableHeader',
'filterLogic',
'getRowKey',
'initiallyLoading',
'loaderProps',
'maximumWidth',
'minimumWidth',
'noFilteredDataEmptyContentProps',
'noDataEmptyContentProps',
'onRowClick',
'onSortChange',
'onSelectedDataChange',
'reloadDependency',
'reloadSilently',
'reverseSorting',
'selectable',
'selectColumnProps',
'sort',
'subtractToWidth',
'styles',
'width',
]);
// ----
// Get the Right Element Type
// ----
var ElementType = reactUiCore.useElementType(RxTable, receivedProps, props);
// ----
// Initialize the Width Detector
// ----
var _a = tslib.__read(
useElementSize.useElementSize({
useDetectorWidthOnly: true,
useDetectorHeightOnly: true,
fixedWidth: userDefinedWidth,
maximumWidth: maximumWidth,
minimumWidth: minimumWidth,
subtractToWidth: subtractToWidth,
}),
2
),
widthDetector = _a[0],
width = _a[1].width;
// ----
// Load RxTableProps
// ----
var rxTableProps = RxTable_factory.useRxTableFactory({
classes: userDefinedClasses,
columns: columns,
data: data,
defaultData: defaultData,
defaultLoading: initiallyLoading,
defaultReverseSorting: userDefinedDefaultReverseSorting,
defaultSelectedData: userDefinedSelectedData,
defaultSort: userDefinedDefaultSort,
filterLogic: filterLogic,
getRowKey: userDefinedGetRowKey,
onRowClick: onRowClick,
onSelectedDataChange: onSelectedDataChange,
onSortChange: onSortChange,
reloadDependency: reloadDependency,
reloadSilently: reloadSilently,
reverseSorting: userDefinedReverseSorting,
selectable: selectable,
selectColumnProps: selectColumnProps,
sort: userDefinedSort,
styles: userDefinedStyles,
width: width,
});
// ----
// Build Table ClassList
// ----
var classes = clsx__default['default'](
rxTableProps.layout.hasFilterRow && 'filterable',
'rx-table',
compressed && 'compressed',
className
);
// ----
// Define RxTable Components
// ----
var Components = tslib.__assign(
{
Body: Table.Body,
BodyCell: RxTableBodyCell,
BodyRow: RxTableBodyRow,
BodyWrapper: React__namespace.Fragment,
Error: RxTableError,
ErrorRow: Table.Row,
ErrorCell: Table.Cell,
Footer: Table.Footer,
FooterCell: RxTableFooterCell,
FooterRow: Table.Row,
FooterWrapper: React__namespace.Fragment,
Header: Table.Header,
HeaderCell: RxTableHeaderCell,
HeaderRow: Table.Row,
HeaderWrapper: React__namespace.Fragment,
Loader: RxTableLoader,
LoaderRow: Table.Row,
LoaderCell: Table.Cell,
NoContent: RxTableEmptyContent,
NoContentCell: Table.Cell,
NoContentRow: Table.Row,
},
userDefinedComponents
);
// ----
// Context Building
// ----
var rxTableContext = tslib.__assign(tslib.__assign({}, rxTableProps), {
Components: Components,
loaderProps: loaderProps,
noFilteredDataEmptyContentProps: noFilteredDataEmptyContentProps,
noDataEmptyContentProps: noDataEmptyContentProps,
});
// ----
// Fragments could not have properties extra from key
// ----
var headerWrapperProps =
Components.HeaderWrapper !== React__namespace.Fragment
? {
className: rxTableProps.classes.HeaderWrapper,
style: rxTableProps.styles.HeaderWrapper,
}
: {};
var bodyWrapperProps =
Components.BodyWrapper !== React__namespace.Fragment
? {
className: rxTableProps.classes.BodyWrapper,
style: rxTableProps.styles.BodyWrapper,
}
: {};
var footerWrapperProps =
Components.FooterWrapper !== React__namespace.Fragment
? {
className: rxTableProps.classes.FooterWrapper,
style: rxTableProps.styles.FooterWrapper,
}
: {};
// ----
// Build the Component that will render Body Rows
// ----
var BodyRows = React__namespace.useCallback(
function () {
return React__namespace.createElement(
React__namespace.Fragment,
null,
rxTableProps.tableData.map(function (row, index) {
return React__namespace.createElement(BodyRow, {
key: rxTableProps.selection.getRowKey(
row,
index,
rxTableProps.tableData
),
index: index,
});
})
);
},
[rxTableProps.selection, rxTableProps.tableData]
);
// ----
// Component Render
// ----
return React__namespace.createElement(
RxTable_context.RxTableProvider,
{ value: rxTableContext },
widthDetector,
React__namespace.createElement(
ElementType,
tslib.__assign({ className: classes }, rest),
(rxTableProps.layout.hasHeaderRow || rxTableProps.layout.hasFilterRow) &&
React__namespace.createElement(
Components.HeaderWrapper,
tslib.__assign({}, headerWrapperProps),
React__namespace.createElement(
Components.Header,
{
style: rxTableProps.styles.Header,
className: rxTableProps.classes.Header,
},
rxTableProps.layout.hasHeaderRow &&
!disableHeader &&
React__namespace.createElement(HeaderRow, null),
rxTableProps.layout.hasFilterRow &&
React__namespace.createElement(FiltersRow, null)
)
),
React__namespace.createElement(
Components.BodyWrapper,
tslib.__assign({}, bodyWrapperProps),
React__namespace.createElement(
Components.Body,
{
style: rxTableProps.styles.Body,
className: rxTableProps.classes.Body,
},
React__namespace.createElement(StateDependentBodyRow, {
Content: BodyRows,
})
)
),
rxTableProps.layout.hasFooterRow &&
React__namespace.createElement(
Components.FooterWrapper,
tslib.__assign({}, footerWrapperProps),
React__namespace.createElement(
Components.Footer,
{
style: rxTableProps.styles.Footer,
className: rxTableProps.classes.Footer,
},
React__namespace.createElement(FooterRow, null)
)
)
)
);
};
RxTable.displayName = 'RxTable';
RxTable.defaultProps = {
as: Table,
};
module.exports = RxTable;