"use strict";

exports.__esModule = true;
exports["default"] = void 0;
var _react = _interopRequireDefault(require("react"));
var _teselagenReactComponents = require("teselagen-react-components");
var _redux = require("redux");
var _core = require("@blueprintjs/core");
var _classnames = _interopRequireDefault(require("classnames"));
var _withEditorProps = _interopRequireDefault(require("../../withEditorProps"));
var _EnzymeViewer = _interopRequireDefault(require("../../EnzymeViewer"));
require("./style.css");
var _lodash = require("lodash");
var _sequenceUtils = require("@teselagen/sequence-utils");
var _reactEasyState = require("@risingstack/react-easy-state");
var _GlobalDialogUtils = require("../../GlobalDialogUtils");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == typeof value && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, "_invoke", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) { if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; } return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) { keys.push(key); } return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) { "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); } }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, "catch": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
var upsertLocalEnzymeGroups = function upsertLocalEnzymeGroups(newGroups) {
  var existingGroups = window.getExistingEnzymeGroups();
  var toUpsert = (0, _lodash.omitBy)( //delete any groups that have a value of null/undefined
  _extends({}, existingGroups, newGroups), function (val) {
    return !val;
  });
  localStorage.setItem("enzymeGroups", JSON.stringify(toUpsert));
};
window.createNewEnzymeGroup = window.createNewEnzymeGroup || function (newName) {
  var _upsertLocalEnzymeGro;
  return upsertLocalEnzymeGroups((_upsertLocalEnzymeGro = {}, _upsertLocalEnzymeGro[newName] = [], _upsertLocalEnzymeGro));
};
window.editEnzymeGroupName = window.editEnzymeGroupName || function (oldName, newName) {
  var _upsertLocalEnzymeGro2;
  upsertLocalEnzymeGroups((_upsertLocalEnzymeGro2 = {}, _upsertLocalEnzymeGro2[newName] = window.getExistingEnzymeGroups()[oldName], _upsertLocalEnzymeGro2));
  window.deleteEnzymeGroup(oldName);
};
window.deleteEnzymeGroup = window.deleteEnzymeGroup || function (nameToDelete) {
  var _upsertLocalEnzymeGro3;
  return upsertLocalEnzymeGroups((_upsertLocalEnzymeGro3 = {}, _upsertLocalEnzymeGro3[nameToDelete] = null, _upsertLocalEnzymeGro3));
};
window.updateEnzymeGroup = window.updateEnzymeGroup || function (groupName, enzymes) {
  var _upsertLocalEnzymeGro4;
  return upsertLocalEnzymeGroups((_upsertLocalEnzymeGro4 = {}, _upsertLocalEnzymeGro4[groupName] = enzymes, _upsertLocalEnzymeGro4));
};
window.getExistingEnzymeGroups = window.getExistingEnzymeGroups || function () {
  var existingGroups = JSON.parse(localStorage.getItem("enzymeGroups") || "{}");
  if (!Object.keys(existingGroups || {}).length) {
    return {};
  }
  (0, _lodash.map)(existingGroups, function (g, k) {
    if (!g || !g.length) existingGroups[k] = [];
  });
  return existingGroups;
};

// window.getExistingEnzymeGroupsWithEnzymeData = () => {
//   const toRet = {};
//   forEach(window.getExistingEnzymeGroups(), (group, name) => {
//     toRet[name] = flatMap(group, enzymeName => {
//       const enzyme = this.getAllEnzymesByName()[enzymeName.toLowerCase()];
//       if (!enzyme) {
//         console.warn("ruh roh");
//         return [];
//       } else {
//         return enzyme;
//       }
//     });
//   });
//   return toRet;
// };

var easyStore = (0, _reactEasyState.store)({
  hoveredEnzyme: ""
});
var EnzymesDialog = /*#__PURE__*/function (_React$Component) {
  _inheritsLoose(EnzymesDialog, _React$Component);
  function EnzymesDialog() {
    var _this;
    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }
    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;
    _defineProperty(_assertThisInitialized(_this), "state", {
      selectedEnzymeGroup: "My Enzymes",
      searchInput: ""
    });
    _defineProperty(_assertThisInitialized(_this), "getAllEnzymesByName", function () {
      return _extends({}, _this.props.additionalEnzymes, _sequenceUtils.aliasedEnzymesByName);
    });
    _defineProperty(_assertThisInitialized(_this), "refreshEnzymeGroups", function () {
      var _this$props = _this.props,
        sequenceData = _this$props.sequenceData,
        additionalEnzymes = _this$props.additionalEnzymes;
      var existingGroups = window.getExistingEnzymeGroups();
      var orderedExistingGroups = {};
      var groupedEnzymesNameMap = {};
      Object.keys(existingGroups).sort().forEach(function (key) {
        var group = existingGroups[key];
        orderedExistingGroups[key] = group;
        group.forEach(function (name) {
          var lowerName = name.toLowerCase();
          groupedEnzymesNameMap[lowerName] = _sequenceUtils.aliasedEnzymesByName[lowerName] || additionalEnzymes[lowerName];
        });
      });
      var myEnzymes = _extends({}, groupedEnzymesNameMap, additionalEnzymes, _sequenceUtils.defaultEnzymesByName);
      var hiddenEnzymes = (0, _lodash.omitBy)(_sequenceUtils.aliasedEnzymesByName, function (p, i) {
        return myEnzymes[i] || groupedEnzymesNameMap[i];
      });
      _this.enzymeGroups = _extends({
        "My Enzymes": {
          "protected": true,
          name: "我的内切酶",
          enzymes: (0, _lodash.map)(myEnzymes).sort(function (e) {
            return e.name;
          })
        },
        Hidden: {
          "protected": true,
          name: "隐藏",
          tooltipInfo: "这些不太常见的酶在默认情况下是隐藏的。将它们添加到自定义组将使它们显示在过场过滤器下拉列表中.",
          enzymes: (0, _lodash.map)(hiddenEnzymes).sort(function (e) {
            return e.name;
          })
        }
      }, (0, _lodash.reduce)(orderedExistingGroups, function (acc, val, key) {
        acc[key] = {
          name: key,
          enzymes: getEnzymesForNames(val, _this.getAllEnzymesByName())
        };
        return acc;
      }, {}));
      _this.cutsitesByEnzymeName = (0, _sequenceUtils.getCutsitesFromSequence)(sequenceData.sequence, sequenceData.circular, (0, _lodash.map)(_this.getAllEnzymesByName()));
      _this.forceUpdate();
    });
    _defineProperty(_assertThisInitialized(_this), "clearSelection", function () {
      var _this$setState;
      var selectedEnzymeGroup = _this.state.selectedEnzymeGroup;
      var selectedEnzymesKey = "selectedEnzymes_" + selectedEnzymeGroup;
      _this.setState((_this$setState = {}, _this$setState[selectedEnzymesKey] = {}, _this$setState));
    });
    return _this;
  }
  var _proto = EnzymesDialog.prototype;
  _proto.componentDidMount = function componentDidMount() {
    this.refreshEnzymeGroups();
  };
  _proto.render = function render() {
    var _this2 = this;
    var hideModal = this.props.hideModal;
    if (!this.enzymeGroups) return null;
    var _this$state = this.state,
      selectedEnzymeGroup = _this$state.selectedEnzymeGroup,
      searchInput = _this$state.searchInput,
      enzymeGroupToMoveTo = _this$state.enzymeGroupToMoveTo;
    var selectedEnzymesKey = "selectedEnzymes_" + selectedEnzymeGroup;
    var selectedEnzymesForGroup = this.state[selectedEnzymesKey] || {};
    var selectedCount = (0, _lodash.countBy)(selectedEnzymesForGroup, function (e) {
      return e;
    })["true"] || 0;
    var fullSelectedEnzGroup = this.enzymeGroups[selectedEnzymeGroup] || {};
    var enzymeList = (0, _lodash.flatMap)(fullSelectedEnzGroup.enzymes, function (enz, i) {
      var _classNames;
      var name = enz.name + " (" + (_this2.cutsitesByEnzymeName && _this2.cutsitesByEnzymeName[enz.name] && _this2.cutsitesByEnzymeName[enz.name].length || 0) + ")";
      if (searchInput && !name.toLowerCase().includes(searchInput.toLowerCase())) {
        return [];
      }
      return /*#__PURE__*/_react["default"].createElement("div", {
        onMouseOver: function onMouseOver() {
          easyStore.hoveredEnzyme = enz.name;
          clearTimeout(_this2.clearId);
        },
        onMouseLeave: function onMouseLeave() {
          _this2.clearId = setTimeout(function () {
            easyStore.hoveredEnzyme = "";
          }, 100);
        },
        onClick: function onClick() {
          var _extends2, _this2$setState;
          _this2.setState((_this2$setState = {}, _this2$setState[selectedEnzymesKey] = _extends({}, selectedEnzymesForGroup, (_extends2 = {}, _extends2[enz.name] = !selectedEnzymesForGroup[enz.name], _extends2)), _this2$setState));
        },
        className: (0, _classnames["default"])(_core.Classes.MENU_ITEM, "veEnzymeDialogEnzyme", (_classNames = {}, _classNames[_core.Classes.ACTIVE + " " + _core.Classes.INTENT_PRIMARY] = selectedEnzymesForGroup[enz.name], _classNames)),
        key: i
      }, name);
    });
    // const enzymesForGroup =
    return /*#__PURE__*/_react["default"].createElement("div", {
      style: {
        height: 500
      },
      className: (0, _classnames["default"])(_core.Classes.DIALOG_BODY, "tg-min-width-dialog veEnzymeDialog")
    }, /*#__PURE__*/_react["default"].createElement("div", {
      className: "veEnzymeDialogInner",
      style: {
        display: "flex",
        height: "100%"
      }
    }, /*#__PURE__*/_react["default"].createElement("div", {
      className: "veEnzymeDialogEnzymeGroups",
      style: {
        minWidth: 150,
        height: "100%",
        display: "flex",
        flexDirection: "column",
        borderRight: "1px solid lightgrey",
        paddingRight: 5
      }
    }, /*#__PURE__*/_react["default"].createElement("h5", null, "\u5185\u5207\u9176\u5206\u7EC4:"), /*#__PURE__*/_react["default"].createElement("div", {
      style: {
        overflowY: "auto"
      }
    }, (0, _lodash.map)(this.enzymeGroups, function (group, i) {
      var _classNames2;
      return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("div", {
        onClick: function onClick() {
          _this2.setState({
            selectedEnzymeGroup: group.name
          });
        },
        className: (0, _classnames["default"])(_core.Classes.MENU_ITEM, (_classNames2 = {}, _classNames2[_core.Classes.ACTIVE] = selectedEnzymeGroup === group.name, _classNames2)),
        style: {
          marginBottom: 5,
          cursor: "pointer"
        },
        key: i
      }, "\xA0 ", group.name, " \xA0", " ", group.tooltipInfo && /*#__PURE__*/_react["default"].createElement(_teselagenReactComponents.InfoHelper, {
        color: "grey",
        isInline: true,
        content: group.tooltipInfo
      })), group.name === "Hidden" && /*#__PURE__*/_react["default"].createElement("div", {
        className: _core.Classes.MENU_DIVIDER
      }));
    })), /*#__PURE__*/_react["default"].createElement(_core.ButtonGroup, {
      style: {
        width: "fit-content"
      }
    }, /*#__PURE__*/_react["default"].createElement(_core.Tooltip, {
      disabled: window.Cypress,
      position: "bottom",
      content: "\u521B\u5EFA\u5206\u7EC4"
    }, /*#__PURE__*/_react["default"].createElement(_core.Popover, {
      content: /*#__PURE__*/_react["default"].createElement("div", {
        className: "veNewEnzymeGroupPopover",
        style: {
          padding: 10
        }
      }, /*#__PURE__*/_react["default"].createElement("h5", null, "\u521B\u5EFA\u5185\u5207\u9176\u5206\u7EC4"), /*#__PURE__*/_react["default"].createElement("div", {
        style: {
          display: "flex"
        }
      }, /*#__PURE__*/_react["default"].createElement(_core.InputGroup, {
        autoFocus: true,
        className: "veNewEnzymeGroupName"
      }), /*#__PURE__*/_react["default"].createElement(_core.AnchorButton, {
        className: _core.Classes.POPOVER_DISMISS,
        onClick: function onClick() {
          var newName = document.querySelector(".veNewEnzymeGroupName input").value;
          if (!newName) {
            return window.toastr.error("Invalid name");
          }
          if (_this2.enzymeGroups[newName]) {
            window.toastr.error("Choose a different group name");
          } else {
            window.toastr.success("Created New Enzyme Group " + newName);
            window.createNewEnzymeGroup(newName);
            _this2.refreshEnzymeGroups();
            _this2.setState({
              selectedEnzymeGroup: newName
            });
          }
        },
        icon: "tick",
        intent: "success"
      })))
    }, /*#__PURE__*/_react["default"].createElement(_core.AnchorButton, {
      className: "veEnzymeDialogAddGroupBtn",
      minimal: true,
      icon: "add"
    }))), /*#__PURE__*/_react["default"].createElement(_core.Popover, {
      content: /*#__PURE__*/_react["default"].createElement("div", {
        className: "veEditEnzymeGroupPopover",
        style: {
          padding: 10
        }
      }, /*#__PURE__*/_react["default"].createElement("h5", null, "\u7F16\u8F91\u5206\u7EC4\u540D\u79F0"), /*#__PURE__*/_react["default"].createElement("div", {
        style: {
          display: "flex"
        }
      }, /*#__PURE__*/_react["default"].createElement(_core.InputGroup, {
        defaultValue: selectedEnzymeGroup,
        autoFocus: true,
        className: "veEditEnzymeGroupName"
      }), /*#__PURE__*/_react["default"].createElement(_core.AnchorButton, {
        className: _core.Classes.POPOVER_DISMISS,
        onClick: function onClick() {
          var newName = document.querySelector(".veEditEnzymeGroupName input").value;
          if (!newName) {
            return window.toastr.error("Invalid name");
          }
          if (_this2.enzymeGroups[newName]) {
            window.toastr.error("Choose a different group name");
          } else {
            window.toastr.success("Edit Successful");
            window.editEnzymeGroupName(selectedEnzymeGroup, newName);
            _this2.refreshEnzymeGroups();
            _this2.setState({
              selectedEnzymeGroup: newName
            });
          }
        },
        icon: "tick",
        intent: "success"
      })))
    }, /*#__PURE__*/_react["default"].createElement(_core.Tooltip, {
      disabled: window.Cypress,
      position: "bottom",
      content: "\u7F16\u8F91\u5206\u7EC4\u540D\u79F0"
    }, /*#__PURE__*/_react["default"].createElement(_core.AnchorButton, {
      disabled: fullSelectedEnzGroup["protected"],
      minimal: true,
      icon: "edit"
    }))), /*#__PURE__*/_react["default"].createElement(_core.Tooltip, {
      disabled: window.Cypress,
      position: "bottom",
      content: "\u5220\u9664\u5206\u7EC4"
    }, /*#__PURE__*/_react["default"].createElement(_core.AnchorButton, {
      disabled: fullSelectedEnzGroup["protected"],
      onClick: /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
        var confirm;
        return _regeneratorRuntime().wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                _context.next = 2;
                return (0, _teselagenReactComponents.showConfirmationDialog)({
                  text: "Are you sure you want to delete this group, " + selectedEnzymeGroup + "?",
                  intent: _core.Intent.DANGER
                });
              case 2:
                confirm = _context.sent;
                if (confirm) {
                  window.deleteEnzymeGroup(selectedEnzymeGroup);
                  _this2.refreshEnzymeGroups();
                  _this2.setState({
                    selectedEnzymeGroup: "My Enzymes"
                  });
                }
              case 4:
              case "end":
                return _context.stop();
            }
          }
        }, _callee);
      })),
      minimal: true,
      icon: "trash"
    })))), /*#__PURE__*/_react["default"].createElement("div", {
      className: "veEnzymeDialogEnzymes"
    }, /*#__PURE__*/_react["default"].createElement("div", {
      className: "veEnzymeDialogSearch",
      style: {
        width: 250,
        paddingBottom: 5
      }
    }, /*#__PURE__*/_react["default"].createElement(_core.InputGroup, {
      round: true,
      placeholder: "\u641C\u7D22\u540D\u79F0\u6216\u5207\u5272\u7684#",
      onChange: function onChange(e) {
        _this2.setState({
          searchInput: e.target.value
        });
      },
      value: searchInput,
      rightElement: searchInput && /*#__PURE__*/_react["default"].createElement(_core.AnchorButton, {
        icon: "cross",
        minimal: true,
        intent: "danger",
        onClick: function onClick(e) {
          _this2.setState({
            searchInput: ""
          });
          e.stopPropagation();
        }
      }),
      leftIcon: "search"
    })), /*#__PURE__*/_react["default"].createElement("div", {
      style: {
        height: "84%",
        display: "flex",
        flexFlow: "column",
        justifyContent: "space-between"
      }
    }, /*#__PURE__*/_react["default"].createElement("div", {
      className: "veEnzymeDialogEnzymesList",
      style: {
        height: "fit-parent",
        overflowY: "auto",
        display: "flex",
        flexWrap: "wrap",
        maxWidth: "100%"
      }
    }, enzymeList.length ? enzymeList : "Copy enzymes from other groups to your custom group"), /*#__PURE__*/_react["default"].createElement(HoverView, {
      allEnzymesByName: this.getAllEnzymesByName()
    })), /*#__PURE__*/_react["default"].createElement("div", {
      style: {
        display: "flex",
        justifyContent: "space-between"
      }
    }, /*#__PURE__*/_react["default"].createElement(_core.ButtonGroup, null, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(_core.Tooltip, {
      position: "left",
      content: "\u5C06\u9009\u533A\u590D\u5236\u5230\u5176\u4ED6\u7EC4"
    }, /*#__PURE__*/_react["default"].createElement(_core.Popover, {
      canEscapeKeyClose: true,
      disabled: !selectedCount
      // targetClassName={"veEnzymeDialogEnzymeAddIcon"}
      // targetProps={{style: {flex: "0 0 auto"}}}
      // wrapperTagName="div"
      ,
      position: "top",
      content: /*#__PURE__*/_react["default"].createElement(MoveToInner, {
        clearSelection: this.clearSelection,
        refreshEnzymeGroups: this.refreshEnzymeGroups,
        selectedEnzymeGroup: selectedEnzymeGroup,
        enzymeGroupToMoveTo: enzymeGroupToMoveTo,
        selectedCount: selectedCount,
        selectedEnzymesForGroup: selectedEnzymesForGroup,
        enzymeGroups: this.enzymeGroups,
        setStateAbove: function setStateAbove(val) {
          _this2.setState(val);
        }
      }),
      target: /*#__PURE__*/_react["default"].createElement(_core.AnchorButton, {
        className: "veEnzymeGroupAddEnzymesBtn",
        disabled: !selectedCount,
        icon: "duplicate"
      })
    }))), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(_core.Tooltip, {
      disabled: window.Cypress,
      position: "bottom",
      content: "\u79FB\u9664\u5185\u5207\u9176"
    }, /*#__PURE__*/_react["default"].createElement(_core.AnchorButton, {
      className: "veRemoveEnzymeFromGroupBtn",
      onClick: /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
        var confirm, _this2$setState2, enzymes;
        return _regeneratorRuntime().wrap(function _callee2$(_context2) {
          while (1) {
            switch (_context2.prev = _context2.next) {
              case 0:
                _context2.next = 2;
                return (0, _teselagenReactComponents.showConfirmationDialog)({
                  text: "Are you sure you want to remove " + selectedCount + " enzyme(s) from " + selectedEnzymeGroup,
                  intent: _core.Intent.DANGER
                });
              case 2:
                confirm = _context2.sent;
                if (confirm) {
                  enzymes = (0, _lodash.flatMap)(fullSelectedEnzGroup.enzymes, function (e) {
                    return selectedEnzymesForGroup[e.name] ? [] : e.name;
                  });
                  window.updateEnzymeGroup(selectedEnzymeGroup, enzymes);
                  _this2.setState((_this2$setState2 = {}, _this2$setState2[selectedEnzymesKey] = {}, _this2$setState2));
                  _this2.refreshEnzymeGroups();
                  window.toastr.success(selectedCount + " enzyme(s) removed");
                }
              case 4:
              case "end":
                return _context2.stop();
            }
          }
        }, _callee2);
      })),
      disabled: fullSelectedEnzGroup["protected"] || !selectedCount,
      icon: "trash"
    }))), /*#__PURE__*/_react["default"].createElement("div", null), /*#__PURE__*/_react["default"].createElement(_core.AnchorButton, {
      onClick: function onClick() {
        var _this2$setState3;
        _this2.setState((_this2$setState3 = {}, _this2$setState3[selectedEnzymesKey] = {}, _this2$setState3));
      },
      disabled: !selectedCount
    }, "\u53D6\u6D88\u9009\u62E9 ", selectedCount)), selectedEnzymeGroup === "My Enzymes" && /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(_core.Tooltip, {
      disabled: window.Cypress,
      position: "left",
      content: "Create Custom Enzyme"
    }, /*#__PURE__*/_react["default"].createElement(_core.Button, {
      minimal: true,
      onClick: function onClick() {
        hideModal();
        (0, _GlobalDialogUtils.showDialog)({
          dialogType: "CreateCustomEnzyme"
        });
      },
      className: "veEnzymeCreateCustomEnzyme",
      icon: "add"
    })))))));
  };
  return EnzymesDialog;
}(_react["default"].Component);
var _default = (0, _redux.compose)((0, _teselagenReactComponents.wrapDialog)({
  title: "管理内切酶"
}), _withEditorProps["default"]
// reduxForm({
//   form: "EnzymesDialog",
//   validate: ({ id1, id2 }) => {
//     const errors = {};
//     if (!id1 || Array.isArray(id1)) {
//       errors.id1 = "Please select a feature";
//     }
//     if (!id2 || Array.isArray(id2)) {
//       errors.id2 = "Please select a feature";
//     }
//     return errors;
//   }
// }),
// formValues("id1", "id2")
)(EnzymesDialog);
exports["default"] = _default;
function getEnzymesForNames(names, allEnzymesByName) {
  return names.map(function (n) {
    return n && allEnzymesByName[n.toLowerCase()] || {
      name: "Not Found!"
    };
  });
}
var MoveToInner = /*#__PURE__*/function (_React$Component2) {
  _inheritsLoose(MoveToInner, _React$Component2);
  function MoveToInner() {
    var _this3;
    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
      args[_key2] = arguments[_key2];
    }
    _this3 = _React$Component2.call.apply(_React$Component2, [this].concat(args)) || this;
    _defineProperty(_assertThisInitialized(_this3), "state", {
      enzymeOpts: []
    });
    return _this3;
  }
  var _proto2 = MoveToInner.prototype;
  _proto2.componentDidMount = function componentDidMount() {
    var _this$props2 = this.props,
      selectedEnzymeGroup = _this$props2.selectedEnzymeGroup,
      enzymeGroupToMoveTo = _this$props2.enzymeGroupToMoveTo,
      setStateAbove = _this$props2.setStateAbove,
      enzymeGroups = _this$props2.enzymeGroups;
    var enzymeOpts = (0, _lodash.flatMap)(enzymeGroups, function (g) {
      if (g["protected"] || g.name === selectedEnzymeGroup) return [];
      return {
        value: g.name
      };
    });
    if (!enzymeGroupToMoveTo && enzymeOpts.length) {
      setStateAbove({
        enzymeGroupToMoveTo: enzymeOpts[0].value
      });
    }
    this.setState({
      enzymeOpts: enzymeOpts
    });
  };
  _proto2.render = function render() {
    var _this$props3 = this.props,
      clearSelection = _this$props3.clearSelection,
      setStateAbove = _this$props3.setStateAbove,
      selectedCount = _this$props3.selectedCount,
      enzymeGroupToMoveTo = _this$props3.enzymeGroupToMoveTo,
      enzymeGroups = _this$props3.enzymeGroups,
      refreshEnzymeGroups = _this$props3.refreshEnzymeGroups,
      selectedEnzymesForGroup = _this$props3.selectedEnzymesForGroup;
    var enzymeOpts = this.state.enzymeOpts;
    return /*#__PURE__*/_react["default"].createElement("div", {
      className: "veEnzymeGroupMoveEnzymePopover",
      style: {
        padding: 10
      }
    }, enzymeOpts && !enzymeOpts.length ? /*#__PURE__*/_react["default"].createElement("div", {
      style: {
        maxWidth: 150
      }
    }, "No other custom enzyme groups exist. Please create a new enzyme group to add enzymes to it.") : /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("h5", null, "Copy ", selectedCount, " Enzyme(s) To:"), /*#__PURE__*/_react["default"].createElement(_core.HTMLSelect, {
      onChange: function onChange(e) {
        setStateAbove({
          enzymeGroupToMoveTo: e.target.value
        });
      },
      value: enzymeGroupToMoveTo,
      options: enzymeOpts
    }), /*#__PURE__*/_react["default"].createElement(_core.AnchorButton, {
      className: _core.Classes.POPOVER_DISMISS,
      onClick: function onClick() {
        var enzymes = (0, _lodash.uniq)([].concat((0, _lodash.map)(enzymeGroups[enzymeGroupToMoveTo].enzymes, function (e) {
          return e.name;
        }), (0, _lodash.flatMap)(selectedEnzymesForGroup, function (selected, name) {
          return selected ? name : [];
        })));
        window.updateEnzymeGroup(enzymeGroupToMoveTo, enzymes);
        // setStateAbove({
        //   enzymeGroupToMoveTo: e.target.value
        // });
        refreshEnzymeGroups();
        clearSelection();
        window.toastr.success(selectedCount + " enzyme(s) moved to " + enzymeGroupToMoveTo);
      },
      intent: "success",
      icon: "tick"
    })));
  };
  return MoveToInner;
}(_react["default"].Component);
var HoverView = (0, _reactEasyState.view)(function (_ref3) {
  var allEnzymesByName = _ref3.allEnzymesByName;
  var hoveredEnzyme = easyStore.hoveredEnzyme;
  return /*#__PURE__*/_react["default"].createElement("div", {
    className: "hoveredEnzymeContainer",
    style: {
      overflow: "hidden",
      // maxWidth: "100%",
      minWidth: 0,
      // width: "100%",
      margin: "20px",
      minHeight: 30,
      maxHeight: 30,
      display: "flex",
      justifyContent: "space-between"
    }
  }, hoveredEnzyme, " ", hoveredEnzyme && /*#__PURE__*/_react["default"].createElement(_EnzymeViewer["default"], {
    paddingEnd: "--",
    paddingStart: "--",
    sequence: allEnzymesByName[hoveredEnzyme.toLowerCase()].site,
    reverseSnipPosition: allEnzymesByName[hoveredEnzyme.toLowerCase()].bottomSnipOffset,
    forwardSnipPosition: allEnzymesByName[hoveredEnzyme.toLowerCase()].topSnipOffset
  }));
});
module.exports = exports.default;