Preview: http://dashboards.webkom.co/react/airframe
This commit is contained in:
Tomasz Owczarczyk
2019-08-15 00:54:44 +02:00
parent f975443095
commit 37092d1d6c
626 changed files with 56691 additions and 0 deletions

View File

@@ -0,0 +1,52 @@
import React from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import { UncontrolledDropdown } from 'reactstrap';
import { Provider } from './context';
export class NestedDropdown extends React.Component {
constructor(props) {
super(props);
this.state = {
openId: null
}
}
handleOpen(targetId) {
this.setState({
openId: targetId
});
}
render() {
const { tag: Tag, className, children, ...otherProps } = this.props;
const dropdownClass = classNames(className, 'nested-dropdown');
return (
<Tag { ...otherProps } className={ dropdownClass } >
<Provider
value={{
openId: this.state.openId,
onOpen: this.handleOpen.bind(this)
}}
>
{ children }
</Provider>
</Tag>
);
}
}
NestedDropdown.propTypes = {
tag: PropTypes.oneOfType([
PropTypes.string,
PropTypes.func
]),
className: PropTypes.string,
children: PropTypes.node
};
NestedDropdown.defaultProps = {
tag: UncontrolledDropdown
};

View File

@@ -0,0 +1,82 @@
import React from 'react';
import classNames from 'classnames';
import PropTypes from 'prop-types';
import uuid from 'uuid/v4';
import { Consumer } from './context';
class NestedDropdownSubmenu extends React.Component {
componentDidMount() {
this.id = uuid();
}
render() {
const {
tag: Tag,
subMenuTag: SubMenuTag,
title,
children,
className,
openId,
onOpen
} = this.props;
const itemClass = classNames(className, 'nested-dropdown__submenu-item', {
'nested-dropdown__submenu-item--open': openId === this.id
});
const linkClass = classNames('nested-dropdown__submenu-item__link', 'dropdown-item');
return (
<Tag className={ itemClass }>
<a
href="javascript:;"
className={ linkClass }
onClick={ () => { onOpen(this.id) } }
>
{ title }
</a>
<div className="nested-dropdown__submenu-item__menu-wrap">
<SubMenuTag className="nested-dropdown__submenu-item__menu dropdown-menu">
{ children }
</SubMenuTag>
</div>
</Tag>
);
}
}
NestedDropdownSubmenu.propTypes = {
children: PropTypes.node,
title: PropTypes.oneOfType([
PropTypes.string,
PropTypes.node
]),
tag: PropTypes.oneOfType([
PropTypes.string,
PropTypes.func
]),
subMenuTag: PropTypes.oneOfType([
PropTypes.string,
PropTypes.func
]),
className: PropTypes.string,
// Context Provided:
openId: PropTypes.string,
onOpen: PropTypes.func.isRequired
};
NestedDropdownSubmenu.defaultProps = {
tag: "div",
subMenuTag: "div"
};
const ContextNestedDropdownSubmenu = (props) => (
<Consumer>
{
(contextProps) => (
<NestedDropdownSubmenu { ...contextProps } { ...props } />
)
}
</Consumer>
);
export {
ContextNestedDropdownSubmenu as NestedDropdownSubmenu
};

View File

@@ -0,0 +1,8 @@
import React from 'react';
const { Consumer, Provider } = React.createContext();
export {
Consumer,
Provider
};

View File

@@ -0,0 +1,6 @@
import { NestedDropdown } from './NestedDropdown';
import { NestedDropdownSubmenu } from './NestedDropdownSubmenu';
NestedDropdown.Submenu = NestedDropdownSubmenu;
export default NestedDropdown;