UNPKG

11.8 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports["default"] = exports.computeCollapseIndex = exports.computeAbsoluteTabIndex = void 0;
7
8var _react = _interopRequireWildcard(require("react"));
9
10var _ListItem = _interopRequireDefault(require("@material-ui/core/ListItem"));
11
12var _ListItemIcon = _interopRequireDefault(require("@material-ui/core/ListItemIcon"));
13
14var _ListItemText = _interopRequireDefault(require("@material-ui/core/ListItemText"));
15
16var _Collapse = _interopRequireDefault(require("@material-ui/core/Collapse"));
17
18var _ExpandLess = _interopRequireDefault(require("@material-ui/icons/ExpandLess"));
19
20var _ExpandMore = _interopRequireDefault(require("@material-ui/icons/ExpandMore"));
21
22var _Tabs = _interopRequireDefault(require("@material-ui/core/Tabs"));
23
24var _Tab = _interopRequireDefault(require("@material-ui/core/Tab"));
25
26var _styles = require("@material-ui/core/styles");
27
28var _Typography = _interopRequireDefault(require("@material-ui/core/Typography"));
29
30var _compose = _interopRequireDefault(require("recompose/compose"));
31
32var _styles2 = require("./styles");
33
34var _propTypes = _interopRequireDefault(require("prop-types"));
35
36function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
37
38function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } }
39
40function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
41
42function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
43
44function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
45
46function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
47
48// Aboslute index is index of tab considering all collapses flattened
49// flow-disable-next-line
50var computeAbsoluteTabIndex = function computeAbsoluteTabIndex(tabs, relativeTabIndex, itemIndex) {
51 var anteriorTabs = 0;
52
53 for (var i = 0; i < itemIndex; i += 1) {
54 anteriorTabs += Array.isArray(tabs[i]) ? tabs[i].length : 1;
55 }
56
57 return anteriorTabs + relativeTabIndex;
58}; // Returns the collapse containing the given tab
59// Returns -1 if tab is not inside a collapse
60// flow-disable-next-line
61
62
63exports.computeAbsoluteTabIndex = computeAbsoluteTabIndex;
64
65var computeCollapseIndex = function computeCollapseIndex(tabIndex, tabs) {
66 var collapseIndex = -1;
67 var cursor = 0;
68 var absoluteIndex = 0;
69
70 while (absoluteIndex <= tabIndex) {
71 if (Array.isArray(tabs[cursor])) {
72 absoluteIndex += tabs[cursor].length;
73 collapseIndex += 1;
74 } else if (absoluteIndex === tabIndex) {
75 return -1;
76 } else {
77 absoluteIndex += 1;
78 }
79
80 cursor += 1;
81 }
82
83 return collapseIndex;
84};
85
86exports.computeCollapseIndex = computeCollapseIndex;
87
88var computeTitleIndex = function computeTitleIndex(itemIndex, tabs) {
89 var firstTabInCollapse = computeAbsoluteTabIndex(tabs, 0, itemIndex);
90 return computeCollapseIndex(firstTabInCollapse, tabs);
91};
92
93var TabLabel = function TabLabel(_ref) {
94 var title = _ref.title,
95 subtitle = _ref.subtitle;
96 return _react["default"].createElement(_react["default"].Fragment, null, _react["default"].createElement(_Typography["default"], {
97 variant: "h3",
98 style: {
99 opacity: 0.6
100 }
101 }, subtitle), _react["default"].createElement(_Typography["default"], {
102 variant: "body1"
103 }, title));
104};
105
106TabLabel.propTypes = {
107 title: _propTypes["default"].string,
108 subtitle: _propTypes["default"].string
109};
110
111// Properties :
112// Tabs : Array of tabs - if several tabs are grouped in one collapse, put them in one same array
113// CollapseTitles : Array of titles for collapses headers, if necessary
114// AreCollapsesSpaced : Whether collapses should have vertical margin to sepearate them from other tabs
115var VerticalTabMenuJSX = function VerticalTabMenuJSX(_ref2) {
116 var tabs = _ref2.tabs,
117 collapseTitles = _ref2.collapseTitles,
118 tabChangeHandler = _ref2.tabChangeHandler,
119 isTabDisabled = _ref2.isTabDisabled,
120 activeTab = _ref2.activeTab,
121 css = _ref2.classes,
122 areCollapsesSpaced = _ref2.areCollapsesSpaced;
123
124 var _useState = (0, _react.useState)(activeTab ? computeCollapseIndex(activeTab, tabs) : -1),
125 _useState2 = _slicedToArray(_useState, 2),
126 collapse = _useState2[0],
127 setCollapse = _useState2[1];
128
129 return _react["default"].createElement("div", null, _react["default"].createElement(VerticalTabs, {
130 value: collapse > -1 ? false : activeTab,
131 onChange: function onChange(_, i) {
132 setCollapse(-1);
133 tabChangeHandler(i);
134 },
135 className: css.globalContainer
136 }, tabs.map(function (item, itemIndex) {
137 return Array.isArray(item) ? _react["default"].createElement("div", {
138 key: item[0].title,
139 className: areCollapsesSpaced ? css.collapseWithMargin : css.collapseBlock
140 }, _react["default"].createElement(_ListItem["default"], {
141 button: true,
142 onClick: function onClick() {
143 if (itemIndex !== collapse) {
144 setCollapse(itemIndex);
145 tabChangeHandler(computeAbsoluteTabIndex(tabs, 0, itemIndex));
146 }
147 },
148 className: css.collapseHeader
149 }, collapseTitles && collapseTitles[computeTitleIndex(itemIndex, tabs)].icon ? _react["default"].createElement(_ListItemIcon["default"], {
150 className: css.collapseIcon
151 }, collapseTitles[computeTitleIndex(itemIndex, tabs)].icon) : _react["default"].createElement("div", {
152 className: css.collapseEmptyIcon
153 }), _react["default"].createElement(_ListItemText["default"], {
154 inset: true,
155 primary: collapseTitles && collapseTitles[computeTitleIndex(itemIndex, tabs)].title,
156 className: css.collapseText
157 }), collapse === itemIndex ? _react["default"].createElement(_ExpandLess["default"], null) : _react["default"].createElement(_ExpandMore["default"], null)), _react["default"].createElement(_Collapse["default"], {
158 "in": collapse === itemIndex,
159 timeout: "auto",
160 unmountOnExit: true,
161 classes: {
162 wrapperInner: css.collapseInner
163 }
164 }, _react["default"].createElement(VerticalTabs, {
165 value: collapse !== itemIndex || collapse === -1 ? false : activeTab,
166 onChange: function onChange(_, i) {
167 return tabChangeHandler(i);
168 }
169 }, item.map(function (tab, tabIndex) {
170 var absoluteTabIndex = computeAbsoluteTabIndex(tabs, tabIndex, itemIndex);
171 return _react["default"].createElement(VerticalTab, {
172 key: tab.title,
173 value: absoluteTabIndex,
174 label: _react["default"].createElement(TabLabel, {
175 title: tab.title,
176 subtitle: tab.subtitle
177 }),
178 icon: tab.icon,
179 disabled: isTabDisabled ? isTabDisabled(absoluteTabIndex) : false,
180 classes: {
181 wrapper: activeTab === absoluteTabIndex ? css.selectedInsideCollapse : css.wrapperInsideCollapse
182 }
183 });
184 })))) : _react["default"].createElement(VerticalTab, {
185 key: item.title,
186 value: computeAbsoluteTabIndex(tabs, 0, itemIndex),
187 label: _react["default"].createElement(TabLabel, {
188 title: item.title,
189 subtitle: item.subtitle
190 }),
191 icon: item.icon,
192 disabled: isTabDisabled ? isTabDisabled(computeAbsoluteTabIndex(tabs, 0, itemIndex)) : false,
193 className: css.lonelyTab
194 });
195 })));
196};
197
198VerticalTabMenuJSX.propTypes = {
199 tabs: _propTypes["default"].arrayOf(_propTypes["default"].oneOfType([_propTypes["default"].shape({
200 title: _propTypes["default"].string.isRequired,
201 subtitle: _propTypes["default"].string,
202 icon: _propTypes["default"].any,
203 childrenTabs: _propTypes["default"].object
204 }), _propTypes["default"].arrayOf(_propTypes["default"].shape({
205 title: _propTypes["default"].string.isRequired,
206 subtitle: _propTypes["default"].string,
207 icon: _propTypes["default"].any,
208 childrenTabs: _propTypes["default"].object
209 }).isRequired)]).isRequired).isRequired,
210 collapseTitles: _propTypes["default"].arrayOf(_propTypes["default"].shape({
211 title: _propTypes["default"].string.isRequired,
212 icon: _propTypes["default"].any
213 }).isRequired),
214 tabChangeHandler: _propTypes["default"].func.isRequired,
215 isTabDisabled: _propTypes["default"].func,
216 activeTab: _propTypes["default"].number,
217 classes: _propTypes["default"].object.isRequired,
218 areCollapsesSpaced: _propTypes["default"].bool
219};
220var VerticalTabs = (0, _styles.withStyles)({
221 root: {
222 boxShadow: 'none'
223 },
224 flexContainer: {
225 flexDirection: 'column'
226 }
227})(_Tabs["default"]);
228var VerticalTab = (0, _styles.withStyles)(function (_ref3) {
229 var palette = _ref3.palette;
230 return {
231 root: {
232 maxWidth: '100%',
233 borderBottom: "1px solid ".concat(palette.grey[300]),
234 borderRight: "1px solid ".concat(palette.grey[300]),
235 borderLeft: "1px solid ".concat(palette.grey[300]),
236 opacity: 1
237 },
238 wrapper: {
239 textAlign: 'left',
240 display: 'flex',
241 alignItems: 'center',
242 justifyContent: 'left',
243 '&>svg': {
244 fontSize: '1.25rem',
245 marginRight: 3
246 },
247 color: palette.secondary.dark
248 },
249 selected: {
250 backgroundColor: 'white'
251 },
252 disabled: {
253 opacity: '1 !important',
254 '&>span': {
255 opacity: 0.5
256 }
257 }
258 };
259})(_Tab["default"]);
260var VerticalTabMenu = (0, _compose["default"])((0, _styles.withStyles)(function (_ref4) {
261 var palette = _ref4.palette;
262 return {
263 globalContainer: {
264 borderTop: "1px solid ".concat(palette.grey[300]),
265 borderRadius: '8px 8px 0px 0px'
266 },
267 collapseHeader: {
268 paddingTop: 20,
269 paddingBottom: 20,
270 background: _styles2.secondaryColorExtraLight,
271 borderBottom: "1px solid ".concat(palette.grey[300]),
272 borderRight: "1px solid ".concat(palette.grey[300]),
273 borderLeft: "1px solid ".concat(palette.grey[300])
274 },
275 collapseEmptyIcon: {
276 width: 40
277 },
278 collapseText: {
279 paddingLeft: 0
280 },
281 collapseIcon: {
282 color: palette.secondary.dark,
283 marginLeft: 10,
284 marginRight: 10,
285 '&>svg': {
286 fontSize: '1.25rem'
287 }
288 },
289 wrapperInsideCollapse: {
290 paddingLeft: 20,
291 borderLeft: "3px solid ".concat(palette.grey[300]),
292 height: '100%'
293 },
294 selectedInsideCollapse: {
295 extend: 'wrapperInsideCollapse',
296 borderLeft: "3px solid ".concat(palette.primary.main)
297 },
298 collapseInner: {
299 display: 'flex',
300 flexDirection: 'column'
301 },
302 collapseBlock: {
303 '&:first-child': {
304 '&>div': {
305 borderRadius: '8px 8px 0px 0px'
306 }
307 }
308 },
309 collapseWithMargin: {
310 extend: 'collapseBlock',
311 '&:not(:first-child)': {
312 borderTop: "1px solid ".concat(palette.grey[300])
313 },
314 '&:not(:last-child)': {
315 marginBottom: 20
316 }
317 },
318 wrapperDisabled: {
319 opacity: '0.5 !important'
320 },
321 lonelyTab: {
322 '&:first-child': {
323 borderRadius: '8px 8px 0px 0px'
324 }
325 }
326 };
327}))(VerticalTabMenuJSX);
328var _default = VerticalTabMenu;
329exports["default"] = _default;
\No newline at end of file