UNPKG

7.53 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
4
5var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
6
7Object.defineProperty(exports, "__esModule", {
8 value: true
9});
10exports.default = exports.styles = void 0;
11
12var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
14var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
15
16var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
17
18var React = _interopRequireWildcard(require("react"));
19
20var _reactIs = require("react-is");
21
22var _propTypes = _interopRequireDefault(require("prop-types"));
23
24var _clsx = _interopRequireDefault(require("clsx"));
25
26var _withStyles = _interopRequireDefault(require("../styles/withStyles"));
27
28var _Typography = _interopRequireDefault(require("../Typography"));
29
30var _BreadcrumbCollapsed = _interopRequireDefault(require("./BreadcrumbCollapsed"));
31
32var styles = {
33 /* Styles applied to the root element. */
34 root: {},
35
36 /* Styles applied to the ol element. */
37 ol: {
38 display: 'flex',
39 flexWrap: 'wrap',
40 alignItems: 'center',
41 padding: 0,
42 margin: 0,
43 listStyle: 'none'
44 },
45
46 /* Styles applied to the li element. */
47 li: {},
48
49 /* Styles applied to the separator element. */
50 separator: {
51 display: 'flex',
52 userSelect: 'none',
53 marginLeft: 8,
54 marginRight: 8
55 }
56};
57exports.styles = styles;
58
59function insertSeparators(items, className, separator) {
60 return items.reduce(function (acc, current, index) {
61 if (index < items.length - 1) {
62 acc = acc.concat(current, /*#__PURE__*/React.createElement("li", {
63 "aria-hidden": true,
64 key: "separator-".concat(index),
65 className: className
66 }, separator));
67 } else {
68 acc.push(current);
69 }
70
71 return acc;
72 }, []);
73}
74
75var Breadcrumbs = /*#__PURE__*/React.forwardRef(function Breadcrumbs(props, ref) {
76 var children = props.children,
77 classes = props.classes,
78 className = props.className,
79 _props$component = props.component,
80 Component = _props$component === void 0 ? 'nav' : _props$component,
81 _props$expandText = props.expandText,
82 expandText = _props$expandText === void 0 ? 'Show path' : _props$expandText,
83 _props$itemsAfterColl = props.itemsAfterCollapse,
84 itemsAfterCollapse = _props$itemsAfterColl === void 0 ? 1 : _props$itemsAfterColl,
85 _props$itemsBeforeCol = props.itemsBeforeCollapse,
86 itemsBeforeCollapse = _props$itemsBeforeCol === void 0 ? 1 : _props$itemsBeforeCol,
87 _props$maxItems = props.maxItems,
88 maxItems = _props$maxItems === void 0 ? 8 : _props$maxItems,
89 _props$separator = props.separator,
90 separator = _props$separator === void 0 ? '/' : _props$separator,
91 other = (0, _objectWithoutProperties2.default)(props, ["children", "classes", "className", "component", "expandText", "itemsAfterCollapse", "itemsBeforeCollapse", "maxItems", "separator"]);
92
93 var _React$useState = React.useState(false),
94 expanded = _React$useState[0],
95 setExpanded = _React$useState[1];
96
97 var renderItemsBeforeAndAfter = function renderItemsBeforeAndAfter(allItems) {
98 var handleClickExpand = function handleClickExpand(event) {
99 setExpanded(true); // The clicked element received the focus but gets removed from the DOM.
100 // Let's keep the focus in the component after expanding.
101
102 var focusable = event.currentTarget.parentNode.querySelector('a[href],button,[tabindex]');
103
104 if (focusable) {
105 focusable.focus();
106 }
107 }; // This defends against someone passing weird input, to ensure that if all
108 // items would be shown anyway, we just show all items without the EllipsisItem
109
110
111 if (itemsBeforeCollapse + itemsAfterCollapse >= allItems.length) {
112 if (process.env.NODE_ENV !== 'production') {
113 console.error(['Material-UI: You have provided an invalid combination of props to the Breadcrumbs.', "itemsAfterCollapse={".concat(itemsAfterCollapse, "} + itemsBeforeCollapse={").concat(itemsBeforeCollapse, "} >= maxItems={").concat(maxItems, "}")].join('\n'));
114 }
115
116 return allItems;
117 }
118
119 return [].concat((0, _toConsumableArray2.default)(allItems.slice(0, itemsBeforeCollapse)), [/*#__PURE__*/React.createElement(_BreadcrumbCollapsed.default, {
120 "aria-label": expandText,
121 key: "ellipsis",
122 onClick: handleClickExpand
123 })], (0, _toConsumableArray2.default)(allItems.slice(allItems.length - itemsAfterCollapse, allItems.length)));
124 };
125
126 var allItems = React.Children.toArray(children).filter(function (child) {
127 if (process.env.NODE_ENV !== 'production') {
128 if ((0, _reactIs.isFragment)(child)) {
129 console.error(["Material-UI: The Breadcrumbs component doesn't accept a Fragment as a child.", 'Consider providing an array instead.'].join('\n'));
130 }
131 }
132
133 return /*#__PURE__*/React.isValidElement(child);
134 }).map(function (child, index) {
135 return /*#__PURE__*/React.createElement("li", {
136 className: classes.li,
137 key: "child-".concat(index)
138 }, child);
139 });
140 return /*#__PURE__*/React.createElement(_Typography.default, (0, _extends2.default)({
141 ref: ref,
142 component: Component,
143 color: "textSecondary",
144 className: (0, _clsx.default)(classes.root, className)
145 }, other), /*#__PURE__*/React.createElement("ol", {
146 className: classes.ol
147 }, insertSeparators(expanded || maxItems && allItems.length <= maxItems ? allItems : renderItemsBeforeAndAfter(allItems), classes.separator, separator)));
148});
149process.env.NODE_ENV !== "production" ? Breadcrumbs.propTypes = {
150 // ----------------------------- Warning --------------------------------
151 // | These PropTypes are generated from the TypeScript type definitions |
152 // | To update them edit the d.ts file and run "yarn proptypes" |
153 // ----------------------------------------------------------------------
154
155 /**
156 * The breadcrumb children.
157 */
158 children: _propTypes.default.node,
159
160 /**
161 * Override or extend the styles applied to the component.
162 * See [CSS API](#css) below for more details.
163 */
164 classes: _propTypes.default.object,
165
166 /**
167 * @ignore
168 */
169 className: _propTypes.default.string,
170
171 /**
172 * The component used for the root node.
173 * Either a string to use a HTML element or a component.
174 */
175 component: _propTypes.default
176 /* @typescript-to-proptypes-ignore */
177 .elementType,
178
179 /**
180 * Override the default label for the expand button.
181 *
182 * For localization purposes, you can use the provided [translations](/guides/localization/).
183 */
184 expandText: _propTypes.default.string,
185
186 /**
187 * If max items is exceeded, the number of items to show after the ellipsis.
188 */
189 itemsAfterCollapse: _propTypes.default.number,
190
191 /**
192 * If max items is exceeded, the number of items to show before the ellipsis.
193 */
194 itemsBeforeCollapse: _propTypes.default.number,
195
196 /**
197 * Specifies the maximum number of breadcrumbs to display. When there are more
198 * than the maximum number, only the first `itemsBeforeCollapse` and last `itemsAfterCollapse`
199 * will be shown, with an ellipsis in between.
200 */
201 maxItems: _propTypes.default.number,
202
203 /**
204 * Custom separator node.
205 */
206 separator: _propTypes.default.node
207} : void 0;
208
209var _default = (0, _withStyles.default)(styles, {
210 name: 'MuiBreadcrumbs'
211})(Breadcrumbs);
212
213exports.default = _default;
\No newline at end of file