@appbuckets/react-ui
Version:
Just Another React UI Framework
211 lines (204 loc) • 5.79 kB
JavaScript
'use strict';
var tslib = require('tslib');
var React = require('react');
var clsx = require('clsx');
var reactUiCore = require('@appbuckets/react-ui-core');
var customHook = require('../utils/customHook.js');
require('../BucketTheme/BucketTheme.js');
var BucketContext = require('../BucketTheme/BucketContext.js');
var Column = require('../Column/Column.js');
var Menu = require('../Menu/Menu.js');
var Row = require('../Row/Row.js');
var TabPanel = require('./TabPanel.js');
function _interopDefaultLegacy(e) {
return e && typeof e === 'object' && 'default' in e ? e : { default: e };
}
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(
n,
k,
d.get
? d
: {
enumerable: true,
get: function () {
return e[k];
},
}
);
}
});
}
n['default'] = e;
return Object.freeze(n);
}
var React__namespace = /*#__PURE__*/ _interopNamespace(React);
var clsx__default = /*#__PURE__*/ _interopDefaultLegacy(clsx);
/* --------
* Component Render
* -------- */
var Tabs = function (receivedProps) {
var _a;
var props = BucketContext.useWithDefaultProps('tabs', receivedProps);
var _b = customHook.useSharedClassName(props),
className = _b.className,
_c = _b.rest,
userDefinedActiveIndex = _c.activeIndex;
_c.content;
var defaultActiveIndex = _c.defaultActiveIndex,
layout = _c.layout,
menu = _c.menu,
onTabChange = _c.onTabChange,
panels = _c.panels,
renderActiveOnly = _c.renderActiveOnly;
_c.vertical;
var rest = tslib.__rest(_c, [
'activeIndex',
'content',
'defaultActiveIndex',
'layout',
'menu',
'onTabChange',
'panels',
'renderActiveOnly',
'vertical',
]);
/** Control active tab */
var _d = tslib.__read(
reactUiCore.useAutoControlledValue(0, {
prop: userDefinedActiveIndex,
defaultProp: defaultActiveIndex,
}),
2
),
activeIndex = _d[0],
trySetActiveIndex = _d[1];
/** Get the component element type */
var ElementType = reactUiCore.useElementType(Tabs, receivedProps, props);
/** Build the element class list */
var classes = clsx__default['default']('tabs', className);
// ----
// Define Handlers
// ----
var handleMenuItemClick = function (e, menuItemProps) {
/** Get menu item index */
var index = menuItemProps.index;
/** Fire user defined callback */
if (onTabChange) {
onTabChange(
e,
tslib.__assign(tslib.__assign({}, props), { activeIndex: index })
);
}
/** Try to set the new index */
trySetActiveIndex(index !== null && index !== void 0 ? index : 0);
};
// ----
// Define SubComponent Render
// ----
/** Current Active Panel */
var activePanel = Array.isArray(panels)
? (_a = panels[activeIndex]) === null || _a === void 0
? void 0
: _a.panel
: undefined;
/** Rendered Panels Element */
var renderTabsElement = function () {
/** If no active panel, or no Array, return empty component */
if (!Array.isArray(panels) || !activePanel) {
return null;
}
/** If must render active index only return a single panel */
if (renderActiveOnly) {
return TabPanel.create(activePanel, {
autoGenerateKey: false,
overrideProps: { active: true },
});
}
/** Else, return a tab panels collection */
return panels.map(function (_a, index) {
var panel = _a.panel;
return TabPanel.create(panel, {
autoGenerateKey: true,
overrideProps: {
active: index === activeIndex,
},
});
});
};
/** Menu Element */
var renderMenuElement = function () {
/** If no panels, don't render the menu */
if (!Array.isArray(panels)) {
return null;
}
/** Get Triggers */
var triggers = panels.map(function (panel) {
return panel.trigger;
});
/** Return the menu */
return Menu.create(menu, {
autoGenerateKey: false,
overrideProps: {
items: triggers,
onItemClick: handleMenuItemClick,
activeIndex: activeIndex,
},
});
};
// ----
// Render Vertical Layout Element
// ----
if (menu === null || menu === void 0 ? void 0 : menu.vertical) {
var menuColumn = React__namespace.createElement(
Column,
{
width: layout === null || layout === void 0 ? void 0 : layout.menuWidth,
},
renderMenuElement()
);
return React__namespace.createElement(
ElementType,
tslib.__assign({}, rest, { className: classes }),
React__namespace.createElement(
Row,
null,
(layout === null || layout === void 0 ? void 0 : layout.menuOn) ===
'left' && menuColumn,
React__namespace.createElement(
Column,
{
width:
layout === null || layout === void 0 ? void 0 : layout.panelWidth,
},
renderTabsElement()
),
(layout === null || layout === void 0 ? void 0 : layout.menuOn) ===
'right' && menuColumn
)
);
}
// ----
// Render Horizontal Layout Element
// ----
return React__namespace.createElement(
ElementType,
tslib.__assign({}, rest, { className: classes }),
renderMenuElement(),
renderTabsElement()
);
};
Tabs.displayName = 'Tabs';
Tabs.create = reactUiCore.createShorthandFactory(Tabs, function (panels) {
return {
panels: panels,
};
});
Tabs.Panel = TabPanel;
module.exports = Tabs;