ketcher-react 2.23.0-rc.4 → 2.24.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -79,7 +79,7 @@ require('draft-js/dist/Draft.css');
79
79
  var draftJs = require('draft-js');
80
80
  var createStyles = require('draft-js-custom-styles');
81
81
  var _objectDestructuringEmpty = require('@babel/runtime/helpers/objectDestructuringEmpty');
82
- var _extends$3j = require('@babel/runtime/helpers/extends');
82
+ var _extends$3k = require('@babel/runtime/helpers/extends');
83
83
  var MuiAutocomplete = require('@mui/material/Autocomplete');
84
84
  var client = require('react-dom/client');
85
85
 
@@ -142,10 +142,11 @@ var Tabs__default = /*#__PURE__*/_interopDefaultLegacy(Tabs$1);
142
142
  var Tab__default = /*#__PURE__*/_interopDefaultLegacy(Tab);
143
143
  var createStyles__default = /*#__PURE__*/_interopDefaultLegacy(createStyles);
144
144
  var _objectDestructuringEmpty__default = /*#__PURE__*/_interopDefaultLegacy(_objectDestructuringEmpty);
145
- var _extends__default = /*#__PURE__*/_interopDefaultLegacy(_extends$3j);
145
+ var _extends__default = /*#__PURE__*/_interopDefaultLegacy(_extends$3k);
146
146
  var MuiAutocomplete__default = /*#__PURE__*/_interopDefaultLegacy(MuiAutocomplete);
147
147
 
148
148
  function createApi(structServiceProvider, defaultOptions) {
149
+ var _structService$destro;
149
150
  var structService = structServiceProvider.createStructService(defaultOptions);
150
151
  var info = structService.info();
151
152
  return Object.assign(info, {
@@ -162,7 +163,8 @@ function createApi(structServiceProvider, defaultOptions) {
162
163
  recognize: structService.recognize.bind(structService),
163
164
  generateImageAsBase64: structService.generateImageAsBase64.bind(structService),
164
165
  getInChIKey: structService.getInChIKey.bind(structService),
165
- toggleExplicitHydrogens: structService.toggleExplicitHydrogens.bind(structService)
166
+ toggleExplicitHydrogens: structService.toggleExplicitHydrogens.bind(structService),
167
+ destroy: (_structService$destro = structService.destroy) === null || _structService$destro === void 0 ? void 0 : _structService$destro.bind(structService)
166
168
  });
167
169
  }
168
170
 
@@ -341,7 +343,7 @@ function _unsupportedIterableToArray$g(o, minLen) { if (!o) return; if (typeof o
341
343
  function _arrayLikeToArray$g(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
342
344
  function _callSuper$b(t, o, e) { return o = _getPrototypeOf__default["default"](o), _possibleConstructorReturn__default["default"](t, _isNativeReflectConstruct$d() ? Reflect.construct(o, e || [], _getPrototypeOf__default["default"](t).constructor) : o.apply(t, e)); }
343
345
  function _isNativeReflectConstruct$d() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct$d = function _isNativeReflectConstruct() { return !!t; })(); }
344
- var ieCb = window.clipboardData;
346
+ var ieCb = typeof window !== 'undefined' ? window.clipboardData : {};
345
347
  var CLIP_AREA_BASE_CLASS = 'cliparea';
346
348
  var needSkipCopyEvent = false;
347
349
  var ClipArea = function (_Component) {
@@ -554,7 +556,7 @@ function _copy(_x3) {
554
556
  }
555
557
  function _copy2() {
556
558
  _copy2 = _asyncToGenerator__default["default"]( _regeneratorRuntime__default["default"].mark(function _callee3(data) {
557
- var clipboardItemData, clipboardItem, textData;
559
+ var clipboardItemData;
558
560
  return _regeneratorRuntime__default["default"].wrap(function _callee3$(_context3) {
559
561
  while (1) switch (_context3.prev = _context3.next) {
560
562
  case 0:
@@ -566,36 +568,20 @@ function _copy2() {
566
568
  type: mimeTypeToSet
567
569
  }));
568
570
  });
569
- clipboardItem = new ClipboardItem(clipboardItemData);
570
- if (!(clipboardItem.presentationStyle && clipboardItem.presentationStyle === 'unspecified')) {
571
- _context3.next = 11;
572
- break;
573
- }
574
- if (!navigator.clipboard.writeText) {
575
- _context3.next = 9;
576
- break;
577
- }
578
- textData = data['text/plain'] || JSON.stringify(data);
579
- _context3.next = 9;
580
- return navigator.clipboard.writeText(textData);
581
- case 9:
582
- _context3.next = 13;
583
- break;
584
- case 11:
585
- _context3.next = 13;
586
- return navigator.clipboard.write([clipboardItem]);
587
- case 13:
588
- _context3.next = 19;
571
+ _context3.next = 5;
572
+ return navigator.clipboard.write([new ClipboardItem(clipboardItemData)]);
573
+ case 5:
574
+ _context3.next = 11;
589
575
  break;
590
- case 15:
591
- _context3.prev = 15;
576
+ case 7:
577
+ _context3.prev = 7;
592
578
  _context3.t0 = _context3["catch"](0);
593
579
  ketcherCore.KetcherLogger.error('cliparea.jsx::copy', _context3.t0);
594
- case 19:
580
+ case 11:
595
581
  case "end":
596
582
  return _context3.stop();
597
583
  }
598
- }, _callee3, null, [[0, 15]]);
584
+ }, _callee3, null, [[0, 7]]);
599
585
  }));
600
586
  return _copy2.apply(this, arguments);
601
587
  }
@@ -2620,7 +2606,7 @@ function isFlipDisabled(editor) {
2620
2606
  return getAmountOfAttachmentBonds() > 1;
2621
2607
  }
2622
2608
 
