UNPKG

@orfeas126/box-ui-elements

Version:
144 lines (143 loc) 4.31 kB
/** * * @file Item list component * @author Box */ import * as React from 'react'; import classNames from 'classnames'; import { Table, Column } from '@box/react-virtualized/dist/es/Table'; import AutoSizer from '@box/react-virtualized/dist/es/AutoSizer'; import KeyBinder from '../common/KeyBinder'; import nameCellRenderer from '../common/item/nameCellRenderer'; import iconCellRenderer from '../common/item/iconCellRenderer'; import { isFocusableElement, focus } from '../../utils/dom'; import shareAccessCellRenderer from './shareAccessCellRenderer'; import selectionCellRenderer from './selectionCellRenderer'; import isRowSelectable from './cellRendererHelper'; import { VIEW_SELECTED, FIELD_NAME, FIELD_ID, FIELD_SHARED_LINK, TYPE_FOLDER } from '../../constants'; import '@box/react-virtualized/styles.css'; import './ItemList.scss'; const ItemList = ({ view, rootId, isSmall, rootElement, focusedRow, selectableType, canSetShareAccess, hasHitSelectionLimit, isSingleSelect, extensionsWhitelist, onItemSelect, onItemClick, onShareAccessChange, onFocusChange, currentCollection, tableRef }) => { const iconCell = iconCellRenderer(); const nameCell = nameCellRenderer(rootId, view, onItemClick); const selectionCell = selectionCellRenderer(onItemSelect, selectableType, extensionsWhitelist, hasHitSelectionLimit, isSingleSelect); const shareAccessCell = shareAccessCellRenderer(onShareAccessChange, canSetShareAccess, selectableType, extensionsWhitelist, hasHitSelectionLimit); const { id, items = [] } = currentCollection; const rowCount = items.length; const rowClassName = ({ index }) => { if (index === -1) { return ''; } const { selected, type } = items[index]; const isSelectable = isRowSelectable(selectableType, extensionsWhitelist, hasHitSelectionLimit, items[index]); return classNames(`bcp-item-row bcp-item-row-${index}`, { 'bcp-item-row-selected': selected && view !== VIEW_SELECTED, 'bcp-item-row-unselectable': type !== TYPE_FOLDER && !isSelectable // folder row should never dim }); }; const onRowClick = ({ event, rowData, index }) => { // If the click is happening on a clickable element on the item row, ignore row selection if (isRowSelectable(selectableType, extensionsWhitelist, hasHitSelectionLimit, rowData) && !isFocusableElement(event.target)) { onItemSelect(rowData); } else { onFocusChange(index); } }; return /*#__PURE__*/React.createElement(KeyBinder, { columnCount: 1, rowCount: rowCount, className: "bcp-item-grid", id: id, items: items, onSelect: onItemSelect, onOpen: onItemClick, scrollToRow: focusedRow, onScrollToChange: ({ scrollToRow }) => focus(rootElement, `.bcp-item-row-${scrollToRow}`) }, ({ onSectionRendered, scrollToRow, focusOnRender }) => /*#__PURE__*/React.createElement(AutoSizer, null, ({ width, height }) => /*#__PURE__*/React.createElement(Table, { width: width, height: height, disableHeader: true, headerHeight: 0, rowHeight: isSmall ? 70 : 50, rowCount: rowCount, rowGetter: ({ index }) => items[index], ref: tableRef, rowClassName: rowClassName, onRowClick: onRowClick, scrollToIndex: scrollToRow, onRowsRendered: ({ startIndex, stopIndex }) => { onSectionRendered({ rowStartIndex: startIndex, rowStopIndex: stopIndex }); if (focusOnRender) { focus(rootElement, `.bcp-item-row-${scrollToRow}`); } } }, /*#__PURE__*/React.createElement(Column, { dataKey: FIELD_ID, cellRenderer: iconCell, width: isSmall ? 30 : 50, flexShrink: 0 }), /*#__PURE__*/React.createElement(Column, { dataKey: FIELD_NAME, cellRenderer: nameCell, width: 300, flexGrow: 1 }), isSmall ? null : /*#__PURE__*/React.createElement(Column, { dataKey: FIELD_SHARED_LINK, cellRenderer: shareAccessCell, width: 260, flexShrink: 0 }), /*#__PURE__*/React.createElement(Column, { dataKey: FIELD_ID, cellRenderer: selectionCell, width: isSmall ? 20 : 30, flexShrink: 0 })))); }; export default ItemList; //# sourceMappingURL=ItemList.js.map