@salesforce/design-system-react
Version:
Salesforce Lightning Design System for React
185 lines (172 loc) • 4.88 kB
JSX
/* Copyright (c) 2015-present, salesforce.com, inc. All rights reserved */
/* Licensed under BSD 3-Clause - see LICENSE.txt or git.io/sfdc-license */
/* eslint-disable jsx-a11y/no-noninteractive-tabindex */
import React from 'react';
import PropTypes from 'prop-types';
import isFunction from 'lodash.isfunction';
import classNames from 'classnames';
import Truncate from '../utilities/truncate';
// ## Children
import Highlighter from '../utilities/highlighter';
import Tooltip from '../tooltip';
import { APP_LAUNCHER_TILE } from '../../utilities/constants';
const handleClick = (event, href, onClick) => {
event.preventDefault();
onClick(event, { href });
};
/**
* App Launcher Tiles provide information and links to a user's apps
*/
const AppLauncherTile = (props) => {
const smallTile = props.size === 'small' || false;
return (
<a
href={props.href} // eslint-disable-line no-script-url
onClick={
isFunction(props.onClick)
? (event) => handleClick(event, props.href, props.onClick)
: null
}
className={classNames(
'slds-app-launcher__tile slds-text-link_reset',
{ 'slds-app-launcher__tile_small': smallTile },
props.className
)}
>
<div
className={classNames('slds-app-launcher__tile-figure', {
'slds-app-launcher__tile-figure_small': smallTile,
})}
>
{props.iconNode || (
<span className="slds-avatar slds-avatar_large slds-align_absolute-center slds-icon-custom-27">
{props.iconText}
</span>
)}
</div>
{smallTile ? (
<div className="slds-app-launcher__tile-body slds-app-launcher__tile-body_small">
<p className="slds-truncate">
<Highlighter className="slds-text-link" search={props.search}>
{props.title}
</Highlighter>
</p>
</div>
) : (
<div className="slds-app-launcher__tile-body">
<Highlighter className="slds-text-link" search={props.search}>
{props.title}
</Highlighter>
<Truncate
line={2}
prefix={
props.descriptionHeading && props.descriptionHeading.toUpperCase()
}
suffix={props.moreLabel}
text={props.description}
textTruncateChild={
<Tooltip
align="bottom"
content={
<Highlighter search={props.search}>
{props.description}
</Highlighter>
}
isOpen={props.isOpenTooltip}
>
<span
className="slds-app-launcher__tile-more slds-text-link"
tabIndex="0"
>
{props.moreLabel}
</span>
</Tooltip>
}
wrapper={(text, textTruncateChild) => (
<div>
{props.descriptionHeading && (
// inline style override
<span
className="slds-text-heading_label"
style={{ letterSpacing: '0.025rem' }}
>
{props.descriptionHeading}{' '}
</span>
)}
<Highlighter search={props.search}>{text}</Highlighter>
{textTruncateChild && ' '}
{textTruncateChild}
</div>
)}
/>
</div>
)}
</a>
);
};
// ### Display Name
// Always use the canonical component name as the React display name.
AppLauncherTile.displayName = APP_LAUNCHER_TILE;
AppLauncherTile.defaultProps = {
href: 'javascript:void(0);', // eslint-disable-line no-script-url
size: 'default',
moreLabel: ' More',
};
// ### Prop Types
AppLauncherTile.propTypes = {
/**
* App name for the tile's title.
*/
title: PropTypes.string.isRequired,
/**
* Size of the rendered tile.
*/
size: PropTypes.oneOf(['default', 'small']),
/**
* The description of the app. Not visible on small tiles.
*/
description: PropTypes.string,
/**
* Heading for app description
*/
descriptionHeading: PropTypes.string,
/**
* The `href` attribute of the tile. Please pass in bookmarkable URLs from your routing library. If the `onClick` callback is specified this URL will be prevented from changing the browser's location.
*/
href: PropTypes.string,
/**
* Open the More Tooltip
*/
isOpenTooltip: PropTypes.bool,
/**
* The localized text for the "More information" tooltip.
*/
moreLabel: PropTypes.string,
/**
* Class names to be added to the tile.
*/
className: PropTypes.oneOfType([
PropTypes.array,
PropTypes.object,
PropTypes.string,
]),
/**
* Function that will be executed when clicking on a tile
*/
onClick: PropTypes.func,
/**
* Icon node for app tile. Takes priority over `iconText`
*/
iconNode: PropTypes.node,
/**
* Text to be used as an icon. Only renders if iconNode is undefined
*/
iconText: PropTypes.string,
/**
* Text used to highlight content in app tiles
*/
search: PropTypes.string,
// TODO: allow for passing iconBackgroundColor
// TODO: add Highlighter to Truncate text (https://github.com/ShinyChang/React-Text-Truncate/issues/32)
};
export default AppLauncherTile;