Panel.js 13.6 KB
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("core-js/modules/es7.symbol.async-iterator");

require("core-js/modules/es6.symbol");

require("core-js/modules/es6.array.is-array");

require("core-js/modules/es6.object.define-property");

require("core-js/modules/es6.object.create");

require("core-js/modules/es6.object.set-prototype-of");

require("core-js/modules/es6.array.map");

require("core-js/modules/es6.array.filter");

require("core-js/modules/es7.object.entries");

require("core-js/modules/es6.regexp.search");

require("core-js/modules/es6.regexp.replace");

require("core-js/modules/es6.function.name");

require("core-js/modules/es6.array.iterator");

require("core-js/modules/es6.object.keys");

require("core-js/modules/web.dom.iterable");

require("core-js/modules/es6.array.for-each");

var _react = _interopRequireWildcard(require("react"));

var _propTypes = _interopRequireDefault(require("prop-types"));

var _qs = _interopRequireDefault(require("qs"));

var _global = require("global");

var _styled = _interopRequireDefault(require("@emotion/styled"));

var _copyToClipboard = _interopRequireDefault(require("copy-to-clipboard"));

var _components = require("@storybook/components");

var _types = _interopRequireDefault(require("./types"));

var _PropForm = _interopRequireDefault(require("./PropForm"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }

function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }

function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }

var getTimestamp = function getTimestamp() {
  return +new Date();
};

var DEFAULT_GROUP_ID = 'ALL';
var PanelWrapper =
/*#__PURE__*/
(0, _styled.default)("div", {
  target: "e1hohnps0"
})({
  height: '100%',
  overflow: 'auto',
  width: '100%'
});