2623
- var toolActions = {
2609
+ var toolActions = _defineProperty__default["default"]({
2624
2610
  hand: {
2625
2611
  title: 'Hand tool',
2626
2612
  shortcut: 'Mod+Alt+h',
@@ -3051,7 +3037,15 @@ var toolActions = {
3051
3037
  return isHidden(options, 'bonds');
3052
3038
  }
3053
3039
  }
3054
- };
3040
+ }, ketcherCore.IMAGE_KEY, {
3041
+ title: 'Add Image',
3042
+ action: {
3043
+ tool: ketcherCore.IMAGE_KEY
3044
+ },
3045
+ hidden: function hidden(options) {
3046
+ return isHidden(options, ketcherCore.IMAGE_KEY);
3047
+ }
3048
+ });
3055
3049
  var bondCuts = {
3056
3050
  single: '1',
3057
3051
  "double": '2',
@@ -3410,7 +3404,7 @@ function serverCall(editor, server, method, options, struct) {
3410
3404
  var selectedBonds = [];
3411
3405
  var aidMap = new Map();
3412
3406
  var bidMap = new Map();
3413
- var currentStruct = (struct || editor.struct()).clone(null, null, false, aidMap, null, null, null, bidMap);
3407
+ var currentStruct = (struct || editor.struct()).clone(null, null, false, aidMap, null, null, null, null, bidMap);
3414
3408
  var expSel = editor.explicitSelected();
3415
3409
  if (selection) {
3416
3410
  selectedAtoms = (selection.atoms ? selection.atoms : expSel.atoms).map(function (aid) {
@@ -3676,7 +3670,7 @@ var zoom = {
3676
3670
 
3677
3671
  var openHelpLink = function openHelpLink() {
3678
3672
  var _window$open;
3679
- return (_window$open = window.open("https://github.com/epam/ketcher/blob/".concat("v2.23.0-rc.4\n", "/documentation/help.md#ketcher-overview"))) === null || _window$open === void 0 ? void 0 : _window$open.focus();
3673
+ return (_window$open = window.open("https://github.com/epam/ketcher/blob/".concat("v2.24.0-rc.2\n", "/documentation/help.md#ketcher-overview"))) === null || _window$open === void 0 ? void 0 : _window$open.focus();
3680
3674
  };
3681
3675
  var help = {
3682
3676
  help: {
@@ -3704,6 +3698,8 @@ var KETCHER_ROOT_NODE_CLASS_NAME = 'Ketcher-root';
3704
3698
  var KETCHER_ROOT_NODE_CSS_SELECTOR = ".".concat(KETCHER_ROOT_NODE_CLASS_NAME);
3705
3699
  var EditorClassName = 'Ketcher-polymer-editor-root';
3706
3700
  var KETCHER_MACROMOLECULES_ROOT_NODE_SELECTOR = ".".concat(EditorClassName);
3701
+ var STRUCT_SERVICE_NO_RENDER_INITIALIZED_EVENT = 'struct-service-no-render-initialized';
3702
+ var STRUCT_SERVICE_INITIALIZED_EVENT = 'struct-service-initialized';
3707
3703
 
3708
3704
  var functionalGroupsLib = {
3709
3705
  'functional-groups': {
@@ -4064,16 +4060,16 @@ function hasSelection(editor) {
4064
4060
 
4065
4061
  var classes$Q = {"button-common-styles":"ActionButton-module_button-common-styles__y-hng","scrollbar":"ActionButton-module_scrollbar__lD3MH","button":"ActionButton-module_button__nfoWQ","selected":"ActionButton-module_selected__kPCxA"};
4066
4062
 
4067
- var _path$3c, _rect$4, _rect2$3;
4068
- function _extends$3i() { _extends$3i = 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$3i.apply(this, arguments); }
4063
+ var _path$3d, _rect$4, _rect2$3;
4064
+ function _extends$3j() { _extends$3j = 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$3j.apply(this, arguments); }
4069
4065
  function SvgAbout(props) {
4070
- return /*#__PURE__*/React__namespace.createElement("svg", _extends$3i({
4066
+ return /*#__PURE__*/React__namespace.createElement("svg", _extends$3j({
4071
4067
  width: 24,
4072
4068
  height: 24,
4073
4069
  viewBox: "0 0 24 24",
4074
4070
  fill: "none",
4075
4071
  xmlns: "http://www.w3.org/2000/svg"
4076
- }, props), _path$3c || (_path$3c = /*#__PURE__*/React__namespace.createElement("path", {
4072
+ }, props), _path$3d || (_path$3d = /*#__PURE__*/React__namespace.createElement("path", {
4077
4073
  d: "M12 4.5a7.5 7.5 0 100 15 7.5 7.5 0 000-15zM12 18c-3.307 0-6-2.693-6-6s2.693-6 6-6 6 2.693 6 6-2.693 6-6 6z",
4078
4074
  fill: "currentcolor"
4079
4075
  })), _rect$4 || (_rect$4 = /*#__PURE__*/React__namespace.createElement("rect", {
@@ -4093,6 +4089,20 @@ function SvgAbout(props) {
4093
4089
  })));
4094
4090
  }
4095
4091
 
4092
+ var _path$3c;
4093
+ function _extends$3i() { _extends$3i = 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$3i.apply(this, arguments); }
4094
+ function SvgAddImage(props) {
4095
+ return /*#__PURE__*/React__namespace.createElement("svg", _extends$3i({
4096
+ width: 16,
4097
+ height: 16,
4098
+ viewBox: "0 0 16 16",
4099
+ xmlns: "http://www.w3.org/2000/svg"
4100
+ }, props), _path$3c || (_path$3c = /*#__PURE__*/React__namespace.createElement("path", {
4101
+ d: "M12.19 14.476H1.524V3.81H8.38V2.286H1.524C.686 2.286 0 2.97 0 3.81v10.666C0 15.314.686 16 1.524 16H12.19c.839 0 1.524-.686 1.524-1.524V7.62H12.19v6.857zm-5.935-2.415l-1.493-1.798-2.095 2.69h8.38L8.35 9.362l-2.095 2.698zm7.46-9.775V0H12.19v2.286H9.905c.007.007 0 1.524 0 1.524h2.286v2.278c.007.007 1.523 0 1.523 0V3.81H16V2.286h-2.286z",
4102
+ fill: "currentColor"
4103
+ })));
4104
+ }
4105
+
4096
4106
  var _path$3b;
4097
4107
  function _extends$3h() { _extends$3h = 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$3h.apply(this, arguments); }
4098
4108
  function SvgAnalyse(props) {
@@ -7664,7 +7674,8 @@ function SvgNucleotide(props) {
7664
7674
  })));
7665
7675
  }
7666
7676
 
7667
- var iconNameToIcon = {
7677
+ var _iconNameToIcon;
7678
+ var iconNameToIcon = (_iconNameToIcon = {
7668
7679
  α: Svg$n,
7669
7680
  β: Svg$m,
7670
7681
  γ: Svg$l,
@@ -7816,67 +7827,8 @@ var iconNameToIcon = {
7816
7827
  'template-dialog': SvgTemplateDialog,
7817
7828
  'template-lib': SvgTemplateLib,
7818
7829
  'snake-mode': SvgSnakeMode,
7819
- text: SvgText,
7820
- 'text-bold': SvgTextBold,
7821
- 'text-italic': SvgTextItalic,
7822
- 'text-subscript': SvgTextSubscript,
7823
- 'text-superscript': SvgTextSuperscript,
7824
- 'transform-flip-h': SvgTransformFlipH,
7825
- 'transform-flip-v': SvgTransformFlipV,
7826
- undo: SvgUndo,
7827
- 'zoom-in': SvgZoomIn,
7828
- 'zoom-out': SvgZoomOut,
7829
- 'zoom-reset': SvgZoomReset,
7830
- 'shape-ellipse': SvgShapeEllipse,
7831
- 'shape-rectangle': SvgShapeRectangle,
7832
- 'shape-polyline': SvgShapePolyline,
7833
- 'shape-line': SvgShapeLine,
7834
- 'not-found': SvgNotFound,
7835
- 'save-1': SvgSave1,
7836
- 'open-1': SvgOpen1,
7837
- reset: SvgReset,
7838
- close: SvgClose,
7839
- general: SvgGeneral,
7840
- 'general-white': SvgGeneralWhite,
7841
- stereo: SvgStereo,
7842
- 'stereo-white': SvgStereoWhite,
7843
- atoms: SvgAtoms,
7844
- 'atoms-white': SvgAtomsWhite,
7845
- bonds: SvgBonds,
7846
- 'bonds-white': SvgBondsWhite,
7847
- server: SvgServer,
7848
- 'server-white': SvgServerWhite,
7849
- '3dviewer': Svg3D,
7850
- '3dviewer-white': Svg3DWhite,
7851
- debugging: SvgDebugging,
7852
- 'debugging-white': SvgDebuggingWhite,
7853
- 'dropdown-indicator': SvgDropdownIndicator,
7854
- 'text-special-symbols': SvgTextSpecialSymbols,
7855
- chevron: SvgChevron,
7856
- 'open-window-paste-icon': SvgOpenWindowPasteIcon,
7857
- 'open-window-upload-icon': SvgOpenWindowUploadIcon,
7858
- bracket: SvgBracket,
7859
- error: SvgError,
7860
- 'rap-left-link': SvgRapLeftLink,
7861
- 'rap-middle-link': SvgRapMiddleLink,
7862
- 'rap-right-link': SvgRapRightLink,
7863
- 'arrows-left': SvgArrowsLeft,
7864
- 'arrows-right': SvgArrowsRight,
7865
- sugar: SvgSugar,
7866
- base: SvgBase,
7867
- phosphate: SvgPhosphate,
7868
- preset: SvgPreset,
7869
- nucleotide: SvgNucleotide,
7870
- 'edit-filled': SvgEditFilled,
7871
- 'vertical-dots': SvgVerticalDots,
7872
- expand: SvgExpand,
7873
- 'minimize-expansion': SvgMinimizeExpantion,
7874
- 'explicit-hydrogens': SvgExplicitHydrogens,
7875
- 'flex-layout-mode': SvgFlexLayoutMode,
7876
- 'snake-layout-mode': SvgSnakeLayoutMode,
7877
- 'sequence-layout-mode': SvgSequenceLayoutMode,
7878
- questionMark: SvgQuestionMark
7879
- };
7830
+ text: SvgText
7831
+ }, _defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_iconNameToIcon, ketcherCore.IMAGE_KEY, SvgAddImage), 'text-bold', SvgTextBold), 'text-italic', SvgTextItalic), 'text-subscript', SvgTextSubscript), 'text-superscript', SvgTextSuperscript), 'transform-flip-h', SvgTransformFlipH), 'transform-flip-v', SvgTransformFlipV), "undo", SvgUndo), 'zoom-in', SvgZoomIn), 'zoom-out', SvgZoomOut), _defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_iconNameToIcon, 'zoom-reset', SvgZoomReset), 'shape-ellipse', SvgShapeEllipse), 'shape-rectangle', SvgShapeRectangle), 'shape-polyline', SvgShapePolyline), 'shape-line', SvgShapeLine), 'not-found', SvgNotFound), 'save-1', SvgSave1), 'open-1', SvgOpen1), "reset", SvgReset), "close", SvgClose), _defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_iconNameToIcon, "general", SvgGeneral), 'general-white', SvgGeneralWhite), "stereo", SvgStereo), 'stereo-white', SvgStereoWhite), "atoms", SvgAtoms), 'atoms-white', SvgAtomsWhite), "bonds", SvgBonds), 'bonds-white', SvgBondsWhite), "server", SvgServer), 'server-white', SvgServerWhite), _defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_iconNameToIcon, '3dviewer', Svg3D), '3dviewer-white', Svg3DWhite), "debugging", SvgDebugging), 'debugging-white', SvgDebuggingWhite), 'dropdown-indicator', SvgDropdownIndicator), 'text-special-symbols', SvgTextSpecialSymbols), "chevron", SvgChevron), 'open-window-paste-icon', SvgOpenWindowPasteIcon), 'open-window-upload-icon', SvgOpenWindowUploadIcon), "bracket", SvgBracket), _defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_iconNameToIcon, "error", SvgError), 'rap-left-link', SvgRapLeftLink), 'rap-middle-link', SvgRapMiddleLink), 'rap-right-link', SvgRapRightLink), 'arrows-left', SvgArrowsLeft), 'arrows-right', SvgArrowsRight), "sugar", SvgSugar), "base", SvgBase), "phosphate", SvgPhosphate), "preset", SvgPreset), _defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_iconNameToIcon, "nucleotide", SvgNucleotide), 'edit-filled', SvgEditFilled), 'vertical-dots', SvgVerticalDots), "expand", SvgExpand), 'minimize-expansion', SvgMinimizeExpantion), 'explicit-hydrogens', SvgExplicitHydrogens), 'flex-layout-mode', SvgFlexLayoutMode), 'snake-layout-mode', SvgSnakeLayoutMode), 'sequence-layout-mode', SvgSequenceLayoutMode), "questionMark", SvgQuestionMark));
7880
7832
 
