UNPKG

@atlaskit/table-tree

Version:

A table tree is an expandable table for showing nested hierarchies of information.

125 lines (123 loc) • 4.94 kB
/* 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;