123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- /* @flow */
-
- import React, { Component } from 'react';
- import { connect } from 'react-redux';
-
- import { setToolbarHovered } from '../actions';
- import ToolbarButton from './ToolbarButton';
-
- /**
- * Implements a toolbar in React/Web. It is a strip that contains a set of
- * toolbar items such as buttons. Toolbar is commonly placed inside of a
- * Toolbox.
- *
- * @class Toolbar
- * @extends Component
- */
- class Toolbar extends Component {
- _renderToolbarButton: Function;
-
- /**
- * Base toolbar component's property types.
- *
- * @static
- */
- static propTypes = {
-
- /**
- * Handler for mouse out event.
- */
- _onMouseOut: React.PropTypes.func,
-
- /**
- * Handler for mouse over event.
- */
- _onMouseOver: React.PropTypes.func,
-
- /**
- * Children of current React component.
- */
- children: React.PropTypes.element,
-
- /**
- * Toolbar's class name.
- */
- className: React.PropTypes.string,
-
- /**
- * If the toolbar requires splitter this property defines splitter
- * index.
- */
- splitterIndex: React.PropTypes.number,
-
- /**
- * Map with toolbar buttons.
- */
- toolbarButtons: React.PropTypes.instanceOf(Map),
-
- /**
- * Indicates the position of the tooltip.
- */
- tooltipPosition:
- React.PropTypes.oneOf([ 'bottom', 'left', 'right', 'top' ])
- };
-
- /**
- * Constructor of Primary toolbar class.
- *
- * @param {Object} props - Object containing React component properties.
- */
- constructor(props) {
- super(props);
-
- // Bind callbacks to preverse this.
- this._renderToolbarButton = this._renderToolbarButton.bind(this);
- }
-
- /**
- * Implements React's {@link Component#render()}.
- *
- * @inheritdoc
- * @returns {ReactElement}
- */
- render(): ReactElement<*> {
- const { className } = this.props;
-
- return (
- <div
- className = { `toolbar ${className}` }
- onMouseOut = { this.props._onMouseOut }
- onMouseOver = { this.props._onMouseOver }>
- {
- [ ...this.props.toolbarButtons.entries() ]
- .reduce(this._renderToolbarButton, [])
- }
- {
- this.props.children
- }
- </div>
- );
- }
-
- /**
- * Renders toolbar button. Method is passed to reduce function.
- *
- * @param {Array} acc - Toolbar buttons array.
- * @param {Array} keyValuePair - Key value pair containing button and its
- * key.
- * @param {number} index - Index of the key value pair in the array.
- * @private
- * @returns {Array} Array of toolbar buttons and splitter if it's on.
- */
- _renderToolbarButton(acc: Array<*>, keyValuePair: Array<*>,
- index: number): Array<ReactElement<*>> {
- const [ key, button ] = keyValuePair;
-
- if (button.component) {
- acc.push(
- <button.component
- key = { key }
- tooltipPosition = { this.props.tooltipPosition } />
- );
-
- return acc;
- }
-
- const { splitterIndex, tooltipPosition } = this.props;
-
- if (splitterIndex && index === splitterIndex) {
- const splitter = <span className = 'toolbar__splitter' />;
-
- acc.push(splitter);
- }
-
- const { onClick, onMount, onUnmount } = button;
-
- acc.push(
- <ToolbarButton
- button = { button }
- key = { key }
- onClick = { onClick }
- onMount = { onMount }
- onUnmount = { onUnmount }
- tooltipPosition = { tooltipPosition } />
- );
-
- return acc;
- }
- }
-
- /**
- * Maps part of Redux actions to component's props.
- *
- * @param {Function} dispatch - Redux action dispatcher.
- * @private
- * @returns {Object}
- */
- function _mapDispatchToProps(dispatch: Function): Object {
- return {
- /**
- * Dispatches an action signalling that toolbar is no being hovered.
- *
- * @protected
- * @returns {Object} Dispatched action.
- */
- _onMouseOut() {
- return dispatch(setToolbarHovered(false));
- },
-
- /**
- * Dispatches an action signalling that toolbar is now being hovered.
- *
- * @protected
- * @returns {Object} Dispatched action.
- */
- _onMouseOver() {
- return dispatch(setToolbarHovered(true));
- }
- };
- }
-
- export default connect(undefined, _mapDispatchToProps)(Toolbar);
|