UNPKG

@salesforce/design-system-react

Version:

Salesforce Lightning Design System for React

237 lines (212 loc) 8.78 kB
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import EventUtil from '../../utilities/event'; import BuilderHeaderUtilities from './utilities'; import BuilderHeaderNavLink from './nav-link'; import Icon from '../icon'; import { BUILDER_HEADER, BUILDER_HEADER_NAV, BUILDER_HEADER_TOOLBAR, BUILDER_HEADER_MISC, BUILDER_HEADER_UTILITIES } from '../../utilities/constants'; var propTypes = { /** * **Assistive text for accessibility** * This object is merged with the default props object on every render. * * `backIcon`: Used for the back icon. * * `helpIcon`: Used for the help icon. * * `icon`: Used for the main icon next to the header title. * * _Tested with snapshot testing._ */ assistiveText: PropTypes.shape({ backIcon: PropTypes.string, helpIcon: PropTypes.string, icon: PropTypes.string }), /** * Provide children of the types `<BuilderHeaderNav />`, `<BuilderHeaderToolbar />`, or `<BuilderHeaderMisc />` to define the structure of the header. * ``` * <BuilderHeader> * <BuilderHeaderNav /> * <BuilderHeaderToolbar /> * <BuilderHeaderMisc /> * </BuilderHeader> * ``` */ children: PropTypes.node, /** * CSS classes to be added to tag with `.slds-builder-header_container`. Uses `classNames` [API](https://github.com/JedWatson/classnames). _Tested with snapshot testing._ */ className: PropTypes.oneOfType([PropTypes.array, PropTypes.object, PropTypes.string]), /** * Event Callbacks * * `onClickBack`: Called when the Back link is clicked. * * `onClickHelp`: Called when the Help link is clicked. * _Tested with Mocha testing._ */ events: PropTypes.shape({ onClickBack: PropTypes.func, onClickHelp: PropTypes.func }), /** * Category of the title icon from [lightningdesignsystem.com/icons/](https://www.lightningdesignsystem.com/icons/) */ iconCategory: PropTypes.string, /** * CSS classes that are applied to the title icon. */ iconClassName: PropTypes.oneOfType([PropTypes.array, PropTypes.object, PropTypes.string]), /** * Name of the title icon. Visit <a href='http://www.lightningdesignsystem.com/resources/icons'>Lightning Design System Icons</a> to reference icon names. */ iconName: PropTypes.string, /** * Path to the title icon. This will override any global icon settings. */ iconPath: PropTypes.string, /** * **Text labels for internationalization** * This object is merged with the default props object on every render. * * `back`: The label for the Back link. * * `help`: The label for the Help link. * * `pageType`: The label that describes the page type. * * `title`: The label for the page title. * _Tested with snapshot testing._ */ labels: PropTypes.shape({ back: PropTypes.string, help: PropTypes.string, pageType: PropTypes.string, title: PropTypes.string }), /** * Custom styles applied to the `.slds-builder-header_container` element. */ style: PropTypes.object }; var defaultProps = { assistiveText: { backIcon: 'Back', helpIcon: 'Help', icon: 'Builder' }, iconCategory: 'utility', iconName: 'builder', labels: { back: 'Back', help: 'Help', pageType: 'Page Type', title: 'App Name' } }; /** * Every builder needs a builder header, which contains basic navigation elements. It also shows the builder type and content name. */ var BuilderHeader = function BuilderHeader(_ref) { var _ref$assistiveText = _ref.assistiveText, assistiveText = _ref$assistiveText === void 0 ? defaultProps.assistiveText : _ref$assistiveText, children = _ref.children, className = _ref.className, _ref$events = _ref.events, events = _ref$events === void 0 ? {} : _ref$events, _ref$iconCategory = _ref.iconCategory, iconCategory = _ref$iconCategory === void 0 ? defaultProps.iconCategory : _ref$iconCategory, iconClassName = _ref.iconClassName, _ref$iconName = _ref.iconName, iconName = _ref$iconName === void 0 ? defaultProps.iconName : _ref$iconName, iconPath = _ref.iconPath, _ref$labels = _ref.labels, labels = _ref$labels === void 0 ? defaultProps.labels : _ref$labels, style = _ref.style; var mergedAssistiveText = _objectSpread(_objectSpread({}, defaultProps.assistiveText), assistiveText); var mergedEvents = _objectSpread(_objectSpread({}, {}), events); var mergedLabels = _objectSpread(_objectSpread({}, defaultProps.labels), labels); var nav; var toolbar; // Default utilities includes Back and Help links var utilities = /*#__PURE__*/React.createElement(BuilderHeaderUtilities, null, /*#__PURE__*/React.createElement(BuilderHeaderNavLink, { assistiveText: { icon: mergedAssistiveText.backIcon }, iconCategory: "utility", iconName: "back", label: mergedLabels.back, onClick: EventUtil.trappedHandler(mergedEvents.onClickBack) }), /*#__PURE__*/React.createElement(BuilderHeaderNavLink, { assistiveText: { icon: mergedAssistiveText.helpIcon }, iconCategory: "utility", iconName: "help", label: mergedLabels.help, onClick: EventUtil.trappedHandler(mergedEvents.onClickHelp) })); var misc = []; React.Children.forEach(children, function (child) { if (child) { switch (child.type.displayName) { case BUILDER_HEADER_NAV: nav = child; break; case BUILDER_HEADER_TOOLBAR: toolbar = child; break; case BUILDER_HEADER_MISC: // eslint-disable-next-line fp/no-mutating-methods misc.push(child); break; case BUILDER_HEADER_UTILITIES: utilities = child; break; default: } } }); var resolvedIconCategory; var resolvedIconName; var resolvedIconPath; if (iconPath) { resolvedIconPath = iconPath; } else { resolvedIconCategory = iconCategory; resolvedIconName = iconName; } return /*#__PURE__*/React.createElement("div", { style: { position: 'relative', height: '100px' } }, /*#__PURE__*/React.createElement("div", { className: classNames('slds-builder-header_container', className), style: style }, /*#__PURE__*/React.createElement("header", { className: "slds-builder-header" }, /*#__PURE__*/React.createElement("div", { className: "slds-builder-header__item" }, /*#__PURE__*/React.createElement("div", { className: "slds-builder-header__item-label slds-media slds-media_center" }, /*#__PURE__*/React.createElement("div", { className: "slds-media__figure" }, /*#__PURE__*/React.createElement(Icon, { assistiveText: { label: mergedAssistiveText.icon }, category: resolvedIconCategory, containerClassName: classNames('slds-icon_container', 'slds-icon-utility-builder', 'slds-current-color', iconClassName), name: resolvedIconName, path: resolvedIconPath, size: "x-small" })), /*#__PURE__*/React.createElement("div", { className: "slds-media__body" }, mergedLabels.title))), nav, misc.length > 0 ? misc : /*#__PURE__*/React.createElement("div", { className: "slds-builder-header__item slds-has-flexi-truncate" }, /*#__PURE__*/React.createElement("h1", { className: "slds-builder-header__item-label" }, /*#__PURE__*/React.createElement("span", { className: "slds-truncate", title: mergedLabels.pageType }, mergedLabels.pageType))), utilities), toolbar)); }; BuilderHeader.displayName = BUILDER_HEADER; BuilderHeader.propTypes = propTypes; export default BuilderHeader; //# sourceMappingURL=index.js.map