optimizely-oui
Version:
Optimizely's Component Library.
113 lines (104 loc) • 3.98 kB
JavaScript
import React from "react";
import PropTypes from "prop-types";
import classNames from "classnames";
/**
*
* @param {Object} props - Properties passed to component
* @returns {ReactElement}
*/
const EmptyDashboard = ({
button,
className,
imageHeight,
imagePath,
imageWidth,
headline,
description,
descriptionMaxWidth,
showButtonBelow,
testSection,
...props
}) => {
return (
<div
data-oui-component={true}
className={classNames("flex flex--column overflow-y--auto flex--1", className)}
data-test-section="empty-state"
{...props}
>
{button && !showButtonBelow && (
<div className="flex push-quad--sides oui-empty-dashboard__button-row flex-justified--end">
{button}
</div>
)}
<div className="anchor--middle height--1-1 flex flex--row flex-align--center">
<div data-oui-component={true} className="text--center soft-quad" data-test-section={testSection}>
{imagePath && (
<div className="push-double--bottom">
<img
src={imagePath}
className="svg--non-scaling-stroke display--inline"
style={{
maxWidth: "450px",
maxHeight: "290px",
height: imageHeight,
width: imageWidth,
}}
data-test-section={testSection && `${testSection}-image`}
alt=""
/>
</div>
)}
{headline && (
<h1 className="alpha push--bottom" data-test-section={testSection && `${testSection}-headline`}>
{headline}
</h1>
)}
{description && (
<div
className="muted push--bottom anchor--middle"
style={{ maxWidth: descriptionMaxWidth }}
data-test-section={testSection && `${testSection}-description`}
>
{description}
</div>
)}
{button && showButtonBelow && <div className="push-double--top">{button}</div>}
</div>
</div>
</div>
);
};
EmptyDashboard.propTypes = {
/** A button, link, or other element that is actionable */
button: PropTypes.node,
/** CSS class names. */
className: PropTypes.string,
/** A string or `div` containing longer text that describes the empty state */
description: PropTypes.element,
/** Max width of description. Accepts any valid CSS width value. */
descriptionMaxWidth: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
/** Short text about the empty state */
headline: PropTypes.string.isRequired,
/** String to set the max image height */
imageHeight: PropTypes.string,
/** Path to an image representing the empty state */
imagePath: PropTypes.string,
/** String to set the max image width */
imageWidth: PropTypes.string,
/**
* Boolean used to show the button below the image
* instead of top right corner of the empty state
*/
showButtonBelow: PropTypes.bool,
/** Identifier used to create data-test-section attributes for testing */
testSection: PropTypes.string,
};
EmptyDashboard.getDefaultProps = {
descriptionMaxWidth: "450px",
imageHeight: "inherit",
imageWidth: "inherit",
showButtonBelow: false,
testSection: "empty-hello",
};
export default EmptyDashboard;