Manual Reference Source

basic/VisibilityField.js

  1. /**
  2. * Created by pposel on 08/05/2017.
  3. */
  4.  
  5. import PropTypes from 'prop-types';
  6.  
  7. import React, { Component } from 'react';
  8. import VisibilityIcon from './VisibilityIcon';
  9. import Popup from './Popup';
  10. import consts from '../../utils/consts';
  11.  
  12. /**
  13. * VisibilityField - allowing the user to choose visibilities for resources by showing the visibility icon and clicking on it to switch.
  14. *
  15. * The component accepts a callback function to be called with the current visibility on change.
  16. *
  17. * ## Access
  18. * `Stage.Basic.VisibilityField`
  19. *
  20. * ## Usage
  21. * ```
  22. * <VisibilityField visibility={CURRENT_AVAILABILITY} onVisibilityChange={(newVisibility) => IMPLEMENT_LOGIC_HERE} disallowGlobal={true} className={ANY_CLASS_NAME}/>
  23. * ```
  24. */
  25. export default class VisibilityField extends Component {
  26. /**
  27. * order of visibilities when changing visibility
  28. */
  29. static visibilitiesOrder = [
  30. consts.visibility.TENANT.name,
  31. consts.visibility.PRIVATE.name,
  32. consts.visibility.GLOBAL.name
  33. ];
  34.  
  35. /**
  36. * @property {string} [visibility='unkown'] the current visibility, one from ['tenant', 'private', 'global'].
  37. * @property {Function} [onVisibilityChange=()=>{}] the callback to be called with the new visibility
  38. * @property {bool} [disallowGlobal=false] should the component not allow changing the global
  39. * @property {bool} [allowChange=true] should the component allow changing visibility
  40. * @property {string} [className=''] Name of the style class to be added
  41. */
  42. static propTypes = {
  43. visibility: PropTypes.oneOf([
  44. consts.visibility.PRIVATE.name,
  45. consts.visibility.TENANT.name,
  46. consts.visibility.GLOBAL.name,
  47. consts.visibility.UNKNOWN.name
  48. ]),
  49. onVisibilityChange: PropTypes.func,
  50. disallowGlobal: PropTypes.bool,
  51. allowChange: PropTypes.bool,
  52. className: PropTypes.string
  53. };
  54.  
  55. static defaultProps = {
  56. visibility: consts.visibility.UNKNOWN.name,
  57. onVisibilityChange: () => {},
  58. disallowGlobal: false,
  59. allowChange: true,
  60. className: ''
  61. };
  62.  
  63. static visibilityTitle = _.reduce(
  64. consts.visibility,
  65. (result, visibilityObject) => {
  66. result[visibilityObject.name] = visibilityObject.title;
  67. return result;
  68. },
  69. {}
  70. );
  71.  
  72. onClick() {
  73. const visibilities = this.props.disallowGlobal
  74. ? _.dropRight(VisibilityField.visibilitiesOrder)
  75. : VisibilityField.visibilitiesOrder;
  76. const index = visibilities.indexOf(this.props.visibility);
  77. if (index >= 0 && index < visibilities.length - 1) {
  78. this.props.onVisibilityChange(visibilities[index + 1]);
  79. } else {
  80. this.props.onVisibilityChange(visibilities[0]);
  81. }
  82. }
  83.  
  84. render() {
  85. return (
  86. <Popup>
  87. <Popup.Trigger>
  88. <VisibilityIcon
  89. visibility={this.props.visibility}
  90. link={this.props.allowChange}
  91. disabled={!this.props.allowChange}
  92. showTitle={false}
  93. title={null}
  94. className={this.props.className}
  95. onClick={this.onClick.bind(this)}
  96. />
  97. </Popup.Trigger>
  98. <Popup.Header>Visibility</Popup.Header>
  99. <Popup.Content>{VisibilityField.visibilityTitle[this.props.visibility]}</Popup.Content>
  100. </Popup>
  101. );
  102. }
  103. }