var Panel =
/*#__PURE__*/
function (_PureComponent) {
  _inherits(Panel, _PureComponent);

  function Panel(props) {
    var _this;

    _classCallCheck(this, Panel);

    _this = _possibleConstructorReturn(this, _getPrototypeOf(Panel).call(this, props));

    _defineProperty(_assertThisInitialized(_assertThisInitialized(_this)), "setOptions", function () {
      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
        timestamps: false
      };
      _this.options = options;
    });

    _defineProperty(_assertThisInitialized(_assertThisInitialized(_this)), "setKnobs", function (_ref) {
      var knobs = _ref.knobs,
          timestamp = _ref.timestamp;
      var queryParams = {};
      var _this$props = _this.props,
          api = _this$props.api,
          channel = _this$props.channel;

      if (!_this.options.timestamps || !timestamp || _this.lastEdit <= timestamp) {
        Object.keys(knobs).forEach(function (name) {
          var knob = knobs[name]; // For the first time, get values from the URL and set them.

          if (!_this.loadedFromUrl) {
            var urlValue = api.getQueryParam("knob-".concat(name));

            if (urlValue !== undefined) {
              // If the knob value present in url
              knob.value = _types.default[knob.type].deserialize(urlValue);
              channel.emit('addon:knobs:knobChange', knob);
            }
          } // set all knobsquery params to be deleted from URL


          queryParams["knob-".concat(name)] = null;
        });
        api.setQueryParams(queryParams);

        _this.setState({
          knobs: knobs
        });

        _this.loadedFromUrl = true;
      }
    });

    _defineProperty(_assertThisInitialized(_assertThisInitialized(_this)), "reset", function () {
      var channel = _this.props.channel;
      channel.emit('addon:knobs:reset');
    });

    _defineProperty(_assertThisInitialized(_assertThisInitialized(_this)), "copy", function () {
      var location = _global.document.location;

      var query = _qs.default.parse(location.search.replace('?', ''));

      var knobs = _this.state.knobs;
      Object.entries(knobs).forEach(function (_ref2) {
        var _ref3 = _slicedToArray(_ref2, 2),
            name = _ref3[0],
            knob = _ref3[1];

        query["knob-".concat(name)] = _types.default[knob.type].serialize(knob.value);
      });
      (0, _copyToClipboard.default)("".concat(location.origin + location.pathname, "?").concat(_qs.default.stringify(query))); // TODO: show some notification of this
    });

    _defineProperty(_assertThisInitialized(_assertThisInitialized(_this)), "emitChange", function (changedKnob) {
      var channel = _this.props.channel;
      channel.emit('addon:knobs:knobChange', changedKnob);
    });

    _defineProperty(_assertThisInitialized(_assertThisInitialized(_this)), "handleChange", function (changedKnob) {
      _this.lastEdit = getTimestamp();
      var knobs = _this.state.knobs;
      var name = changedKnob.name;

      var newKnobs = _objectSpread({}, knobs);

      newKnobs[name] = _objectSpread({}, newKnobs[name], changedKnob);

      _this.setState({
        knobs: newKnobs
      }, _this.emitChange(changedKnob));
    });

    _defineProperty(_assertThisInitialized(_assertThisInitialized(_this)), "handleClick", function (knob) {
      var channel = _this.props.channel;
      channel.emit('addon:knobs:knobClick', knob);
    });

    _this.state = {
      knobs: {}
    };
    _this.options = {};
    _this.lastEdit = getTimestamp();
    _this.loadedFromUrl = false;
    return _this;
  }

  _createClass(Panel, [{
    key: "componentDidMount",
    value: function componentDidMount() {
      var _this2 = this;

      var _this$props2 = this.props,
          channel = _this$props2.channel,
          api = _this$props2.api;
      channel.on('addon:knobs:setKnobs', this.setKnobs);
      channel.on('addon:knobs:setOptions', this.setOptions);
      this.stopListeningOnStory = api.onStory(function () {
        _this2.setState({
          knobs: {}
        });

        channel.emit('addon:knobs:reset');
      });
    }
  }, {
    key: "componentWillUnmount",
    value: function componentWillUnmount() {
      var channel = this.props.channel;
      channel.removeListener('addon:knobs:setKnobs', this.setKnobs);
      this.stopListeningOnStory();
    }
  }, {
    key: "render",
    value: function render() {
      var _this3 = this;

      var knobs = this.state.knobs;
      var active = this.props.active;

      if (!active) {
        return null;
      }

      var groups = {};
      var groupIds = [];
      var knobKeysArray = Object.keys(knobs).filter(function (key) {
        return knobs[key].used;
      });
      knobKeysArray.filter(function (key) {
        return knobs[key].groupId;
      }).forEach(function (key) {
        var knobKeyGroupId = knobs[key].groupId;
        groupIds.push(knobKeyGroupId);
        groups[knobKeyGroupId] = {
          render: function render(_ref4) {
            var groupActive = _ref4.active,
                selected = _ref4.selected;
            return _react.default.createElement(_components.TabWrapper, {
              active: groupActive || selected === DEFAULT_GROUP_ID
            }, _react.default.createElement(_PropForm.default // false positive
            // eslint-disable-next-line no-use-before-define
            , {
              knobs: knobsArray.filter(function (knob) {
                return knob.groupId === knobKeyGroupId;
              }),
              onFieldChange: _this3.handleChange,
              onFieldClick: _this3.handleClick
            }));
          },
          title: knobKeyGroupId
        };
      });
      groups[DEFAULT_GROUP_ID] = {
        render: function render(_ref5) {
          var groupActive = _ref5.active;
          // false positive
          // eslint-disable-next-line no-use-before-define
          var defaultKnobs = knobsArray.filter(function (knob) {
            return !knob.groupId || knob.groupId === DEFAULT_GROUP_ID;
          });

          if (defaultKnobs.length === 0) {
            return null;
          }

          return _react.default.createElement(_components.TabWrapper, {
            active: groupActive
          }, _react.default.createElement(_PropForm.default, {
            knobs: defaultKnobs,
            onFieldChange: _this3.handleChange,
            onFieldClick: _this3.handleClick
          }));
        },
        title: DEFAULT_GROUP_ID
      };
      var knobsArray = knobKeysArray.map(function (key) {
        return knobs[key];
      });

      if (knobsArray.length === 0) {
        return _react.default.createElement(_components.Placeholder, null, "NO KNOBS");
      }

      return _react.default.createElement(PanelWrapper, null, groupIds.length > 0 ? _react.default.createElement(_components.TabsState, null, Object.entries(groups).map(function (_ref6) {
        var _ref7 = _slicedToArray(_ref6, 2),
            k = _ref7[0],
            v = _ref7[1];

        return _react.default.createElement("div", {
          id: k,
          key: k,
          title: v.title
        }, v.render);
      })) : _react.default.createElement(_PropForm.default, {
        knobs: knobsArray,
        onFieldChange: this.handleChange,
        onFieldClick: this.handleClick
      }), _react.default.createElement(_components.ActionBar, null, _react.default.createElement(_components.ActionButton, {
        onClick: this.copy
      }, "COPY"), _react.default.createElement(_components.ActionButton, {
        onClick: this.reset
      }, "RESET")));
    }
  }]);

  return Panel;
}(_react.PureComponent);

exports.default = Panel;
Panel.propTypes = {
  active: _propTypes.default.bool.isRequired,
  onReset: _propTypes.default.object,
  // eslint-disable-line
  channel: _propTypes.default.shape({
    emit: _propTypes.default.func,
    on: _propTypes.default.func,
    removeListener: _propTypes.default.func
  }).isRequired,
  api: _propTypes.default.shape({
    onStory: _propTypes.default.func,
    getQueryParam: _propTypes.default.func,
    setQueryParams: _propTypes.default.func
  }).isRequired
};