UNPKG

@talend/react-components

Version:
416 lines (415 loc) 13.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SubtitleComponent = SubtitleComponent; exports.cancelActionComponent = cancelActionComponent; exports.combinedFooterActions = combinedFooterActions; exports.default = void 0; exports.subtitleComponent = subtitleComponent; var _react = require("react"); var _reactTransitionGroup = require("react-transition-group"); var _classnames = _interopRequireDefault(require("classnames")); var _propTypes = _interopRequireDefault(require("prop-types")); var _designSystem = require("@talend/design-system"); var _utils = require("@talend/utils"); var _ActionBar = _interopRequireDefault(require("../ActionBar")); var _Action = _interopRequireDefault(require("../Actions/Action")); var _EditableText = _interopRequireDefault(require("../EditableText")); var _Inject = _interopRequireDefault(require("../Inject")); var _TabBar = _interopRequireDefault(require("../TabBar")); var _theme = require("../theme"); var _DrawerModule = _interopRequireDefault(require("./Drawer.module.scss")); var _lodash = require("lodash"); var _jsxRuntime = require("react/jsx-runtime"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const css = (0, _theme.getTheme)(_DrawerModule.default); const DEFAULT_TRANSITION_DURATION = 350; const STYLES = { entering: { transform: 'translateX(0%)' }, entered: { transform: 'translateX(0%)' }, exiting: { transform: 'translateX(100%)' }, exited: { transform: 'translateX(100%)' } }; function DrawerAnimation(props) { const { children, withTransition, ...rest } = props; const timeout = withTransition ? DEFAULT_TRANSITION_DURATION : 0; return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactTransitionGroup.Transition, { in: true, appear: true, timeout: withTransition ? 500 : 0, ...rest, children: transitionState => { const style = { transition: `transform ${timeout}ms ease-in-out`, transform: 'translateX(100%)', ...STYLES[transitionState] }; return children({ style, transitioned: transitionState === 'entered', transitionState }); } }); } DrawerAnimation.propTypes = { children: _propTypes.default.func, withTransition: _propTypes.default.bool, onTransitionComplete: _propTypes.default.func }; DrawerAnimation.defaultProps = { withTransition: true, onTransitionComplete: () => {} }; function DrawerContainer({ drawerId, stacked, className, children, withTransition = true, ...rest }) { const drawerContainerClasses = css(className, 'tc-drawer', { 'tc-drawer-transition': withTransition }, { [_DrawerModule.default['drawer-stacked']]: stacked, stacked }); return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", { className: drawerContainerClasses, role: "dialog", "aria-labelledby": drawerId, ...rest, children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", { className: (0, _classnames.default)('tc-drawer-container', _DrawerModule.default['tc-drawer-container']), children: children }) }); } DrawerContainer.propTypes = { drawerId: _propTypes.default.string, stacked: _propTypes.default.bool, withTransition: _propTypes.default.bool, className: _propTypes.default.string, children: _propTypes.default.node.isRequired }; function cancelActionComponent(onCancelAction, getComponent) { if (!onCancelAction) { return null; } const ActionComponent = _Inject.default.get(getComponent, 'Action', _Action.default); const enhancedCancelAction = { icon: 'talend-cross', hideLabel: true, link: true, ...onCancelAction }; return /*#__PURE__*/(0, _jsxRuntime.jsx)(ActionComponent, { ...enhancedCancelAction, className: css('tc-drawer-close-action', enhancedCancelAction.className), tooltipClassName: _DrawerModule.default['drawer-close-action-tooltip'] }); } function renderSubtitleTag(subtitleTagLabel, subtitleTagTooltip, subtitleTagVariant = 'default') { if (subtitleTagTooltip) { return /*#__PURE__*/(0, _jsxRuntime.jsx)(_designSystem.Tooltip, { placement: "top", title: subtitleTagTooltip, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_designSystem.Tag, { variant: subtitleTagVariant, children: subtitleTagLabel }) }); } return /*#__PURE__*/(0, _jsxRuntime.jsx)(_designSystem.Tag, { children: subtitleTagLabel }); } function SubtitleComponent({ subtitle, ...rest }) { if (!subtitle || !subtitle.length) { return null; } const { subtitleTag } = rest; return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", { className: css('tc-drawer-header-subtitle'), children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_designSystem.StackHorizontal, { gap: "XS", align: "center", children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h2", { title: subtitle, children: subtitle }), subtitleTag && subtitleTag.label && renderSubtitleTag(subtitleTag.label, subtitleTag.tooltip, subtitleTag.variant)] }) }); } SubtitleComponent.propTypes = { subtitle: _propTypes.default.string, subtitleTag: _propTypes.default.shape({ label: _propTypes.default.string, tooltip: _propTypes.default.string, variant: _propTypes.default.oneOf(_designSystem.TagVariantsNames) }) }; function subtitleComponent(subtitle) { // backward compatibility return /*#__PURE__*/(0, _jsxRuntime.jsx)(SubtitleComponent, { subtitle: subtitle }); } function DrawerTitle({ title, subtitle, drawerId, children, onCancelAction, getComponent, editable, inProgress, subtitleTag, onEdit, onSubmit, onCancel, renderTitleActions = _lodash.noop, ...props }) { const [isEditMode, setIsEditMode] = (0, _react.useState)(false); function handleEdit(...args) { setIsEditMode(true); if (onEdit) { onEdit(...args); } } function handleCancel(...args) { setIsEditMode(false); if (onCancel) { onCancel(...args); } } function handleSubmit(...args) { setIsEditMode(false); if (onSubmit) { onSubmit(...args); } } if (!title && !children) { return null; } const InjectedEditableText = _Inject.default.get(getComponent, 'EditableText', _EditableText.default); return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", { className: css('tc-drawer-header'), children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", { className: css('tc-drawer-header-menu'), children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", { className: css('tc-drawer-header-title'), children: [!editable ? /*#__PURE__*/(0, _jsxRuntime.jsx)("h1", { id: drawerId, title: title, children: title }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(InjectedEditableText, { id: drawerId, text: title, inProgress: inProgress, feature: "drawertitle.rename", componentClass: "h1", onEdit: handleEdit, onCancel: handleCancel, onSubmit: handleSubmit, editMode: isEditMode, ...props }), !isEditMode ? /*#__PURE__*/(0, _jsxRuntime.jsx)(SubtitleComponent, { subtitle: subtitle, subtitleTag: subtitleTag }) : null] }), renderTitleActions(), cancelActionComponent(onCancelAction, getComponent)] }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", { className: css('tc-drawer-header-with-tabs'), children: children })] }); } DrawerTitle.propTypes = { drawerId: _propTypes.default.string, title: _propTypes.default.string.isRequired, subtitle: _propTypes.default.string, onCancelAction: _propTypes.default.shape(_Action.default.propTypes), children: _propTypes.default.node, getComponent: _propTypes.default.func, renderTitleActions: _propTypes.default.func, editable: _propTypes.default.bool, inProgress: _propTypes.default.bool, subtitleTag: _propTypes.default.shape({ label: _propTypes.default.string, tooltip: _propTypes.default.string, variant: _propTypes.default.oneOf(_designSystem.TagVariantsNames) }), onEdit: _propTypes.default.func, onSubmit: _propTypes.default.func, onCancel: _propTypes.default.func }; function DrawerContent({ children, className, ...rest }) { return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", { className: css('tc-drawer-content', className), "data-drawer-content": true, ...rest, children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", { className: css('tc-drawer-content-wrapper'), children: children }) }); } DrawerContent.propTypes = { children: _propTypes.default.node, className: _propTypes.default.string }; function DrawerFooter({ children }) { return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", { className: css('tc-drawer-footer'), children: children }); } DrawerFooter.propTypes = { children: _propTypes.default.node }; function combinedFooterActions(onCancelAction, footerActions, activeTabItem = {}) { const enhancedFooterActions = { ...(0, _lodash.omit)(footerActions, 'actions') }; enhancedFooterActions.actions = {}; ['left', 'center', 'right'].forEach(item => { enhancedFooterActions.actions[item] = [...(0, _lodash.get)(footerActions, `actions.${item}`, []), ...(0, _lodash.get)(activeTabItem, `actions.${item}`, [])]; }); if (onCancelAction && !onCancelAction.hideInFooter) { enhancedFooterActions.actions.left.unshift(onCancelAction); } return enhancedFooterActions; } function Drawer({ stacked, title, className, style, children, footerActions, onCancelAction, tabs, withTransition, getComponent, selectedTabKey, editableTitle, renderTitleActions }) { const [drawerId] = (0, _react.useState)((0, _utils.randomUUID)()); if (!children) { return null; } const TabBarComponent = _Inject.default.get(getComponent, 'TabBar', _TabBar.default); let activeTab = {}; let activeTabItem = []; let customTabs; if (tabs && tabs.items.length > 0) { customTabs = { ...tabs, items: tabs.items && tabs.items.map(({ footerActions: _, ...item }) => item) }; if (selectedTabKey) { customTabs.selectedKey = selectedTabKey; activeTab = tabs.items.find(tab => tab.key === selectedTabKey); } activeTabItem = (0, _lodash.get)(activeTab, 'footerActions', {}); } const combinedFooterProps = combinedFooterActions(onCancelAction, footerActions, activeTabItem); const displayFooter = Object.values(combinedFooterProps.actions).some(footerAction => !!footerAction.length); return /*#__PURE__*/(0, _jsxRuntime.jsxs)(DrawerContainer, { stacked: stacked, className: className, style: style, drawerId: drawerId, withTransition: withTransition, children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(DrawerTitle, { drawerId: drawerId, renderTitleActions: renderTitleActions, editable: editableTitle, title: title, onCancelAction: onCancelAction, getComponent: getComponent }), tabs && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", { className: css('tc-drawer-tabs-container'), children: /*#__PURE__*/(0, _jsxRuntime.jsx)(TabBarComponent, { ...customTabs, className: css('tc-drawer-tabs') }) }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", { style: { display: 'flex', flexDirection: 'column', flexGrow: 1, overflow: 'hidden' }, children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(DrawerContent, { children: children }), displayFooter && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", { className: css('tc-drawer-actionbar-container'), children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ActionBar.default, { ...combinedFooterProps, className: css('tc-drawer-actionbar') }) })] })] }); } Drawer.displayName = 'Drawer'; Drawer.propTypes = { stacked: _propTypes.default.bool, title: _propTypes.default.string, editableTitle: _propTypes.default.bool, children: _propTypes.default.node, style: _propTypes.default.object, // eslint-disable-line react/forbid-prop-types className: _propTypes.default.string, // footer action, see action bar for api footerActions: _propTypes.default.shape(_ActionBar.default.propTypes), onCancelAction: _propTypes.default.shape(_Action.default.propTypes), tabs: _propTypes.default.shape(_TabBar.default.propTypes), withTransition: _propTypes.default.bool, renderTitleActions: _propTypes.default.func, getComponent: _propTypes.default.func, selectedTabKey: _propTypes.default.string }; Drawer.defaultProps = { withTransition: true }; Drawer.Animation = DrawerAnimation; Drawer.Container = DrawerContainer; Drawer.Title = DrawerTitle; Drawer.Content = DrawerContent; Drawer.Footer = DrawerFooter; Drawer.FooterStyle = _DrawerModule.default['tc-drawer-footer']; var _default = exports.default = Drawer; //# sourceMappingURL=Drawer.component.js.map