basic/VisibilityField.js
- /**
- * Created by pposel on 08/05/2017.
- */
-
- import PropTypes from 'prop-types';
-
- import React, { Component } from 'react';
- import VisibilityIcon from './VisibilityIcon';
- import Popup from './Popup';
- import consts from '../../utils/consts';
-
- /**
- * VisibilityField - allowing the user to choose visibilities for resources by showing the visibility icon and clicking on it to switch.
- *
- * The component accepts a callback function to be called with the current visibility on change.
- *
- * ## Access
- * `Stage.Basic.VisibilityField`
- *
- * ## Usage
- * ```
- * <VisibilityField visibility={CURRENT_AVAILABILITY} onVisibilityChange={(newVisibility) => IMPLEMENT_LOGIC_HERE} disallowGlobal={true} className={ANY_CLASS_NAME}/>
- * ```
- */
- export default class VisibilityField extends Component {
- /**
- * order of visibilities when changing visibility
- */
- static visibilitiesOrder = [
- consts.visibility.TENANT.name,
- consts.visibility.PRIVATE.name,
- consts.visibility.GLOBAL.name
- ];
-
- /**
- * @property {string} [visibility='unkown'] the current visibility, one from ['tenant', 'private', 'global'].
- * @property {Function} [onVisibilityChange=()=>{}] the callback to be called with the new visibility
- * @property {bool} [disallowGlobal=false] should the component not allow changing the global
- * @property {bool} [allowChange=true] should the component allow changing visibility
- * @property {string} [className=''] Name of the style class to be added
- */
- static propTypes = {
- visibility: PropTypes.oneOf([
- consts.visibility.PRIVATE.name,
- consts.visibility.TENANT.name,
- consts.visibility.GLOBAL.name,
- consts.visibility.UNKNOWN.name
- ]),
- onVisibilityChange: PropTypes.func,
- disallowGlobal: PropTypes.bool,
- allowChange: PropTypes.bool,
- className: PropTypes.string
- };
-
- static defaultProps = {
- visibility: consts.visibility.UNKNOWN.name,
- onVisibilityChange: () => {},
- disallowGlobal: false,
- allowChange: true,
- className: ''
- };
-
- static visibilityTitle = _.reduce(
- consts.visibility,
- (result, visibilityObject) => {
- result[visibilityObject.name] = visibilityObject.title;
- return result;
- },
- {}
- );
-
- onClick() {
- const visibilities = this.props.disallowGlobal
- ? _.dropRight(VisibilityField.visibilitiesOrder)
- : VisibilityField.visibilitiesOrder;
- const index = visibilities.indexOf(this.props.visibility);
- if (index >= 0 && index < visibilities.length - 1) {
- this.props.onVisibilityChange(visibilities[index + 1]);
- } else {
- this.props.onVisibilityChange(visibilities[0]);
- }
- }
-
- render() {
- return (
- <Popup>
- <Popup.Trigger>
- <VisibilityIcon
- visibility={this.props.visibility}
- link={this.props.allowChange}
- disabled={!this.props.allowChange}
- showTitle={false}
- title={null}
- className={this.props.className}
- onClick={this.onClick.bind(this)}
- />
- </Popup.Trigger>
- <Popup.Header>Visibility</Popup.Header>
- <Popup.Content>{VisibilityField.visibilityTitle[this.props.visibility]}</Popup.Content>
- </Popup>
- );
- }
- }