7881
7833
  var getIconByName = function getIconByName(name) {
7882
7834
  return iconNameToIcon[name];
@@ -14105,6 +14057,7 @@ var _excluded$t = ["type"],
14105
14057
  _excluded2$5 = ["buttons"];
14106
14058
  function ownKeys$12(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
14107
14059
  function _objectSpread$12(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$12(Object(t), !0).forEach(function (r) { _defineProperty__default["default"](e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$12(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
14060
+ var SET_SERVER = 'SET_SERVER';
14108
14061
  var shared = redux.combineReducers({
14109
14062
  common: commonReducer,
14110
14063
  actionState: actionStateReducer,
@@ -14139,6 +14092,12 @@ function getRootReducer(setEditor) {
14139
14092
  var data = _objectWithoutProperties__default["default"](action, _excluded$t);
14140
14093
  if (data) state = _objectSpread$12(_objectSpread$12({}, state), data);
14141
14094
  }
14095
+ case SET_SERVER:
14096
+ {
14097
+ state = _objectSpread$12(_objectSpread$12({}, state), {}, {
14098
+ server: action.server || state.server
14099
+ });
14100
+ }
14142
14101
  }
14143
14102
  var sh = shared(state, _objectSpread$12(_objectSpread$12({}, action), fp.pick(['editor', 'server', 'options'], state)));
14144
14103
  var finalState = sh === state.shared ? state : _objectSpread$12(_objectSpread$12({}, state), sh);
@@ -14165,6 +14124,12 @@ function createStore (options, server, setEditor) {
14165
14124
  var rootReducer = getRootReducer(setEditor);
14166
14125
  return redux.createStore(rootReducer, initState, redux.applyMiddleware.apply(void 0, middleware));
14167
14126
  }
14127
+ function setServer(server) {
14128
+ return {
14129
+ type: SET_SERVER,
14130
+ server: server
14131
+ };
14132
+ }
14168
14133
 
14169
14134
  var disableableButtons$3 = [];
14170
14135
  var mapStateToProps$l = function mapStateToProps(state) {
@@ -14591,6 +14556,8 @@ var LeftToolbar = function LeftToolbar(props) {
14591
14556
  options: shapeOptions
14592
14557
  }, {
14593
14558
  id: 'text'
14559
+ }, {
14560
+ id: ketcherCore.IMAGE_KEY
14594
14561
  }]
14595
14562
  })
14596
14563
  })]
@@ -15728,11 +15695,17 @@ function getElementsInRectangle(restruct, p0, p1) {
15728
15695
  var x1 = Math.max(p0.x, p1.x);
15729
15696
  var y0 = Math.min(p0.y, p1.y);
15730
15697
  var y1 = Math.max(p0.y, p1.y);
15698
+ var topLeftPosition = new ketcherCore.Vec2(x0, y0);
15699
+ var topRightPosition = new ketcherCore.Vec2(x1, y0);
15700
+ var bottomRightPosition = new ketcherCore.Vec2(x1, y1);
15701
+ var bottomLeftPosition = new ketcherCore.Vec2(x0, y1);
15731
15702
  restruct.bonds.forEach(function (bond, bid) {
15732
15703
  if (struct.isBondFromMacromolecule(bid)) {
15733
15704
  return;
15734
15705
  }
15735
- var centre = ketcherCore.Vec2.lc2(restruct.atoms.get(bond.b.begin).a.pp, 0.5, restruct.atoms.get(bond.b.end).a.pp, 0.5);
15706
+ var centre = ketcherCore.Vec2.lc2(
15707
+ restruct.atoms.get(bond.b.begin).a.pp, 0.5,
15708
+ restruct.atoms.get(bond.b.end).a.pp, 0.5);
15736
15709
  if (centre.x > x0 && centre.x < x1 && centre.y > y0 && centre.y < y1 && !ketcherCore.FunctionalGroup.isBondInContractedFunctionalGroup(bond.b, sGroups, functionalGroups)) {
15737
15710
  bondList.push(bid);
15738
15711
  }
@@ -15740,7 +15713,8 @@ function getElementsInRectangle(restruct, p0, p1) {
15740
15713
  restruct.atoms.forEach(function (atom, aid) {
15741
15714
  var relatedFGId = ketcherCore.FunctionalGroup.findFunctionalGroupByAtom(functionalGroups, aid);
15742
15715
  var reSGroup = restruct.sgroups.get(relatedFGId);
15743
- if (!((reSGroup === null || reSGroup === void 0 ? void 0 : reSGroup.item) instanceof ketcherCore.MonomerMicromolecule) && atom.a.pp.x > x0 && atom.a.pp.x < x1 && atom.a.pp.y > y0 && atom.a.pp.y < y1 && (!ketcherCore.FunctionalGroup.isAtomInContractedFunctionalGroup(atom.a, sGroups, functionalGroups, true) || aid === reSGroup.item.atoms[0])) {
15716
+ if (!((reSGroup === null || reSGroup === void 0 ? void 0 : reSGroup.item) instanceof ketcherCore.MonomerMicromolecule) && atom.a.pp.x > x0 && atom.a.pp.x < x1 && atom.a.pp.y > y0 && atom.a.pp.y < y1 && (!ketcherCore.FunctionalGroup.isAtomInContractedFunctionalGroup(atom.a, sGroups, functionalGroups, true) ||
15717
+ aid === reSGroup.item.atoms[0])) {
15744
15718
  atomList.push(aid);
15745
15719
  }
15746
15720
  });
@@ -15795,7 +15769,18 @@ function getElementsInRectangle(restruct, p0, p1) {
15795
15769
  rgroupAttachmentPointList.push(id);
15796
15770
  }
15797
15771
  });
15798
- return {
15772
+ var reImages = Array.from(restruct.images.entries()).reduce(function (acc, _ref) {
15773
+ var _ref2 = _slicedToArray__default["default"](_ref, 2),
15774
+ id = _ref2[0],
15775
+ item = _ref2[1];
15776
+ if (Object.values(item.image.getReferencePositions()).some(function (point) {
15777
+ return point.isInsidePolygon([topLeftPosition, topRightPosition, bottomRightPosition, bottomLeftPosition]);
15778
+ })) {
15779
+ return acc.concat(id);
15780
+ }
15781
+ return acc;
15782
+ }, []);
15783
+ return _defineProperty__default["default"]({
15799
15784
  atoms: atomList,
15800
15785
  bonds: bondList,
15801
15786
  rxnArrows: rxnArrowsList,
@@ -15805,7 +15790,7 @@ function getElementsInRectangle(restruct, p0, p1) {
15805
15790
  simpleObjects: simpleObjectsList,
15806
15791
  texts: textsList,
15807
15792
  rgroupAttachmentPoints: rgroupAttachmentPointList
15808
- };
15793
+ }, ketcherCore.IMAGE_KEY, reImages);
15809
15794
  }
15810
15795
  function getElementsInPolygon(restruct, rr) {
15811
15796
  var bondList = [];
@@ -15821,7 +15806,9 @@ function getElementsInPolygon(restruct, rr) {
15821
15806
  if (struct.isAtomFromMacromolecule(bond.b.begin) || struct.isAtomFromMacromolecule(bond.b.end)) {
15822
15807
  return;
15823
15808
  }
15824
- var centre = ketcherCore.Vec2.lc2(restruct.atoms.get(bond.b.begin).a.pp, 0.5, restruct.atoms.get(bond.b.end).a.pp, 0.5);
15809
+ var centre = ketcherCore.Vec2.lc2(
15810
+ restruct.atoms.get(bond.b.begin).a.pp, 0.5,
15811
+ restruct.atoms.get(bond.b.end).a.pp, 0.5);
15825
15812
  if (isPointInPolygon(r, centre) && !ketcherCore.FunctionalGroup.isBondInContractedFunctionalGroup(bond.b, sGroups, functionalGroups)) {
15826
15813
  bondList.push(bid);
15827
15814
  }
@@ -15829,7 +15816,8 @@ function getElementsInPolygon(restruct, rr) {
15829
15816
  restruct.atoms.forEach(function (atom, aid) {
15830
15817
  var relatedFGId = ketcherCore.FunctionalGroup.findFunctionalGroupByAtom(functionalGroups, aid);
15831
15818
  var reSGroup = restruct.sgroups.get(relatedFGId);
15832
- if (!((reSGroup === null || reSGroup === void 0 ? void 0 : reSGroup.item) instanceof ketcherCore.MonomerMicromolecule) && isPointInPolygon(r, atom.a.pp) && (!ketcherCore.FunctionalGroup.isAtomInContractedFunctionalGroup(atom.a, sGroups, functionalGroups, true) || aid === reSGroup.item.atoms[0])) {
15819
+ if (!((reSGroup === null || reSGroup === void 0 ? void 0 : reSGroup.item) instanceof ketcherCore.MonomerMicromolecule) && isPointInPolygon(r, atom.a.pp) && (!ketcherCore.FunctionalGroup.isAtomInContractedFunctionalGroup(atom.a, sGroups, functionalGroups, true) ||
15820
+ aid === reSGroup.item.atoms[0])) {
15833
15821
  atomList.push(aid);
15834
15822
  }
15835
15823
  });
@@ -15838,7 +15826,7 @@ function getElementsInPolygon(restruct, rr) {
15838
15826
  var simpleObjectsList = [];
15839
15827
  var textsList = [];
15840
15828
  restruct.rxnArrows.forEach(function (item, id) {
15841
- var referencePoints = item.getReferencePoints(true);
15829
+ var referencePoints = item.getReferencePoints();
15842
15830
  var referencePointInPolygon = referencePoints.find(function (point) {
15843
15831
  return isPointInPolygon(r, point);
15844
15832
  });
@@ -15887,7 +15875,18 @@ function getElementsInPolygon(restruct, rr) {
15887
15875
  rgroupAttachmentPointList.push(id);
15888
15876
  }
15889
15877
  });
15890
- return {
15878
+ var reImages = Array.from(restruct.images.entries()).reduce(function (acc, _ref4) {
15879
+ var _ref5 = _slicedToArray__default["default"](_ref4, 2),
15880
+ id = _ref5[0],
15881
+ item = _ref5[1];
15882
+ if (Object.values(item.image.getReferencePositions()).some(function (point) {
15883
+ return isPointInPolygon(r, point);
15884
+ })) {
15885
+ return acc.concat(id);
15886
+ }
15887
+ return acc;
15888
+ }, []);
15889
+ return _defineProperty__default["default"]({
15891
15890
  atoms: atomList,
15892
15891
  bonds: bondList,
15893
15892
  rxnArrows: rxnArrowsList,
@@ -15897,7 +15896,7 @@ function getElementsInPolygon(restruct, rr) {
15897
15896
  simpleObjects: simpleObjectsList,
15898
15897
  texts: textsList,
15899
15898
  rgroupAttachmentPoints: rgroupAttachmentPointList
15900
- };
15899
+ }, ketcherCore.IMAGE_KEY, reImages);
15901
15900
  }
15902
15901
  function isPointInPolygon(r, p) {
15903
15902
  var d = new ketcherCore.Vec2(0, 1);
@@ -17248,8 +17247,8 @@ function getSelectionMap(structure) {
17248
17247
  return result;
17249
17248
  }, {});
17250
17249
  }
17251
- function getStructCenter(ReStruct, selection) {
17252
- var bb = ReStruct.getVBoxObj(selection || {});
17250
+ function getStructCenter(reStruct, selection) {
17251
+ var bb = reStruct.getVBoxObj(selection || {});
17253
17252
  return ketcherCore.Vec2.lc2(bb.p0, 0.5, bb.p1, 0.5);
17254
17253
  }
17255
17254
 
@@ -17258,7 +17257,7 @@ var handleMovingPosibilityCursor = function handleMovingPosibilityCursor(item, c
17258
17257
  if (!item && isCursorShown) {
17259
17258
  canvas.removeAttribute('cursor');
17260
17259
  }
17261
- if (item && !isCursorShown) {
17260
+ if (item) {
17262
17261
  canvas.setAttribute('cursor', cursor);
17263
17262
  }
17264
17263
  };
@@ -17392,6 +17391,13 @@ var SelectTool = function () {
17392
17391
  info: degrees + 'º'
17393
17392
  });
17394
17393
  }
17394
+ if (dragCtx.item.map === ketcherCore.IMAGE_KEY && dragCtx.item.ref) {
17395
+ if (dragCtx.action) dragCtx.action.perform(rnd.ctab);
17396
+ var position = ketcherCore.CoordinateTransformation.pageToModel(event, rnd);
17397
+ dragCtx.action = ketcherCore.fromImageResize(rnd.ctab, dragCtx.item.id, position, dragCtx.item.ref);
17398
+ editor.update(dragCtx.action, true);
17399
+ return true;
17400
+ }
17395
17401
  if (dragCtx.item.map === 'simpleObjects' && dragCtx.item.ref) {
17396
17402
  if (dragCtx.action) dragCtx.action.perform(rnd.ctab);
17397
17403
  var props = getResizingProps(editor, dragCtx, event);
@@ -17430,7 +17436,13 @@ var SelectTool = function () {
17430
17436
  var maps = getMapsForClosestItem(_classPrivateFieldGet__default["default"](this, _lassoHelper).fragment || event.ctrlKey);
17431
17437
  var item = editor.findItem(event, maps, null);
17432
17438
  editor.hover(item, null, event);
17433
- handleMovingPosibilityCursor(item, this.editor.render.paper.canvas, this.editor.render.options.movingStyle.cursor);
17439
+ if ((item === null || item === void 0 ? void 0 : item.map) === ketcherCore.IMAGE_KEY && item.ref) {
17440
+ var referencePositionInfo = item.ref;
17441
+ handleMovingPosibilityCursor(item, this.editor.render.paper.canvas,
17442
+ ketcherCore.imageReferencePositionToCursor[referencePositionInfo.name]);
17443
+ } else {
17444
+ handleMovingPosibilityCursor(item, this.editor.render.paper.canvas, this.editor.render.options.movingStyle.cursor);
17445
+ }
17434
17446
  return true;
17435
17447
  }
17436
17448
  }, {
@@ -17773,7 +17785,7 @@ function preventSaltAndSolventsMerge(struct, dragCtx, editor) {
17773
17785
  });
17774
17786
  }
17775
17787
  function getMapsForClosestItem(selectFragment) {
17776
- return ['sgroups', 'functionalGroups', 'sgroupData', 'rgroups', 'rgroupAttachmentPoints', 'rxnArrows', 'rxnPluses', 'enhancedFlags', 'simpleObjects', 'texts'].concat(_toConsumableArray__default["default"](selectFragment ? ['frags'] : ['atoms', 'bonds']));
17788
+ return ['sgroups', 'functionalGroups', 'sgroupData', 'rgroups', 'rgroupAttachmentPoints', 'rxnArrows', 'rxnPluses', 'enhancedFlags', 'simpleObjects', 'texts', ketcherCore.IMAGE_KEY].concat(_toConsumableArray__default["default"](selectFragment ? ['frags'] : ['atoms', 'bonds']));
17777
17789
  }
17778
17790
  function getResizingProps(editor, dragCtx, event) {
17779
17791
  var current = editor.render.page2obj(event);
@@ -18846,12 +18858,21 @@ function _isChangingFunctionalGroup() {
18846
18858
  return _isChangingFunctionalGroup.apply(this, arguments);
18847
18859
  }
18848
18860
 
18861
+ var keydownListener = null;
18849
18862
  function initKeydownListener(element) {
18850
18863
  return function (dispatch, getState) {
18851
18864
  var hotKeys = ketcherCore.initHotKeys(config);
18852
- element.addEventListener('keydown', function (event) {
18865
+ keydownListener = function keydownListener(event) {
18853
18866
  return keyHandle(dispatch, getState, hotKeys, event);
18854
- });
18867
+ };
18868
+ element.addEventListener('keydown', keydownListener);
18869
+ };
18870
+ }
18871
+ function removeKeydownListener(element) {
18872
+ return function () {
18873
+ if (keydownListener) {
18874
+ element.removeEventListener('keydown', keydownListener);
18875
+ }
18855
18876
  };
18856
18877
  }
18857
18878
  function removeNotRenderedStruct(actionTool, group, dispatch) {
@@ -19307,7 +19328,7 @@ function _unsupportedIterableToArray$9(o, minLen) { if (!o) return; if (typeof o
19307
19328
  function _arrayLikeToArray$9(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
19308
19329
  var SELECTION_DISTANCE_COEFFICIENT = 0.4;
19309
19330
  var SELECTION_WITHIN_TEXT = 0;
19310
- var findMaps = {
19331
+ var findMaps = _defineProperty__default["default"]({
19311
19332
  atoms: findClosestAtom,
19312
19333
  bonds: findClosestBond,
19313
19334
  enhancedFlags: findClosestEnhancedFlag,
@@ -19321,15 +19342,15 @@ var findMaps = {
19321
19342
  rgroupAttachmentPoints: findClosestRgroupAttachmentPoints,
19322
19343
  simpleObjects: findClosestSimpleObject,
19323
19344
  texts: findClosestText
19324
- };
19345
+ }, ketcherCore.IMAGE_KEY, findClosestImage);
19325
19346
  function rectangleContainsPoint(startX, startY, width, height, x, y) {
19326
19347
  return startX <= x && x <= startX + width && startY <= y && y <= startY + height;
19327
19348
  }
19328
19349
  function findClosestText(restruct, cursorPosition) {
19329
- var minDist = null;
19350
+ var minDist = Number.POSITIVE_INFINITY;
19330
19351
  var ret = null;
19331
19352
  restruct.texts.forEach(function (text, id) {
19332
- var referencePoints = text.getReferencePoints(restruct);
19353
+ var referencePoints = text.getReferencePoints();
19333
19354
  var topX = referencePoints[0].x;
19334
19355
  var topY = referencePoints[0].y;
19335
19356
  var bottomX = referencePoints[2].x;
@@ -19377,7 +19398,7 @@ function findClosestText(restruct, cursorPosition) {
19377
19398
  return ret;
19378
19399
  }
19379
19400
  function findClosestSimpleObject(restruct, pos) {
19380
- var minDist = null;
19401
+ var minDist = Number.POSITIVE_INFINITY;
19381
19402
  var refPoint = null;
19382
19403
  var ret = null;
19383
19404
  restruct.simpleObjects.forEach(function (simpleObject, id) {
@@ -19404,7 +19425,7 @@ function findClosestAtom(restruct, pos, skip, minDist) {
19404
19425
  minDist = Math.min(minDist, maxMinDist);
19405
19426
  restruct.atoms.forEach(function (atom, aid) {
19406
19427
  if (ketcherCore.FunctionalGroup.isAtomInContractedFunctionalGroup(atom.a, sGroups, functionalGroups, true) || ketcherCore.Atom.isHiddenLeavingGroupAtom(restruct.molecule, aid)) {
19407
- return null;
19428
+ return;
19408
19429
  }
19409
19430
  var isSkippedAtom = aid === skipId || atom.a.isPreview;
19410
19431
  if (isSkippedAtom) {
@@ -19442,7 +19463,7 @@ function findClosestBond(restruct, pos, skip, minDist, options) {
19442
19463
  var p1 = restruct.atoms.get(bond.b.begin).a.pp;
19443
19464
  var p2 = restruct.atoms.get(bond.b.end).a.pp;
19444
19465
  if (ketcherCore.FunctionalGroup.isBondInContractedFunctionalGroup(bond.b, sGroups, functionalGroups) || ketcherCore.SGroup.isBondInContractedSGroup(bond.b, sGroups) || ketcherCore.Bond.isBondToHiddenLeavingGroup(restruct.molecule, bond.b)) {
19445
- return null;
19466
+ return;
19446
19467
  }
19447
19468
  var mid = ketcherCore.Vec2.lc2(p1, 0.5, p2, 0.5);
19448
19469
  var cdist = ketcherCore.Vec2.dist(pos, mid);
@@ -19480,10 +19501,10 @@ function findClosestBond(restruct, pos, skip, minDist, options) {
19480
19501
  }
19481
19502
  return null;
19482
19503
  }
19483
- function findClosestEnhancedFlag(restruct, pos, skip, _minDist, options) {
19504
+ function findClosestEnhancedFlag(restruct, pos, _skip, _minDist, options) {
19484
19505
  var minDist;
19485
19506
  var ret = null;
19486
- restruct.enhancedFlags.forEach(function (item, id) {
19507
+ restruct.enhancedFlags.forEach(function (_item, id) {
19487
19508
  var fragment = restruct.molecule.frags.get(id);
19488
19509
  if (!fragment || !fragment.enhancedStereoFlag || !options.showStereoFlags) return;
19489
19510
  var p = fragment.stereoFlagPosition ? new ketcherCore.Vec2(fragment.stereoFlagPosition.x, fragment.stereoFlagPosition.y) : ketcherCore.Fragment.getDefaultStereoFlagPosition(restruct.molecule, id);
@@ -19500,7 +19521,7 @@ function findClosestEnhancedFlag(restruct, pos, skip, _minDist, options) {
19500
19521
  return ret;
19501
19522
  }
19502
19523
  function findClosestDataSGroupData(restruct, pos) {
19503
- var minDist = null;
19524
+ var minDist = Number.POSITIVE_INFINITY;
19504
19525
  var ret = null;
19505
19526
  restruct.sgroupData.forEach(function (item, id) {
19506
19527
  if (item.sgroup.type !== 'DAT') throw new Error('Data group expected');
@@ -19560,7 +19581,7 @@ function findClosestRgroupAttachmentPoints(restruct, cursorPosition, _skip, minD
19560
19581
  var minDist = minDistToOtherItems !== null && minDistToOtherItems !== void 0 ? minDistToOtherItems : Number.POSITIVE_INFINITY;
19561
19582
  var closestItemId;
19562
19583
  restruct.visibleRGroupAttachmentPoints.forEach(function (reItem, id) {
19563
- var itemOutlinePoints = reItem.getOutlinePoints();
19584
+ var itemOutlinePoints = _toConsumableArray__default["default"](reItem.getOutlinePoints());
19564
19585
  var isCursorInsideOutline = cursorPosition.isInsidePolygon(itemOutlinePoints);
19565
19586
  if (isCursorInsideOutline) {
19566
19587
  var dist = reItem.getDistanceTo(cursorPosition);
@@ -19576,7 +19597,7 @@ function findClosestRgroupAttachmentPoints(restruct, cursorPosition, _skip, minD
19576
19597
  };
19577
19598
  }
19578
19599
  function findClosestRxnArrow(restruct, pos) {
19579
- var minDist = null;
19600
+ var minDist = Number.POSITIVE_INFINITY;
19580
19601
  var refPoint = null;
19581
19602
  var ret = null;
19582
19603
  restruct.rxnArrows.forEach(function (rxnArrow, id) {
@@ -19594,7 +19615,7 @@ function findClosestRxnArrow(restruct, pos) {
19594
19615
  return ret;
19595
19616
  }
19596
19617
  function findClosestRxnPlus(restruct, pos) {
19597
- var minDist = null;
19618
+ var minDist = Number.POSITIVE_INFINITY;
19598
19619
  var ret = null;
19599
19620
  restruct.rxnPluses.forEach(function (plus, id) {
19600
19621
  var p = plus.item.pp;
@@ -19613,7 +19634,7 @@ function findClosestSGroup(restruct, pos) {
19613
19634
  var ret = null;
19614
19635
  var minDist = SELECTION_DISTANCE_COEFFICIENT;
19615
19636
  restruct.molecule.sgroups.forEach(function (sg, sgid) {
19616
- if (sg.isContracted() || sg.isSuperatomWithoutLabel) return null;
19637
+ if (sg.isContracted() || sg.isSuperatomWithoutLabel) return;
19617
19638
  var d = sg.bracketDirection;
19618
19639
  var n = d.rotateSC(1, 0);
19619
19640
  var pg = new ketcherCore.Vec2(ketcherCore.Vec2.dot(pos, d), ketcherCore.Vec2.dot(pos, n));
@@ -19706,7 +19727,9 @@ function findCloseMerge(restruct, selected) {
19706
19727
  });
19707
19728
  selected.bonds.forEach(function (bid) {
19708
19729
  var bond = struct.bonds.get(bid);
19709
- pos.bonds.set(bid, ketcherCore.Vec2.lc2(struct.atoms.get(bond.begin).pp, 0.5, struct.atoms.get(bond.end).pp, 0.5));
19730
+ pos.bonds.set(bid, ketcherCore.Vec2.lc2(
19731
+ struct.atoms.get(bond.begin).pp, 0.5,
19732
+ struct.atoms.get(bond.end).pp, 0.5));
19710
19733
  });
19711
19734
  var result = {
19712
19735
  atoms: new Map(),
@@ -19719,7 +19742,8 @@ function findCloseMerge(restruct, selected) {
19719
19742
  mergeAtomToAtom(atomId, restruct, atomPosition, selected, result) || mergeAtomToFunctionalGroup(atomId, restruct, atomPosition, result);
19720
19743
  });
19721
19744
  } else {
19722
- result[map] = Array.from(pos[map].keys()).reduce(function (res, srcId) {
19745
+ result[map] = Array.from(pos[map].keys()).reduce(
19746
+ function (res, srcId) {
19723
19747
  var skip = {
19724
19748
  map: map,
19725
19749
  id: srcId
@@ -19759,6 +19783,31 @@ function mergeAtomToFunctionalGroup(atomId, restruct, atomPosition, result) {
19759
19783
  }
19760
19784
  return false;
19761
19785
  }
19786
+ function findClosestImage(reStruct, cursorPosition) {
19787
+ var renderOptions = reStruct.render.options;
19788
+ var canvasScaledPosition = ketcherCore.Scale.modelToCanvas(cursorPosition, renderOptions);
19789
+ var maxDistance = renderOptions.microModeScale * SELECTION_DISTANCE_COEFFICIENT;
19790
+ return Array.from(reStruct.images.entries()).reduce(function (acc, _ref) {
19791
+ var _ref2 = _slicedToArray__default["default"](_ref, 2),
19792
+ id = _ref2[0],
19793
+ item = _ref2[1];
19794
+ var distanceToPoint = item.calculateDistanceToPoint(canvasScaledPosition, renderOptions);
19795
+ if (distanceToPoint <= maxDistance) {
19796
+ if (acc && acc.dist < distanceToPoint) {
19797
+ return acc;
19798
+ }
19799
+ var dist = Math.max(distanceToPoint, maxDistance / 3);
19800
+ var closestPosition = item.calculateClosestReferencePosition(canvasScaledPosition, renderOptions);
19801
+ var includeRef = closestPosition.distance < maxDistance;
19802
+ return {
19803
+ id: id,
19804
+ dist: dist / renderOptions.microModeScale,
19805
+ ref: includeRef ? closestPosition.ref : null
19806
+ };
19807
+ }
19808
+ return acc;
19809
+ }, null);
19810
+ }
19762
19811
  var closest = {
19763
19812
  atom: findClosestAtom,
19764
19813
  item: findClosestItem,
@@ -20687,7 +20736,7 @@ var EraserTool = function () {
20687
20736
  function EraserTool(editor, mode) {
20688
20737
  _classCallCheck__default["default"](this, EraserTool);
20689
20738
  this.editor = editor;
20690
- this.maps = ['atoms', 'bonds', 'rxnArrows', 'rxnPluses', 'sgroups', 'functionalGroups', 'sgroupData', 'simpleObjects', 'texts', 'rgroupAttachmentPoints'];
20739
+ this.maps = ['atoms', 'bonds', 'rxnArrows', 'rxnPluses', 'sgroups', 'functionalGroups', 'sgroupData', 'simpleObjects', 'texts', 'rgroupAttachmentPoints', ketcherCore.IMAGE_KEY];
20691
20740
  this.lassoHelper = new LassoHelper(mode || 0, editor, null);
20692
20741
  if (editor.selection()) {
20693
20742
  var action = ketcherCore.fromFragmentDeletion(editor.render.ctab, editor.selection());
@@ -20965,6 +21014,8 @@ var EraserTool = function () {
20965
21014
  this.editor.update(ketcherCore.fromTextDeletion(restruct, ci.id));
20966
21015
  } else if (ci.map === 'rgroupAttachmentPoints') {
20967
21016
  this.editor.update(ketcherCore.fromRGroupAttachmentPointDeletion(restruct, ci.id));
21017
+ } else if (ci.map === ketcherCore.IMAGE_KEY) {
21018
+ this.editor.update(ketcherCore.fromImageDeletion(restruct, ci.id));
20968
21019
  } else {
20969
21020
  return;
20970
21021
  }
@@ -22414,7 +22465,157 @@ function propsDialog(editor, id, position, pos) {
22414
22465
  });
22415
22466
  }
22416
22467
 
22417
- var toolsMap = {
22468
+ var TAG = 'tool/image.ts';
22469
+ var supportedMimes = ['png', 'svg+xml'];
22470
+ var supportedMimesForRegex = supportedMimes.map(function (item) {
22471
+ return item.replace('+', '\\+');
22472
+ }).join('|');
22473
+ var allowList = new RegExp("^image/(".concat(supportedMimesForRegex, ")$"));
22474
+ var MIN_DIMENSION_SIZE = 16;
22475
+ var ImageTool = function () {
22476
+ function ImageTool(editor) {
22477
+ _classCallCheck__default["default"](this, ImageTool);
22478
+ _defineProperty__default["default"](this, "dragCtx", null);
22479
+ this.editor = editor;
22480
+ this.element = this.getElement();
22481
+ }
22482
+ _createClass__default["default"](ImageTool, [{
22483
+ key: "mousedown",
22484
+ value: function mousedown(event) {
22485
+ var render = this.editor.render;
22486
+ var closestItem = this.editor.findItem(event, [ketcherCore.IMAGE_KEY]);
22487
+ this.editor.selection(null);
22488
+ if (closestItem) {
22489
+ this.editor.hover(null);
22490
+ this.editor.selection(_defineProperty__default["default"]({}, ketcherCore.IMAGE_KEY, [closestItem.id]));
22491
+ this.dragCtx = {
22492
+ center: ketcherCore.CoordinateTransformation.pageToModel(event, render),
22493
+ action: new ketcherCore.Action(),
22494
+ closestItem: closestItem
22495
+ };
22496
+ }
22497
+ }
22498
+ }, {
22499
+ key: "click",
22500
+ value: function click(event) {
22501
+ var closestItem = this.editor.findItem(event, [ketcherCore.IMAGE_KEY]);
22502
+ this.editor.hover(null);
22503
+ if (closestItem) {
22504
+ return;
22505
+ }
22506
+ var position = ketcherCore.CoordinateTransformation.pageToModel(event, this.editor.render);
22507
+ this.element.onchange = this.onFileUpload.bind(this, position);
22508
+ this.element.click();
22509
+ }
22510
+ }, {
22511
+ key: "mousemove",
22512
+ value: function mousemove(event) {
22513
+ var render = this.editor.render;
22514
+ if (this.dragCtx) {
22515
+ this.dragCtx.action.perform(render.ctab);
22516
+ var click = ketcherCore.CoordinateTransformation.pageToModel(event, render);
22517
+ this.dragCtx.action = this.dragCtx.closestItem.ref ? ketcherCore.fromImageResize(render.ctab, this.dragCtx.closestItem.id, click, this.dragCtx.closestItem.ref) : ketcherCore.fromImageMove(render.ctab, this.dragCtx.closestItem.id, click.sub(this.dragCtx.center));
22518
+ this.editor.update(this.dragCtx.action, true);
22519
+ } else {
22520
+ var item = this.editor.findItem(event, [ketcherCore.IMAGE_KEY]);
22521
+ var _render = this.editor.render;
22522
+ if (item !== null && item !== void 0 && item.ref) {
22523
+ handleMovingPosibilityCursor(item, _render.paper.canvas, ketcherCore.imageReferencePositionToCursor[item.ref.name]);
22524
+ } else {
22525
+ handleMovingPosibilityCursor(item, _render.paper.canvas, _render.options.movingStyle.cursor);
22526
+ }
22527
+ this.editor.hover(item, null, event);
22528
+ }
22529
+ }
22530
+ }, {
22531
+ key: "mouseup",
22532
+ value: function mouseup() {
22533
+ if (this.dragCtx) {
22534
+ this.editor.update(this.dragCtx.action);
22535
+ this.dragCtx = null;
22536
+ }
22537
+ return true;
22538
+ }
22539
+ }, {
22540
+ key: "onFileUpload",
22541
+ value: function onFileUpload(clickPosition) {
22542
+ var _this = this;
22543
+ var errorHandler = this.editor.errorHandler;
22544
+ this.element.onchange = null;
22545
+ if (this.element.files && this.element.files[0]) {
22546
+ var file = this.element.files[0];
22547
+ var image = new Image();
22548
+ var reader = new FileReader();
22549
+ if (!file.type || !file.type.match(allowList)) {
22550
+ var errorMessage = "Unsupported image type";
22551
+ ketcherCore.KetcherLogger.error("".concat(TAG, ":onFileUpload"), errorMessage);
22552
+ if (errorHandler) {
22553
+ errorHandler(errorMessage);
22554
+ }
22555
+ this.resetElementValue();
22556
+ return;
22557
+ }
22558
+ reader.addEventListener('load', function () {
22559
+ image.src = reader.result;
22560
+ });
22561
+ image.onload = function () {
22562
+ _this.resetElementValue();
22563
+ if (image.width < MIN_DIMENSION_SIZE || image.height < MIN_DIMENSION_SIZE) {
22564
+ var _errorMessage = 'Image should be at least 16x16 pixels';
22565
+ ketcherCore.KetcherLogger.error("".concat(TAG, ":onLoad"), _errorMessage);
22566
+ if (errorHandler) {
22567
+ errorHandler(_errorMessage);
22568
+ }
22569
+ return;
22570
+ }
22571
+ var halfSize = ketcherCore.Scale.canvasToModel(new ketcherCore.Vec2(image.width / 2, image.height / 2), _this.editor.render.options);
22572
+ _this.editor.update(ketcherCore.fromImageCreation(_this.editor.render.ctab, image.src, clickPosition, halfSize));
22573
+ };
22574
+ image.onerror = function (e) {
22575
+ _this.resetElementValue();
22576
+ var errorMessage = 'Cannot load image';
22577
+ ketcherCore.KetcherLogger.error("".concat(TAG, ":onerror"), errorMessage, e);
22578
+ if (errorHandler) {
22579
+ errorHandler(errorMessage);
22580
+ }
22581
+ };
22582
+ reader.readAsDataURL(this.element.files[0]);
22583
+ }
22584
+ }
22585
+ }, {
22586
+ key: "createElement",
22587
+ value: function createElement() {
22588
+ var uploader = document.createElement('input');
22589
+ uploader.style.display = 'none';
22590
+ uploader.id = ImageTool.INPUT_ID;
22591
+ uploader.type = 'file';
22592
+ uploader.accept = supportedMimes.map(function (item) {
22593
+ return "image/".concat(item);
22594
+ }).join(',');
22595
+ document.body.appendChild(uploader);
22596
+ return uploader;
22597
+ }
22598
+ }, {
22599
+ key: "getElement",
22600
+ value: function getElement() {
22601
+ var element = document.getElementById(ImageTool.INPUT_ID);
22602
+ if (element instanceof HTMLInputElement) {
22603
+ return element;
22604
+ }
22605
+ element === null || element === void 0 || element.remove();
22606
+ return this.createElement();
22607
+ }
22608
+ }, {
22609
+ key: "resetElementValue",
22610
+ value: function resetElementValue() {
22611
+ this.getElement().value = '';
22612
+ }
22613
+ }]);
22614
+ return ImageTool;
22615
+ }();
22616
+ _defineProperty__default["default"](ImageTool, "INPUT_ID", 'image-upload');
22617
+
22618
+ var toolsMap = _defineProperty__default["default"]({
22418
22619
  hand: HandTool,
22419
22620
  rgroupatom: RGroupAtomTool,
22420
22621
  select: SelectTool,
@@ -22437,7 +22638,7 @@ var toolsMap = {
22437
22638
  enhancedStereo: EnhancedStereoTool,
22438
22639
  simpleobject: SimpleObjectTool,
22439
22640
  text: TextTool
22440
- };
22641
+ }, ketcherCore.IMAGE_KEY, ImageTool);
22441
22642
 
22442
22643
  var Highlighter = function () {
22443
22644
  function Highlighter(editor) {
@@ -23308,8 +23509,8 @@ function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedec
23308
23509
  function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
23309
23510
  var SCALE = ketcherCore.provideEditorSettings().microModeScale;
23310
23511
  var HISTORY_SIZE = 32;
23311
- var structObjects = ['atoms', 'bonds', 'frags', 'sgroups', 'sgroupData', 'rgroups', 'rxnArrows', 'rxnPluses', 'enhancedFlags', 'simpleObjects', 'texts'];
23312
- var highlightTargets = ['atoms', 'bonds', 'rxnArrows', 'rxnPluses', 'functionalGroups', 'frags', 'merge', 'rgroups', 'rgroupAttachmentPoints', 'sgroups', 'sgroupData', 'enhancedFlags', 'simpleObjects', 'texts'];
23512
+ var structObjects = ['atoms', 'bonds', 'frags', 'sgroups', 'sgroupData', 'rgroups', 'rxnArrows', 'rxnPluses', 'enhancedFlags', 'simpleObjects', 'texts', ketcherCore.IMAGE_KEY];
23513
+ var highlightTargets = ['atoms', 'bonds', 'rxnArrows', 'rxnPluses', 'functionalGroups', 'frags', 'merge', 'rgroups', 'rgroupAttachmentPoints', 'sgroups', 'sgroupData', 'enhancedFlags', 'simpleObjects', 'texts', ketcherCore.IMAGE_KEY];
23313
23514
  function selectStereoFlagsIfNecessary(atoms, expAtoms) {
23314
23515
  var atomsOfFragments = {};
23315
23516
  atoms.forEach(function (atom, atomId) {
@@ -23739,7 +23940,7 @@ var Editor$3 = function () {
23739
23940
  value: function structSelected() {
23740
23941
  var struct = this.render.ctab.molecule;
23741
23942
  var selection = this.explicitSelected();
23742
- var dst = struct.clone(new ketcherCore.Pile(selection.atoms), new ketcherCore.Pile(selection.bonds), true, null, new ketcherCore.Pile(selection.simpleObjects), new ketcherCore.Pile(selection.texts));
23943
+ var dst = struct.clone(new ketcherCore.Pile(selection.atoms), new ketcherCore.Pile(selection.bonds), true, null, new ketcherCore.Pile(selection.simpleObjects), new ketcherCore.Pile(selection.texts), null, new ketcherCore.Pile(selection.images));
23743
23944
  struct.rxnArrows.forEach(function (item, id) {
23744
23945
  if (selection.rxnArrows.indexOf(id) !== -1) dst.rxnArrows.add(item.clone());
23745
23946
  });
@@ -24099,6 +24300,10 @@ function ButtonGroup(_ref) {
24099
24300
  }, [onClick]);
24100
24301
  return jsxRuntime.jsx(material.ToggleButtonGroup, {
24101
24302
  exclusive: true,
24303
+ style: {
24304
+ overflowX: 'hidden',
24305
+ flexWrap: 'wrap'
24306
+ },
24102
24307
  children: buttons.map(function (_ref2) {
24103
24308
  var label = _ref2.label,
24104
24309
  buttonValue = _ref2.value;
@@ -24109,6 +24314,11 @@ function ButtonGroup(_ref) {
24109
24314
  return handleChange(event, buttonValue);
24110
24315
  },
24111
24316
  className: clsx__default["default"](classes$F.button, _defineProperty__default["default"]({}, classes$F.selected, buttonValue === value)),
24317
+ style: {
24318
+ flex: '1 0 25%',
24319
+ margin: '2px',
24320
+ borderRadius: '3px'
24321
+ },
24112
24322
  children: label || 'none'
24113
24323
  }, label);
24114
24324
  })
@@ -24560,7 +24770,11 @@ var useBondTypeChange = function useBondTypeChange() {
24560
24770
  var disabled = React.useCallback(function (_ref2) {
24561
24771
  var props = _ref2.props;
24562
24772
  var selectedBondIds = props === null || props === void 0 ? void 0 : props.bondIds;
24773
+ var editor = getKetcherInstance().editor;
24563
24774
  if (Array.isArray(selectedBondIds) && selectedBondIds.length !== 0) {
24775
+ if (editor.struct().isBondFromMacromolecule(selectedBondIds[0])) {
24776
+ return true;
24777
+ }
24564
24778
  return false;
24565
24779
  }
24566
24780
  return true;
@@ -24577,8 +24791,9 @@ var BondMenuItems = function BondMenuItems(props) {
24577
24791
  _useBondEdit2 = _slicedToArray__default["default"](_useBondEdit, 1),
24578
24792
  handleEdit = _useBondEdit2[0];
24579
24793
  var _useBondTypeChange = useBondTypeChange(),
24580
- _useBondTypeChange2 = _slicedToArray__default["default"](_useBondTypeChange, 1),
24581
- handleTypeChange = _useBondTypeChange2[0];
24794
+ _useBondTypeChange2 = _slicedToArray__default["default"](_useBondTypeChange, 2),
24795
+ handleTypeChange = _useBondTypeChange2[0],
24796
+ disabled = _useBondTypeChange2[1];
24582
24797
  var _useBondSGroupAttach = useBondSGroupAttach(),
24583
24798
  _useBondSGroupAttach2 = _slicedToArray__default["default"](_useBondSGroupAttach, 2),
24584
24799
  handleSGroupAttach = _useBondSGroupAttach2[0],
@@ -24590,9 +24805,13 @@ var BondMenuItems = function BondMenuItems(props) {
24590
24805
  sGroupEditHidden = _useBondSGroupEdit2[2];
24591
24806
  var handleDelete = useDelete$1();
24592
24807
  var bondNamesWithoutEmptyValue = nonQueryBondNames.slice(1);
24808
+ var isDisabled = disabled({
24809
+ props: props.propsFromTrigger
24810
+ });
24593
24811
  return jsxRuntime.jsxs(jsxRuntime.Fragment, {
24594
24812
  children: [jsxRuntime.jsx(reactContexify.Item, _objectSpread$L(_objectSpread$L({}, props), {}, {
24595
24813
  onClick: handleEdit,
24814
+ disabled: isDisabled,
24596
24815
  children: (_props$propsFromTrigg = props.propsFromTrigger) !== null && _props$propsFromTrigg !== void 0 && _props$propsFromTrigg.extraItemsSelected ? 'Edit selected bonds...' : 'Edit...'
24597
24816
  })), bondNamesWithoutEmptyValue.map(function (name, i) {
24598
24817
  var iconName = getIconName(name);
@@ -24602,7 +24821,8 @@ var BondMenuItems = function BondMenuItems(props) {
24602
24821
  }, props), {}, {
24603
24822
  id: name,
24604
24823
  onClick: handleTypeChange,
24605
- key: name
24824
+ key: name,
24825
+ disabled: isDisabled
24606
24826
  }), iconName && jsxRuntime.jsx(Icon, {
24607
24827
  name: iconName,
24608
24828
  className: styles$e.icon
@@ -24618,6 +24838,7 @@ var BondMenuItems = function BondMenuItems(props) {
24618
24838
  className: styles$e.sameGroup,
24619
24839
  id: name,
24620
24840
  onClick: handleTypeChange,
24841
+ disabled: isDisabled,
24621
24842
  children: [iconName && jsxRuntime.jsx(Icon, {
24622
24843
  name: iconName,
24623
24844
  className: styles$e.icon
@@ -24908,19 +25129,62 @@ var props = {
24908
25129
  var ContextMenu = function ContextMenu() {
24909
25130
  var _useAppContext = useAppContext(),
24910
25131
  getKetcherInstance = _useAppContext.getKetcherInstance;
24911
- var resetMenuPosition = function resetMenuPosition() {
24912
- var contextMenuElement = document.querySelector('.contexify:last-of-type');
25132
+ var adjustSubmenuPosition = function adjustSubmenuPosition(submenuElement) {
25133
+ var rect = submenuElement.getBoundingClientRect();
25134
+ var ketcherRootElement = document.querySelector(KETCHER_ROOT_NODE_CSS_SELECTOR);
25135
+ var ketcherRootElementRect = ketcherRootElement === null || ketcherRootElement === void 0 ? void 0 : ketcherRootElement.getBoundingClientRect();
25136
+ var ketcherEditorWidth = (ketcherRootElementRect === null || ketcherRootElementRect === void 0 ? void 0 : ketcherRootElementRect.width) || 0;
25137
+ var ketcherEditorHeight = (ketcherRootElementRect === null || ketcherRootElementRect === void 0 ? void 0 : ketcherRootElementRect.height) || 0;
25138
+ var ketcherEditorLeft = (ketcherRootElementRect === null || ketcherRootElementRect === void 0 ? void 0 : ketcherRootElementRect.left) || 0;
25139
+ var ketcherEditorTop = (ketcherRootElementRect === null || ketcherRootElementRect === void 0 ? void 0 : ketcherRootElementRect.top) || 0;
25140
+ if (rect.right - ketcherEditorLeft > ketcherEditorWidth) {
25141
+ submenuElement.style.left = 'auto';
25142
+ submenuElement.style.right = '100%';
25143
+ } else {
25144
+ submenuElement.style.left = '100%';
25145
+ submenuElement.style.right = 'auto';
25146
+ }
25147
+ if (rect.bottom - ketcherEditorTop > ketcherEditorHeight) {
25148
+ submenuElement.style.top = 'auto';
25149
+ submenuElement.style.bottom = '0';
25150
+ } else {
25151
+ submenuElement.style.top = '0';
25152
+ submenuElement.style.bottom = 'auto';
25153
+ }
25154
+ };
25155
+ var resetMenuPosition = function resetMenuPosition(menuElement) {
25156
+ var contextMenuElement = menuElement;
24913
25157
  var ketcherRootElement = document.querySelector(KETCHER_ROOT_NODE_CSS_SELECTOR);
24914
25158
  if (!contextMenuElement || !ketcherRootElement) {
24915
25159
  return;
24916
25160
  }
24917
25161
  var contextMenuElementBoundingBox = contextMenuElement.getBoundingClientRect();
24918
25162
  var ketcherRootElementBoundingBox = ketcherRootElement.getBoundingClientRect();
25163
+ var viewportWidth = window.innerWidth;
25164
+ var viewportHeight = window.innerHeight;
24919
25165
  if (!contextMenuElementBoundingBox || !ketcherRootElementBoundingBox) {
24920
25166
  return;
24921
25167
  }
24922
- var left = contextMenuElementBoundingBox.right > ketcherRootElementBoundingBox.right ? contextMenuElementBoundingBox.x - (contextMenuElementBoundingBox.right - ketcherRootElementBoundingBox.right) : contextMenuElementBoundingBox.x;
24923
- var top = contextMenuElementBoundingBox.bottom > ketcherRootElementBoundingBox.bottom ? contextMenuElementBoundingBox.y - (contextMenuElementBoundingBox.bottom - ketcherRootElementBoundingBox.bottom) : contextMenuElementBoundingBox.y;
25168
+ var left = contextMenuElementBoundingBox.left;
25169
+ var top = contextMenuElementBoundingBox.top;
25170
+ if (contextMenuElementBoundingBox.right > ketcherRootElementBoundingBox.right) {
25171
+ left = ketcherRootElementBoundingBox.right - contextMenuElementBoundingBox.width;
25172
+ }
25173
+ if (contextMenuElementBoundingBox.bottom > ketcherRootElementBoundingBox.bottom) {
25174
+ top = ketcherRootElementBoundingBox.bottom - contextMenuElementBoundingBox.height;
25175
+ }
25176
+ if (left < 0) {
25177
+ left = 0;
25178
+ }
25179
+ if (top < 0) {
25180
+ top = 0;
25181
+ }
25182
+ if (contextMenuElementBoundingBox.right > viewportWidth) {
25183
+ left = viewportWidth - contextMenuElementBoundingBox.width - 10;
25184
+ }
25185
+ if (contextMenuElementBoundingBox.bottom > viewportHeight) {
25186
+ top = viewportHeight - contextMenuElementBoundingBox.height - 10;
25187
+ }
24924
25188
  contextMenuElement.style.left = "".concat(left, "px");
24925
25189
  contextMenuElement.style.top = "".concat(top, "px");
24926
25190
  };
@@ -24928,7 +25192,18 @@ var ContextMenu = function ContextMenu() {
24928
25192
  var editor = getKetcherInstance().editor;
24929
25193
  if (visible) {
24930
25194
  editor.hoverIcon.hide();
24931
- resetMenuPosition();
25195
+ var contextMenuElement = document.querySelector('.contexify:last-of-type');
25196
+ var submenuElements = document.querySelectorAll('.contexify_submenu');
25197
+ if (contextMenuElement) {
25198
+ setTimeout(function () {
25199
+ return resetMenuPosition(contextMenuElement);
25200
+ }, 0);
25201
+ }
25202
+ if (submenuElements.length) {
25203
+ submenuElements.forEach(function (submenuElement) {
25204
+ adjustSubmenuPosition(submenuElement);
25205
+ });
25206
+ }
24932
25207
  }
24933
25208
  editor.contextMenu[id] = visible;
24934
25209
  }, [getKetcherInstance]);
@@ -28307,13 +28582,14 @@ function AtomListValid(value, atomType, isCustomQuery) {
28307
28582
  }
28308
28583
  return value.length >= 1;
28309
28584
  }
28310
- function pseudoAtomValid(value, atomType, isCustomQuery) {
28311
- ketcherCore.genericsList.includes(_.capitalize(value));
28312
- var isGenericElement = ketcherCore.genericsList.includes(value);
28313
- if (atomType !== 'pseudo' || isCustomQuery) {
28314
- return true;
28585
+ function pseudoAtomValid(value, atomType, isCustomQuery, disableQueryElements) {
28586
+ var capitalizedValue = _.capitalize(value);
28587
+ var isDisabledQueryElement = disableQueryElements === null || disableQueryElements === void 0 ? void 0 : disableQueryElements.includes(capitalizedValue);
28588
+ if (atomType === 'pseudo' && isDisabledQueryElement) {
28589
+ return false;
28315
28590
  }
28316
- return value && isGenericElement;
28591
+ var isGenericElement = ketcherCore.genericsList.includes(capitalizedValue);
28592
+ return atomType !== 'pseudo' || isCustomQuery || value && isGenericElement;
28317
28593
  }
28318
28594
  function chargeValid(charge, isMultipleAtoms, isCustomQuery) {
28319
28595
  var result = matchCharge(charge);
@@ -28490,12 +28766,13 @@ var Atom = function Atom(props) {
28490
28766
  };
28491
28767
  var customValid = React.useMemo(function () {
28492
28768
  var atomType = formState.result.atomType;
28769
+ var disableQueryElements = ketcherCore.SettingsManager.getOptions().disableQueryElements;
28493
28770
  return {
28494
28771
  label: function label(_label) {
28495
28772
  return atomValid(_label, isMultipleAtoms, atomType, isCustomQuery);
28496
28773
  },
28497
28774
  pseudo: function pseudo(value) {
28498
- return pseudoAtomValid(value, atomType, isCustomQuery);
28775
+ return pseudoAtomValid(value, atomType, isCustomQuery, disableQueryElements);
28499
28776
  },
28500
28777
  atomList: function atomList(value) {
28501
28778
  return AtomListValid(value, atomType, isCustomQuery);
@@ -30981,11 +31258,8 @@ function mapSelectionToProps(editor) {
30981
31258
  }
30982
31259
  return {};
30983
31260
  }
30984
- var mapStateToProps$2 = function mapStateToProps(state, ownProps) {
31261
+ var mapStateToProps$2 = function mapStateToProps(state) {
30985
31262
  var editor = state.editor;
30986
- if (ownProps.values || ownProps.label) {
30987
- return {};
30988
- }
30989
31263
  var disabledQueryElements = editor.render.options.disableQueryElements;
30990
31264
  return _objectSpread$c({
30991
31265
  disabledQueryElements: disabledQueryElements
@@ -33045,18 +33319,32 @@ var MOUSE_MOVE_THROTTLE_TIMEOUT = 300;
33045
33319
  var handleMouseMove = function handleMouseMove(dispatch, event) {
33046
33320
  dispatch(updateCursorPosition(event.clientX, event.clientY));
33047
33321
  };
33322
+ var pointerMoveListener = null;
33323
+ var mouseDownListener = null;
33048
33324
  function initMouseListener(element) {
33049
33325
  return function (dispatch, getState) {
33050
33326
  var throttledHandleMouseMove = _.throttle(handleMouseMove, MOUSE_MOVE_THROTTLE_TIMEOUT);
33051
- element.addEventListener('pointermove', function (event) {
33327
+ pointerMoveListener = function pointerMoveListener(event) {
33052
33328
  return throttledHandleMouseMove(dispatch, event);
33053
- });
33054
- element.addEventListener('mousedown', function (event) {
33329
+ };
33330
+ mouseDownListener = function mouseDownListener(event) {
33055
33331
  var areBothLeftAndRightButtonsClicked = event.buttons === 3;
33056
33332
  if (areBothLeftAndRightButtonsClicked) {
33057
33333
  handleRightClick(getState);
33058
33334
  }
33059
- }, true);
33335
+ };
33336
+ element.addEventListener('pointermove', pointerMoveListener);
33337
+ element.addEventListener('mousedown', mouseDownListener, true);
33338
+ };
33339
+ }
33340
+ function removeMouseListeners(element) {
33341
+ return function () {
33342
+ if (pointerMoveListener) {
33343
+ element.removeEventListener('pointermove', pointerMoveListener);
33344
+ }
33345
+ if (mouseDownListener) {
33346
+ element.addEventListener('mousedown', mouseDownListener, true);
33347
+ }
33060
33348
  };
33061
33349
  }
33062
33350
  function handleRightClick(getState) {
@@ -33073,14 +33361,22 @@ function initApp(element, appRoot, staticResourcesUrl, options, server, resolve,
33073
33361
  ketcherRef = ketcher;
33074
33362
  };
33075
33363
  var ketcherId = _.uniqueId();
33364
+ var getServerSetter;
33076
33365
  var setEditor = function setEditor(editor) {
33366
+ var setServer = getServerSetter();
33077
33367
  resolve({
33078
33368
  editor: editor,
33079
33369
  setKetcher: setKetcher,
33080
- ketcherId: ketcherId
33370
+ ketcherId: ketcherId,
33371
+ setServer: setServer
33081
33372
  });
33082
33373
  };
33083
33374
  var store = createStore(options, server, setEditor);
33375
+ getServerSetter = function getServerSetter() {
33376
+ return function (structService) {
33377
+ store.dispatch(setServer(structService));
33378
+ };
33379
+ };
33084
33380
  store.dispatch(initKeydownListener(element));
33085
33381
  store.dispatch(initMouseListener(element));
33086
33382
  store.dispatch(initResize());
@@ -33108,6 +33404,10 @@ function initApp(element, appRoot, staticResourcesUrl, options, server, resolve,
33108
33404
  })
33109
33405
  })
33110
33406
  }));
33407
+ return function () {
33408
+ store.dispatch(removeKeydownListener(element));
33409
+ store.dispatch(removeMouseListeners(element));
33410
+ };
33111
33411
  }
33112
33412
 
33113
33413
  var indigo;
@@ -33156,6 +33456,28 @@ var KetcherBuilder = function () {
33156
33456
  }
33157
33457
  return appendApiAsync;
33158
33458
  }()
33459
+ }, {
33460
+ key: "reinitializeApi",
33461
+ value: function reinitializeApi(structServiceProvider, setStructServiceToStore) {
33462
+ var _this = this;
33463
+ var oldStructService = this.structService;
33464
+ this.structService = createApi(structServiceProvider, ketcherCore.DefaultStructServiceOptions);
33465
+ window.addEventListener(STRUCT_SERVICE_INITIALIZED_EVENT, function () {
33466
+ var _oldStructService$des;
33467
+ oldStructService === null || oldStructService === void 0 || (_oldStructService$des = oldStructService.destroy) === null || _oldStructService$des === void 0 || _oldStructService$des.call(oldStructService);
33468
+ if (!_this.structService) {
33469
+ ketcherCore.KetcherLogger.warn('Structure service is not reinitialized');
33470
+ return;
33471
+ }
33472
+ var ketcher = ketcherCore.ketcherProvider.getKetcher();
33473
+ ketcher.reinitializeIndigo(_this.structService);
33474
+ IndigoProvider.setIndigo(_this.structService);
33475
+ setStructServiceToStore(_this.structService);
33476
+ }, {
33477
+ once: true
33478
+ });
33479
+ return this.structService;
33480
+ }
33159
33481
  }, {
33160
33482
  key: "appendServiceMode",
33161
33483
  value: function appendServiceMode(mode) {
@@ -33165,35 +33487,39 @@ var KetcherBuilder = function () {
33165
33487
  key: "appendUiAsync",
33166
33488
  value: function () {
33167
33489
  var _appendUiAsync = _asyncToGenerator__default["default"]( _regeneratorRuntime__default["default"].mark(function _callee2(element, appRoot, staticResourcesUrl, errorHandler, buttons, togglerComponent) {
33168
- var structService, _yield$Promise, editor, setKetcher, ketcherId;
33490
+ var structService, cleanup, _yield$Promise, editor, setKetcher, ketcherId, setServer;
33169
33491
  return _regeneratorRuntime__default["default"].wrap(function _callee2$(_context2) {
33170
33492
  while (1) switch (_context2.prev = _context2.next) {
33171
33493
  case 0:
33172
33494
  structService = this.structService;
33173
- _context2.next = 3;
33495
+ cleanup = null;
33496
+ _context2.next = 4;
33174
33497
  return new Promise(function (resolve) {
33175
- initApp(element, appRoot, staticResourcesUrl, {
33498
+ cleanup = initApp(element, appRoot, staticResourcesUrl, {
33176
33499
  buttons: buttons || {},
33177
33500
  errorHandler: errorHandler || null,
33178
- version: "2.23.0-rc.4" ,
33179
- buildDate: "2024-08-14T15:07:42" ,
33501
+ version: "2.24.0-rc.2" ,
33502
+ buildDate: "2024-08-14T18:22:51" ,
33180
33503
  buildNumber: ''
33181
33504
  }, structService, resolve, togglerComponent);
33182
33505
  });
33183
- case 3:
33506
+ case 4:
33184
33507
  _yield$Promise = _context2.sent;
33185
33508
  editor = _yield$Promise.editor;
33186
33509
  setKetcher = _yield$Promise.setKetcher;
33187
33510
  ketcherId = _yield$Promise.ketcherId;
33511
+ setServer = _yield$Promise.setServer;
33188
33512
  this.editor = editor;
33189
33513
  this.editor.errorHandler = errorHandler && typeof errorHandler === 'function' ? errorHandler :
33190
33514
  function () {};
33191
33515
  this.formatterFactory = new ketcherCore.FormatterFactory(structService);
33192
33516
  return _context2.abrupt("return", {
33193
33517
  setKetcher: setKetcher,
33194
- ketcherId: ketcherId
33518
+ ketcherId: ketcherId,
33519
+ cleanup: cleanup,
33520
+ setServer: setServer
33195
33521
  });
33196
- case 11:
33522
+ case 13:
33197
33523
  case "end":
33198
33524
  return _context2.stop();
33199
33525
  }
@@ -33240,7 +33566,7 @@ function buildKetcherAsync(_x) {
33240
33566
  }
33241
33567
  function _buildKetcherAsync() {
33242
33568
  _buildKetcherAsync = _asyncToGenerator__default["default"]( _regeneratorRuntime__default["default"].mark(function _callee(_ref) {
33243
- var element, appRoot, staticResourcesUrl, structServiceProvider, buttons, errorHandler, togglerComponent, builder, _yield$builder$append, setKetcher, ketcherId, ketcher;
33569
+ var element, appRoot, staticResourcesUrl, structServiceProvider, buttons, errorHandler, togglerComponent, builder, _yield$builder$append, setKetcher, ketcherId, cleanup, setServer, ketcher;
33244
33570
  return _regeneratorRuntime__default["default"].wrap(function _callee$(_context) {
33245
33571
  while (1) switch (_context.prev = _context.next) {
33246
33572
  case 0:
@@ -33256,15 +33582,20 @@ function _buildKetcherAsync() {
33256
33582
  _yield$builder$append = _context.sent;
33257
33583
  setKetcher = _yield$builder$append.setKetcher;
33258
33584
  ketcherId = _yield$builder$append.ketcherId;
33585
+ cleanup = _yield$builder$append.cleanup;
33586
+ setServer = _yield$builder$append.setServer;
33259
33587
  ketcher = builder.build();
33260
33588
  if (ketcher) {
33261
33589
  setKetcher(ketcher);
33262
33590
  }
33263
33591
  return _context.abrupt("return", {
33264
33592
  ketcher: ketcher,
33265
- ketcherId: ketcherId
33593
+ ketcherId: ketcherId,
33594
+ cleanup: cleanup,
33595
+ builder: builder,
33596
+ setServer: setServer
33266
33597
  });
33267
- case 13:
33598
+ case 15:
33268
33599
  case "end":
33269
33600
  return _context.stop();
33270
33601
  }
@@ -33282,30 +33613,60 @@ var mediaSizes = {
33282
33613
  smallHeight: 600
33283
33614
  };
33284
33615
  function Editor(props) {
33616
+ var initPromiseRef = React.useRef(null);
33617
+ var appRootRef = React.useRef(null);
33618
+ var cleanupRef = React.useRef(null);
33619
+ var ketcherBuilderRef = React.useRef(null);
33620
+ var setServerRef = React.useRef(function () {});
33621
+ var structServiceProvider = props.structServiceProvider;
33285
33622
  var rootElRef = React.useRef(null);
33286
- var onInit = props.onInit;
33287
33623
  var _useResizeObserver = useThrottleResizeObserver({
33288
33624
  ref: rootElRef
33289
33625
  }),
33290
33626
  height = _useResizeObserver.height,
33291
33627
  width = _useResizeObserver.width;
33292
33628
  React.useEffect(function () {
33293
- var appRoot = client.createRoot(rootElRef.current);
33294
- buildKetcherAsync(_objectSpread(_objectSpread({}, props), {}, {
33629
+ var _ketcherBuilderRef$cu;
33630
+ (_ketcherBuilderRef$cu = ketcherBuilderRef.current) === null || _ketcherBuilderRef$cu === void 0 || _ketcherBuilderRef$cu.reinitializeApi(props.structServiceProvider, setServerRef.current);
33631
+ }, [structServiceProvider]);
33632
+ var initKetcher = function initKetcher() {
33633
+ var _initPromiseRef$curre;
33634
+ appRootRef.current = client.createRoot(rootElRef.current);
33635
+ initPromiseRef.current = buildKetcherAsync(_objectSpread(_objectSpread({}, props), {}, {
33295
33636
  element: rootElRef.current,
33296
- appRoot: appRoot
33297
- })).then(function (_ref) {
33637
+ appRoot: appRootRef.current
33638
+ }));
33639
+ (_initPromiseRef$curre = initPromiseRef.current) === null || _initPromiseRef$curre === void 0 || _initPromiseRef$curre.then(function (_ref) {
33298
33640
  var ketcher = _ref.ketcher,
33299
- ketcherId = _ref.ketcherId;
33300
- if (typeof onInit === 'function' && ketcher) {
33301
- onInit(ketcher);
33641
+ ketcherId = _ref.ketcherId,
33642
+ cleanup = _ref.cleanup,
33643
+ builder = _ref.builder,
33644
+ setServer = _ref.setServer;
33645
+ cleanupRef.current = cleanup;
33646
+ ketcherBuilderRef.current = builder;
33647
+ setServerRef.current = setServer;
33648
+ if (typeof props.onInit === 'function' && ketcher) {
33649
+ props.onInit(ketcher);
33302
33650
  var ketcherInitEvent = new Event(ketcherInitEventName(ketcherId));
33303
33651
  window.dispatchEvent(ketcherInitEvent);
33304
33652
  }
33305
33653
  });
33654
+ };
33655
+ React.useEffect(function () {
33656
+ if (initPromiseRef.current === null) {
33657
+ initKetcher();
33658
+ } else {
33659
+ var _initPromiseRef$curre2;
33660
+ (_initPromiseRef$curre2 = initPromiseRef.current) === null || _initPromiseRef$curre2 === void 0 || _initPromiseRef$curre2["finally"](function () {
33661
+ initKetcher();
33662
+ });
33663
+ }
33306
33664
  return function () {
33307
- setTimeout(function () {
33308
- appRoot.unmount();
33665
+ var _initPromiseRef$curre3;
33666
+ (_initPromiseRef$curre3 = initPromiseRef.current) === null || _initPromiseRef$curre3 === void 0 || _initPromiseRef$curre3.then(function () {
33667
+ var _cleanupRef$current, _appRootRef$current;
33668
+ (_cleanupRef$current = cleanupRef.current) === null || _cleanupRef$current === void 0 || _cleanupRef$current.call(cleanupRef);
33669
+ (_appRootRef$current = appRootRef.current) === null || _appRootRef$current === void 0 || _appRootRef$current.unmount();
33309
33670
  });
33310
33671
  };
33311
33672
  }, []);
@@ -33330,6 +33691,8 @@ exports.KETCHER_MACROMOLECULES_ROOT_NODE_SELECTOR = KETCHER_MACROMOLECULES_ROOT_
33330
33691
  exports.KETCHER_ROOT_NODE_CLASS_NAME = KETCHER_ROOT_NODE_CLASS_NAME;
33331
33692
  exports.KETCHER_ROOT_NODE_CSS_SELECTOR = KETCHER_ROOT_NODE_CSS_SELECTOR;
33332
33693
  exports.MODES = MODES;
33694
+ exports.STRUCT_SERVICE_INITIALIZED_EVENT = STRUCT_SERVICE_INITIALIZED_EVENT;
33695
+ exports.STRUCT_SERVICE_NO_RENDER_INITIALIZED_EVENT = STRUCT_SERVICE_NO_RENDER_INITIALIZED_EVENT;
33333
33696
  exports.STRUCT_TYPE = STRUCT_TYPE;
33334
33697
  exports.StructRender = StructRender;
33335
33698
  exports.getIconName = getIconName;