UNPKG

@salesforce/design-system-react

Version:

Salesforce Lightning Design System for React

126 lines (112 loc) 3.04 kB
/* Copyright (c) 2015-present, salesforce.com, inc. All rights reserved */ /* Licensed under BSD 3-Clause - see LICENSE.txt or git.io/sfdc-license */ // ### React import React from 'react'; import createReactClass from 'create-react-class'; import PropTypes from 'prop-types'; // ### classNames import classNames from 'classnames'; // ### find import find from 'lodash.find'; // ## Children import Checkbox from '../../forms/checkbox'; // ## Constants import { DATA_TABLE_ROW, DATA_TABLE_ROW_ACTIONS, DATA_TABLE_CELL } from '../../../utilities/constants'; /** * Used internally, provides row rendering to the DataTable. */ const DataTableRow = createReactClass({ // ### Display Name // Always use the canonical component name as the React display name. displayName: DATA_TABLE_ROW, // ### Prop Types propTypes: { /** * Text for select row */ assistiveTextForSelectRow: PropTypes.string, canSelectRows: PropTypes.bool, columns: PropTypes.arrayOf( PropTypes.shape({ Cell: PropTypes.func, props: PropTypes.object }) ), /** * Use this if you are creating an advanced table (selectable, sortable, or resizable rows) */ fixedLayout: PropTypes.bool, id: PropTypes.string.isRequired, item: PropTypes.object.isRequired, onToggle: PropTypes.func, rowActions: PropTypes.element, selection: PropTypes.array }, isSelected () { return !!find(this.props.selection, this.props.item); }, handleToggle (selected, e) { return this.props.onToggle(this.props.item, selected, e); }, // ### Render render () { const isSelected = this.isSelected(); // i18n return ( <tr className={classNames({ 'slds-hint-parent': this.props.rowActions, 'slds-is-selected': this.props.canSelectRows && isSelected })} > {this.props.canSelectRows ? ( <td role={this.props.fixedLayout ? 'gridcell' : null} className="slds-text-align--right" data-label="Select Row" style={{ width: '3.25rem' }} > <Checkbox assistiveText={this.props.assistiveTextForSelectRow} checked={isSelected} id={`${this.props.id}-SelectRow`} name="SelectRow" onChange={this.handleToggle} /> </td> ) : null} {this.props.columns.map((column) => { const Cell = column.Cell; const cellId = `${this.props.id}-${DATA_TABLE_CELL}-${ column.props.property }`; return ( <Cell {...column.props} className={column.props.truncate ? 'slds-truncate' : null} fixedLayout={this.props.fixedLayout} rowHeader={column.props.primaryColumn} id={cellId} item={this.props.item} key={cellId} width={column.props.width} > {this.props.item[column.props.property]} </Cell> ); })} {this.props.rowActions ? React.cloneElement(this.props.rowActions, { id: `${this.props.id}-${DATA_TABLE_ROW_ACTIONS}`, item: this.props.item }) : null} </tr> ); } }); export default DataTableRow;