@atlaskit/table-tree
Version:
A table tree is an expandable table for showing nested hierarchies of information.
125 lines (123 loc) • 4.94 kB
JavaScript
/* row.tsx generated by @compiled/babel-plugin v3.0.2 */
import "./row.compiled.css";
import { ax, ix } from "@compiled/react/runtime";
import React, { Fragment, useEffect, useState } from 'react';
import { usePlatformLeafEventHandler } from '@atlaskit/analytics-next/usePlatformLeafEventHandler';
import toItemId from '../utils/to-item-id';
import Chevron from './internal/chevron';
import { TreeRowContainer } from './internal/tree-row-container';
const treeRowClickableStyles = null;
const getExtendedLabel = (cellContent, cellIndex, mainColumnForExpandCollapseLabel) => {
/**
* First condition - when we pass data via `items` property in `<TableTree />`
* Second condition - when we pass data via `<Rows />` as children in `<TableTree />`.
*/
if (cellContent.hasOwnProperty('props')) {
return cellContent === null || cellContent === void 0 ? void 0 : cellContent.props[mainColumnForExpandCollapseLabel === null || mainColumnForExpandCollapseLabel === void 0 ? void 0 : mainColumnForExpandCollapseLabel.toLowerCase()];
} else if (cellIndex === mainColumnForExpandCollapseLabel) {
return cellContent;
}
return undefined;
};
function Row({
shouldExpandOnClick,
hasChildren,
depth,
renderChildren,
isDefaultExpanded,
data,
onExpand: providedOnExpand,
onCollapse: providedOnCollapse,
mainColumnForExpandCollapseLabel,
expandLabel,
collapseLabel,
itemId,
children,
isExpanded: isProvidedExpanded
}) {
const [isExpandedState, setIsExpandedState] = useState(isDefaultExpanded || false);
useEffect(() => {
if (isProvidedExpanded === undefined && isDefaultExpanded !== undefined) {
setIsExpandedState(isDefaultExpanded);
}
}, [isDefaultExpanded, isProvidedExpanded]);
const onExpand = usePlatformLeafEventHandler({
fn: value => providedOnExpand && providedOnExpand(value),
action: 'expanded',
actionSubject: 'tableTree',
componentName: 'row',
packageName: "@atlaskit/table-tree",
packageVersion: "13.3.3"
});
const onCollapse = usePlatformLeafEventHandler({
fn: value => providedOnCollapse && providedOnCollapse(value),
action: 'collapsed',
actionSubject: 'tableTree',
componentName: 'row',
packageName: "@atlaskit/table-tree",
packageVersion: "13.3.3"
});
/**
* This ensures a user won't trigger a click event and expand the accordion
* when making a text selection.
*/
const onClickHandler = e => {
var _window$getSelection;
const selection = ((_window$getSelection = window.getSelection()) === null || _window$getSelection === void 0 ? void 0 : _window$getSelection.toString()) || '';
if ((selection === null || selection === void 0 ? void 0 : selection.length) === 0) {
onExpandToggle(e);
}
};
const onExpandStateChange = isExpanded => {
if (data) {
if (isExpanded && onExpand) {
onExpand(data);
} else if (!isExpanded && onCollapse) {
onCollapse(data);
}
}
};
const onExpandToggle = e => {
e.stopPropagation();
if (isProvidedExpanded !== undefined) {
onExpandStateChange(!isProvidedExpanded);
} else {
setIsExpandedState(prevState => {
onExpandStateChange(!prevState);
return !prevState;
});
}
};
const renderCell = (cell, cellIndex) => {
const isFirstCell = cellIndex === 0;
const indentLevel = isFirstCell ? depth : 0;
let cellContent = cell.props.children || [];
const extendedLabel = getExtendedLabel(cellContent, cellIndex, mainColumnForExpandCollapseLabel);
if (isFirstCell && hasChildren) {
cellContent = [/*#__PURE__*/React.createElement(Chevron, {
key: "chevron",
expandLabel: expandLabel,
collapseLabel: collapseLabel,
extendedLabel: extendedLabel,
isExpanded: isProvidedExpanded !== undefined ? isProvidedExpanded : isExpandedState,
onExpandToggle: onExpandToggle,
ariaControls: !!itemId ? toItemId(itemId) : undefined,
rowId: !!itemId ? itemId : ''
})].concat(cellContent);
}
// eslint-disable-next-line @repo/internal/react/no-clone-element
return /*#__PURE__*/React.cloneElement(cell, {
key: cellIndex,
columnIndex: cellIndex,
indentLevel
}, cellContent);
};
return /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(TreeRowContainer, {
onClick: hasChildren && shouldExpandOnClick ? onClickHandler : undefined,
"aria-expanded": hasChildren ? isExpandedState : undefined,
"aria-level": depth ? depth : undefined,
className: ax([hasChildren && shouldExpandOnClick && "_80omtlke"])
}, React.Children.map(children, (cell, index) => renderCell(cell, index))), hasChildren && (isProvidedExpanded !== undefined ? isProvidedExpanded : isExpandedState) && renderChildren && renderChildren());
}
// eslint-disable-next-line @repo/internal/react/require-jsdoc
export default Row;