ketcher-react 2.9.0-rc.5-dev.1 → 2.9.0-rc.6

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.
@@ -24,7 +24,7 @@ import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
24
24
  import _regeneratorRuntime from '@babel/runtime/regenerator';
25
25
  import _classCallCheck from '@babel/runtime/helpers/classCallCheck';
26
26
  import _createClass from '@babel/runtime/helpers/createClass';
27
- import { KetSerializer, MolSerializer, Ketcher, FormatterFactory, StereLabelStyleType, StereoColoringType, Bond as Bond$2, Elements, AtomList, StereoLabel, isAttachmentBond, findStereoAtoms, RxnArrowMode, SimpleObjectMode, SGroup as SGroup$1, Pile, getStereoAtomsMap, identifyStructFormat, SupportedFormat, ChemicalMimeType, SdfSerializer, Render, FunctionalGroup, FunctionalGroupsProvider, SaltsAndSolventsProvider, KetcherAsyncEvents, ElementColor, fromAtomsAttrs, fracAngle, Vec2, Action, fromSgroupDeletion, fromFragmentDeletion, fromAtomAddition, fromBondAddition, Atom as Atom$2, fromOneBondDeletion, bondChangingAction, fromBondsAttrs, fromChain, getItemsToFuse, getHoverToFuse, fromItemsFuse, fromStereoFlagUpdate, Scale, checkOverlapping, fromSeveralSgroupAddition, SgContexts, fromSgroupAction, mergeMapOfItemsToSet, setExpandSGroup, fromSimpleObjectResizing, fromArrowResizing, fromMultipleMove, fromTextDeletion, fromTextUpdating, fromOneAtomDeletion, fromArrowDeletion, fromPlusDeletion, fromSimpleObjectDeletion, fromPaste, fromTemplateOnAtom, RGroup as RGroup$2, fromRGroupFragment, fromUpdateIfThen, fromRGroupAttrs, fromArrowAddition, fromPlusAddition, fromRotate, fromFlip, fromBondAlign, fromSimpleObjectAddition, fromTemplateOnBondAction, fromTemplateOnCanvas, fromTextCreation, formatProperties, Fragment as Fragment$1, OperationType, fromHighlightCreate, fromHighlightClear, fromNewCanvas, Struct, fromDescriptorsAlign, getPropertiesByFormat, StereoFlag, getPropertiesByImgFormat, b64toBlob, Generics, TextCommand, DefaultStructServiceOptions } from 'ketcher-core';
27
+ import { KetSerializer, MolSerializer, Ketcher, FormatterFactory, StereLabelStyleType, StereoColoringType, Bond as Bond$2, Elements, AtomList, StereoLabel, isAttachmentBond, findStereoAtoms, RxnArrowMode, SimpleObjectMode, SGroup as SGroup$1, Pile, getStereoAtomsMap, identifyStructFormat, SupportedFormat, ChemicalMimeType, SdfSerializer, Render, FunctionalGroup, FunctionalGroupsProvider, SaltsAndSolventsProvider, KetcherAsyncEvents, ElementColor, fromAtomsAttrs, fracAngle, Vec2, Action, fromSgroupDeletion, fromFragmentDeletion, fromAtomAddition, fromBondAddition, Atom as Atom$2, fromOneBondDeletion, bondChangingAction, fromBondsAttrs, fromChain, getItemsToFuse, getHoverToFuse, fromItemsFuse, fromStereoFlagUpdate, Scale, checkOverlapping, fromSeveralSgroupAddition, SgContexts, fromSgroupAction, mergeMapOfItemsToSet, setExpandSGroup, fromSimpleObjectResizing, fromArrowResizing, fromMultipleMove, fromTextDeletion, fromTextUpdating, isCloseToEdgeOfCanvas, isCloseToEdgeOfScreen, getDirections, shiftAndExtendCanvasByVector, scrollByVector, fromOneAtomDeletion, fromArrowDeletion, fromPlusDeletion, fromSimpleObjectDeletion, fromPaste, fromTemplateOnAtom, RGroup as RGroup$2, fromRGroupFragment, fromUpdateIfThen, fromRGroupAttrs, fromArrowAddition, fromPlusAddition, fromRotate, fromFlip, fromBondAlign, fromSimpleObjectAddition, fromTemplateOnBondAction, fromTemplateOnCanvas, fromTextCreation, formatProperties, Fragment as Fragment$1, OperationType, fromHighlightCreate, fromHighlightClear, fromNewCanvas, Struct, fromDescriptorsAlign, getPropertiesByFormat, StereoFlag, getPropertiesByImgFormat, b64toBlob, Generics, TextCommand, DefaultStructServiceOptions } from 'ketcher-core';
28
28
  import * as React from 'react';
29
29
  import React__default, { createRef, Component, useState, useEffect, useRef, useMemo, createElement, forwardRef, useCallback, useLayoutEffect, Fragment as Fragment$2, PureComponent } from 'react';
30
30
  import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
@@ -2476,6 +2476,9 @@ var tools$1 = typeSchema$1["enum"].reduce(function (res, type, i) {
2476
2476
 
2477
2477
  var KETCHER_INIT_EVENT_NAME = 'ketcher-init';
2478
2478
  var KETCHER_SAVED_SETTINGS_KEY = 'ketcher_editor_saved_settings';
2479
+ var MODES = {
2480
+ FG: 'fg'
2481
+ };
2479
2482
 
2480
2483
  function ownKeys$1a(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2481
2484
  function _objectSpread$1a(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$1a(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$1a(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -3010,7 +3013,7 @@ var zoom = {
3010
3013
 
3011
3014
  var openHelpLink = function openHelpLink() {
3012
3015
  var _window$open;
3013
- return (_window$open = window.open("https://github.com/epam/ketcher/blob/".concat("v2.9.0-rc.5-dev.1\n", "/documentation/help.md#ketcher-overview"))) === null || _window$open === void 0 ? void 0 : _window$open.focus();
3016
+ return (_window$open = window.open("https://github.com/epam/ketcher/blob/".concat("v2.9.0-rc.6\n", "/documentation/help.md#ketcher-overview"))) === null || _window$open === void 0 ? void 0 : _window$open.focus();
3014
3017
  };
3015
3018
  var help = {
3016
3019
  help: {
@@ -3035,7 +3038,7 @@ var functionalGroupsLib = {
3035
3038
  }
3036
3039
  },
3037
3040
  selected: function selected(editor) {
3038
- return editor._tool.mode === 'fg';
3041
+ return editor._tool.mode === MODES.FG;
3039
3042
  },
3040
3043
  disabled: function disabled(_, __, options) {
3041
3044
  return !options.app.functionalGroups;
@@ -8065,7 +8068,7 @@ function _objectSpread$10(target) { for (var i = 1; i < arguments.length; i++) {
8065
8068
  var initialState$1 = {
8066
8069
  lib: [],
8067
8070
  functionalGroupInfo: null,
8068
- mode: 'fg'
8071
+ mode: MODES.FG
8069
8072
  };
8070
8073
  var functionalGroupsReducer = function functionalGroupsReducer() {
8071
8074
  var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState$1;
@@ -8140,7 +8143,7 @@ function ownKeys$$(object, enumerableOnly) { var keys = Object.keys(object); if
8140
8143
  function _objectSpread$$(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$$(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$$(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
8141
8144
  var initialState = {
8142
8145
  lib: [],
8143
- mode: 'fg'
8146
+ mode: MODES.FG
8144
8147
  };
8145
8148
  var saltsAndSolventsReducer = function saltsAndSolventsReducer() {
8146
8149
  var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
@@ -12226,72 +12229,6 @@ function updateSelectedAtoms(_ref) {
12226
12229
  }
12227
12230
  }
12228
12231
 
12229
- var edgeOffset = 150;
12230
- function isCloseToEdgeOfScreen(event) {
12231
- var clientX = event.clientX,
12232
- clientY = event.clientY;
12233
- var body = document.body;
12234
- var isCloseToLeftEdgeOfScreen = clientX <= edgeOffset;
12235
- var isCloseToTopEdgeOfScreen = clientY <= edgeOffset;
12236
- var isCloseToRightEdgeOfScreen = body.clientWidth - clientX <= edgeOffset;
12237
- var isCloseToBottomEdgeOfScreen = body.clientHeight - clientY <= edgeOffset;
12238
- return {
12239
- isCloseToLeftEdgeOfScreen: isCloseToLeftEdgeOfScreen,
12240
- isCloseToTopEdgeOfScreen: isCloseToTopEdgeOfScreen,
12241
- isCloseToRightEdgeOfScreen: isCloseToRightEdgeOfScreen,
12242
- isCloseToBottomEdgeOfScreen: isCloseToBottomEdgeOfScreen
12243
- };
12244
- }
12245
- function isCloseToEdgeOfCanvas(event, canvasSize) {
12246
- var layerX = event.layerX,
12247
- layerY = event.layerY;
12248
- var isCloseToLeftEdgeOfCanvas = layerX <= edgeOffset;
12249
- var isCloseToTopEdgeOfCanvas = layerY <= edgeOffset;
12250
- var isCloseToRightEdgeOfCanvas = canvasSize.x - layerX <= edgeOffset;
12251
- var isCloseToBottomEdgeOfCanvas = canvasSize.y - layerY <= edgeOffset;
12252
- return {
12253
- isCloseToLeftEdgeOfCanvas: isCloseToLeftEdgeOfCanvas,
12254
- isCloseToTopEdgeOfCanvas: isCloseToTopEdgeOfCanvas,
12255
- isCloseToRightEdgeOfCanvas: isCloseToRightEdgeOfCanvas,
12256
- isCloseToBottomEdgeOfCanvas: isCloseToBottomEdgeOfCanvas
12257
- };
12258
- }
12259
- function calculateCanvasExtension(clientArea, currentCanvasSize, extensionVector) {
12260
- var newHorizontalScrollPosition = clientArea.scrollLeft + extensionVector.x;
12261
- var newVerticalScrollPosition = clientArea.scrollTop + extensionVector.y;
12262
- var horizontalExtension = 0;
12263
- var verticalExtension = 0;
12264
- if (newHorizontalScrollPosition > currentCanvasSize.x) {
12265
- horizontalExtension = newHorizontalScrollPosition - currentCanvasSize.x;
12266
- }
12267
- if (newHorizontalScrollPosition < 0) {
12268
- horizontalExtension = Math.abs(newHorizontalScrollPosition);
12269
- }
12270
- if (newVerticalScrollPosition > currentCanvasSize.y) {
12271
- verticalExtension = newVerticalScrollPosition - currentCanvasSize.y;
12272
- }
12273
- if (newVerticalScrollPosition < 0) {
12274
- verticalExtension = Math.abs(newVerticalScrollPosition);
12275
- }
12276
- return new Vec2(horizontalExtension, verticalExtension, 0);
12277
- }
12278
- function shiftAndExtendCanvasByVector(vector, render) {
12279
- var clientArea = render.clientArea;
12280
- var extensionVector = calculateCanvasExtension(clientArea, render.sz.scaled(render.options.zoom), vector).scaled(1 / render.options.zoom);
12281
- if (extensionVector.x > 0 || extensionVector.y > 0) {
12282
- render.setPaperSize(render.sz.add(extensionVector));
12283
- render.setOffset(render.options.offset.add(vector));
12284
- render.ctab.translate(vector);
12285
- }
12286
- scrollByVector(vector, render);
12287
- render.update(false);
12288
- }
12289
- function scrollByVector(vector, render) {
12290
- var clientArea = render.clientArea;
12291
- clientArea.scrollLeft += vector.x * render.options.scale;
12292
- clientArea.scrollTop += vector.y * render.options.scale;
12293
- }
12294
-
12295
12232
  function _createForOfIteratorHelper$6(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$6(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
12296
12233
  function _unsupportedIterableToArray$6(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$6(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$6(o, minLen); }
12297
12234
  function _arrayLikeToArray$6(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; }
@@ -12432,7 +12369,9 @@ var SelectTool = function () {
12432
12369
  dragCtx.mergeItems = getMergeItems(editor, expSel);
12433
12370
  editor.hover(getHoverToFuse(dragCtx.mergeItems));
12434
12371
  extendCanvas(rnd, event);
12435
- editor.update(dragCtx.action, true);
12372
+ editor.update(dragCtx.action, true, {
12373
+ extendCanvas: false
12374
+ });
12436
12375
  return true;
12437
12376
  }
12438
12377
  if (_classPrivateFieldGet(this, _lassoHelper).running()) {
@@ -12643,34 +12582,39 @@ function extendCanvas(render, event) {
12643
12582
  isCloseToTopEdgeOfScreen = _isCloseToEdgeOfScree.isCloseToTopEdgeOfScreen,
12644
12583
  isCloseToRightEdgeOfScreen = _isCloseToEdgeOfScree.isCloseToRightEdgeOfScreen,
12645
12584
  isCloseToBottomEdgeOfScreen = _isCloseToEdgeOfScree.isCloseToBottomEdgeOfScreen;
12646
- if (isCloseToLeftEdgeOfCanvas) {
12585
+ var _getDirections = getDirections(event),
12586
+ isMovingLeft = _getDirections.isMovingLeft,
12587
+ isMovingRight = _getDirections.isMovingRight,
12588
+ isMovingTop = _getDirections.isMovingTop,
12589
+ isMovingBottom = _getDirections.isMovingBottom;
12590
+ if (isCloseToLeftEdgeOfCanvas && isMovingLeft) {
12647
12591
  shiftAndExtendCanvasByVector(new Vec2(-offset, 0, 0), render);
12648
12592
  }
12649
- if (isCloseToTopEdgeOfCanvas) {
12593
+ if (isCloseToTopEdgeOfCanvas && isMovingTop) {
12650
12594
  shiftAndExtendCanvasByVector(new Vec2(0, -offset, 0), render);
12651
12595
  }
12652
- if (isCloseToRightEdgeOfCanvas) {
12596
+ if (isCloseToRightEdgeOfCanvas && isMovingRight) {
12653
12597
  shiftAndExtendCanvasByVector(new Vec2(offset, 0, 0), render);
12654
12598
  }
12655
- if (isCloseToBottomEdgeOfCanvas) {
12599
+ if (isCloseToBottomEdgeOfCanvas && isMovingBottom) {
12656
12600
  shiftAndExtendCanvasByVector(new Vec2(0, offset, 0), render);
12657
12601
  }
12658
- var isCloseToSomeEdgeOfCanvas = [isCloseToTopEdgeOfCanvas, isCloseToRightEdgeOfCanvas, isCloseToBottomEdgeOfCanvas, isCloseToLeftEdgeOfCanvas].some(function (isCloseToEdge) {
12602
+ var isCloseToSomeEdgeOfCanvas = [isCloseToTopEdgeOfCanvas && isMovingTop, isCloseToRightEdgeOfCanvas && isMovingRight, isCloseToBottomEdgeOfCanvas && isMovingBottom, isCloseToLeftEdgeOfCanvas && isMovingLeft].some(function (isCloseToEdge) {
12659
12603
  return isCloseToEdge;
12660
12604
  });
12661
12605
  if (isCloseToSomeEdgeOfCanvas) {
12662
12606
  return;
12663
12607
  }
12664
- if (isCloseToTopEdgeOfScreen) {
12608
+ if (isCloseToTopEdgeOfScreen && isMovingTop) {
12665
12609
  scrollByVector(new Vec2(0, -offset), render);
12666
12610
  }
12667
- if (isCloseToBottomEdgeOfScreen) {
12611
+ if (isCloseToBottomEdgeOfScreen && isMovingBottom) {
12668
12612
  scrollByVector(new Vec2(0, offset), render);
12669
12613
  }
12670
- if (isCloseToLeftEdgeOfScreen) {
12614
+ if (isCloseToLeftEdgeOfScreen && isMovingLeft) {
12671
12615
  scrollByVector(new Vec2(-offset, 0), render);
12672
12616
  }
12673
- if (isCloseToRightEdgeOfScreen) {
12617
+ if (isCloseToRightEdgeOfScreen && isMovingRight) {
12674
12618
  scrollByVector(new Vec2(offset, 0), render);
12675
12619
  }
12676
12620
  }
@@ -14095,7 +14039,7 @@ var TemplateTool = function () {
14095
14039
  this.findItems.push('atoms');
14096
14040
  }
14097
14041
  var bond = frag.bonds.get(this.template.bid);
14098
- if (bond && this.mode !== 'fg') {
14042
+ if (bond && !this.isModeFunctionalGroup) {
14099
14043
  this.template.sign = getSign(frag, bond, this.template.xy0);
14100
14044
  this.findItems.push('bonds');
14101
14045
  }
@@ -14109,73 +14053,119 @@ var TemplateTool = function () {
14109
14053
  editor.hoverIcon.updatePosition();
14110
14054
  }
14111
14055
  _createClass(TemplateTool, [{
14056
+ key: "showRemoveAbbreviationPopup",
14057
+ value: function showRemoveAbbreviationPopup() {
14058
+ var _this = this;
14059
+ return this.editor.event.removeFG.dispatch({
14060
+ fgIds: this.targetGroupsIds
14061
+ }).then(function () {
14062
+ _this.targetGroupsIds.length = 0;
14063
+ return Promise.resolve();
14064
+ });
14065
+ }
14066
+ }, {
14067
+ key: "isModeFunctionalGroup",
14068
+ get: function get() {
14069
+ return this.mode === MODES.FG;
14070
+ }
14071
+ }, {
14112
14072
  key: "mousedown",
14113
- value: function mousedown(event) {
14114
- var closestItem = this.editor.findItem(event, ['atoms', 'bonds', 'sgroups', 'functionalGroups']);
14115
- var ctab = this.editor.render.ctab;
14116
- var struct = ctab.molecule;
14117
- if (struct.functionalGroups.size) {
14118
- this.targetGroupsIds = getGroupIdsFromItemArrays(struct, _objectSpread$N(_objectSpread$N({}, (closestItem === null || closestItem === void 0 ? void 0 : closestItem.map) === 'atoms' && {
14119
- atoms: [closestItem.id]
14120
- }), (closestItem === null || closestItem === void 0 ? void 0 : closestItem.map) === 'bonds' && {
14121
- bonds: [closestItem.id]
14122
- }));
14123
- if ((closestItem === null || closestItem === void 0 ? void 0 : closestItem.map) === 'functionalGroups' && FunctionalGroup.isContractedFunctionalGroup(closestItem.id, struct.functionalGroups)) {
14124
- this.targetGroupsIds.push(closestItem.id);
14125
- }
14126
- }
14127
- this.editor.hover(null);
14128
- this.dragCtx = {
14129
- xy0: this.editor.render.page2obj(event),
14130
- item: this.editor.findItem(event, this.findItems)
14131
- };
14132
- var dragCtx = this.dragCtx;
14133
- var ci = dragCtx.item;
14134
- if (!ci || this.isSaltOrSolvent) {
14135
- delete dragCtx.item;
14136
- return;
14137
- }
14138
- if (ci.map === 'bonds' && this.mode !== 'fg') {
14139
- var _struct$atoms$get, _struct$halfBonds$get;
14140
- var xy0 = new Vec2();
14141
- var bond = struct.bonds.get(ci.id);
14142
- var frid = (_struct$atoms$get = struct.atoms.get(bond === null || bond === void 0 ? void 0 : bond.begin)) === null || _struct$atoms$get === void 0 ? void 0 : _struct$atoms$get.fragment;
14143
- var frIds = struct.getFragmentIds(frid);
14144
- var count = 0;
14145
- var loop = (_struct$halfBonds$get = struct.halfBonds.get(bond === null || bond === void 0 ? void 0 : bond.hb1)) === null || _struct$halfBonds$get === void 0 ? void 0 : _struct$halfBonds$get.loop;
14146
- if (loop && loop < 0) {
14147
- var _struct$halfBonds$get2;
14148
- loop = (_struct$halfBonds$get2 = struct.halfBonds.get(bond === null || bond === void 0 ? void 0 : bond.hb2)) === null || _struct$halfBonds$get2 === void 0 ? void 0 : _struct$halfBonds$get2.loop;
14149
- }
14150
- if (loop && loop >= 0) {
14151
- var _struct$loops$get;
14152
- var loopHbs = (_struct$loops$get = struct.loops.get(loop)) === null || _struct$loops$get === void 0 ? void 0 : _struct$loops$get.hbs;
14153
- loopHbs === null || loopHbs === void 0 ? void 0 : loopHbs.forEach(function (hb) {
14154
- var _struct$halfBonds$get3;
14155
- var halfBondBegin = (_struct$halfBonds$get3 = struct.halfBonds.get(hb)) === null || _struct$halfBonds$get3 === void 0 ? void 0 : _struct$halfBonds$get3.begin;
14156
- if (halfBondBegin) {
14157
- var hbbAtom = struct.atoms.get(halfBondBegin);
14158
- if (hbbAtom) {
14159
- xy0.add_(hbbAtom.pp);
14160
- count++;
14161
- }
14162
- }
14163
- });
14164
- } else {
14165
- frIds.forEach(function (id) {
14166
- var atomById = struct.atoms.get(id);
14167
- if (atomById) {
14168
- xy0.add_(atomById.pp);
14169
- count++;
14073
+ value: function () {
14074
+ var _mousedown = _asyncToGenerator( _regeneratorRuntime.mark(function _callee(event) {
14075
+ var _struct$functionalGro;
14076
+ var closestItem, ctab, struct, isTargetExpanded, isTargetAtomOrBond, dragCtx, ci, _struct$atoms$get, _struct$halfBonds$get, xy0, bond, frid, frIds, count, loop, _struct$halfBonds$get2, _struct$loops$get, loopHbs, sign;
14077
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
14078
+ while (1) {
14079
+ switch (_context.prev = _context.next) {
14080
+ case 0:
14081
+ closestItem = this.editor.findItem(event, ['atoms', 'bonds', 'sgroups', 'functionalGroups']);
14082
+ ctab = this.editor.render.ctab;
14083
+ struct = ctab.molecule;
14084
+ if (struct.functionalGroups.size) {
14085
+ this.targetGroupsIds = getGroupIdsFromItemArrays(struct, _objectSpread$N(_objectSpread$N({}, (closestItem === null || closestItem === void 0 ? void 0 : closestItem.map) === 'atoms' && {
14086
+ atoms: [closestItem.id]
14087
+ }), (closestItem === null || closestItem === void 0 ? void 0 : closestItem.map) === 'bonds' && {
14088
+ bonds: [closestItem.id]
14089
+ }));
14090
+ if (
14091
+ (closestItem === null || closestItem === void 0 ? void 0 : closestItem.map) === 'functionalGroups' && FunctionalGroup.isContractedFunctionalGroup(closestItem.id, struct.functionalGroups)) {
14092
+ this.targetGroupsIds.push(closestItem.id);
14093
+ }
14094
+ }
14095
+ isTargetExpanded = (_struct$functionalGro = struct.functionalGroups.get(this.targetGroupsIds[0])) === null || _struct$functionalGro === void 0 ? void 0 : _struct$functionalGro.isExpanded;
14096
+ isTargetAtomOrBond = this.targetGroupsIds.length && !this.isModeFunctionalGroup;
14097
+ if (!(isTargetAtomOrBond || isTargetExpanded)) {
14098
+ _context.next = 10;
14099
+ break;
14100
+ }
14101
+ _context.next = 9;
14102
+ return this.showRemoveAbbreviationPopup();
14103
+ case 9:
14104
+ return _context.abrupt("return");
14105
+ case 10:
14106
+ this.editor.hover(null);
14107
+ this.dragCtx = {
14108
+ xy0: this.editor.render.page2obj(event),
14109
+ item: this.editor.findItem(event, this.findItems)
14110
+ };
14111
+ dragCtx = this.dragCtx;
14112
+ ci = dragCtx.item;
14113
+ if (!(!ci || this.isSaltOrSolvent)) {
14114
+ _context.next = 17;
14115
+ break;
14116
+ }
14117
+ delete dragCtx.item;
14118
+ return _context.abrupt("return");
14119
+ case 17:
14120
+ if (ci.map === 'bonds' && !this.isModeFunctionalGroup) {
14121
+ xy0 = new Vec2();
14122
+ bond = struct.bonds.get(ci.id);
14123
+ frid = (_struct$atoms$get = struct.atoms.get(bond === null || bond === void 0 ? void 0 : bond.begin)) === null || _struct$atoms$get === void 0 ? void 0 : _struct$atoms$get.fragment;
14124
+ frIds = struct.getFragmentIds(frid);
14125
+ count = 0;
14126
+ loop = (_struct$halfBonds$get = struct.halfBonds.get(bond === null || bond === void 0 ? void 0 : bond.hb1)) === null || _struct$halfBonds$get === void 0 ? void 0 : _struct$halfBonds$get.loop;
14127
+ if (loop && loop < 0) {
14128
+ loop = (_struct$halfBonds$get2 = struct.halfBonds.get(bond === null || bond === void 0 ? void 0 : bond.hb2)) === null || _struct$halfBonds$get2 === void 0 ? void 0 : _struct$halfBonds$get2.loop;
14129
+ }
14130
+ if (loop && loop >= 0) {
14131
+ loopHbs = (_struct$loops$get = struct.loops.get(loop)) === null || _struct$loops$get === void 0 ? void 0 : _struct$loops$get.hbs;
14132
+ loopHbs === null || loopHbs === void 0 ? void 0 : loopHbs.forEach(function (hb) {
14133
+ var _struct$halfBonds$get3;
14134
+ var halfBondBegin = (_struct$halfBonds$get3 = struct.halfBonds.get(hb)) === null || _struct$halfBonds$get3 === void 0 ? void 0 : _struct$halfBonds$get3.begin;
14135
+ if (halfBondBegin) {
14136
+ var hbbAtom = struct.atoms.get(halfBondBegin);
14137
+ if (hbbAtom) {
14138
+ xy0.add_(hbbAtom.pp);
14139
+ count++;
14140
+ }
14141
+ }
14142
+ });
14143
+ } else {
14144
+ frIds.forEach(function (id) {
14145
+ var atomById = struct.atoms.get(id);
14146
+ if (atomById) {
14147
+ xy0.add_(atomById.pp);
14148
+ count++;
14149
+ }
14150
+ });
14151
+ }
14152
+ dragCtx.v0 = xy0.scaled(1 / count);
14153
+ sign = getSign(struct, bond, dragCtx.v0);
14154
+ dragCtx.sign1 = sign || 1;
14155
+ dragCtx.sign2 = this.template.sign;
14156
+ }
14157
+ case 18:
14158
+ case "end":
14159
+ return _context.stop();
14170
14160
  }
14171
- });
14172
- }
14173
- dragCtx.v0 = xy0.scaled(1 / count);
14174
- var sign = getSign(struct, bond, dragCtx.v0);
14175
- dragCtx.sign1 = sign || 1;
14176
- dragCtx.sign2 = this.template.sign;
14161
+ }
14162
+ }, _callee, this);
14163
+ }));
14164
+ function mousedown(_x) {
14165
+ return _mousedown.apply(this, arguments);
14177
14166
  }
14178
- }
14167
+ return mousedown;
14168
+ }()
14179
14169
  }, {
14180
14170
  key: "mousemove",
14181
14171
  value: function mousemove(event) {
@@ -14190,7 +14180,7 @@ var TemplateTool = function () {
14190
14180
  var targetPos = null;
14191
14181
  var eventPos = this.editor.render.page2obj(event);
14192
14182
  var struct = this.editor.render.ctab.molecule;
14193
- if (ci && ci.map === 'bonds' && this.mode !== 'fg') {
14183
+ if (ci && ci.map === 'bonds' && !this.isModeFunctionalGroup) {
14194
14184
  var bond = struct.bonds.get(ci.id);
14195
14185
  var sign = getSign(struct, bond, eventPos);
14196
14186
  if (dragCtx.sign1 * this.template.sign > 0) {
@@ -14221,7 +14211,7 @@ var TemplateTool = function () {
14221
14211
  var atom = struct.atoms.get(atomId);
14222
14212
  targetPos = atom === null || atom === void 0 ? void 0 : atom.pp;
14223
14213
  if (targetPos) {
14224
- extraBond = this.mode === 'fg' ? true : Vec2.dist(targetPos, eventPos) > 1;
14214
+ extraBond = this.isModeFunctionalGroup ? true : Vec2.dist(targetPos, eventPos) > 1;
14225
14215
  }
14226
14216
  }
14227
14217
  }
@@ -14267,7 +14257,7 @@ var TemplateTool = function () {
14267
14257
  }
14268
14258
  dragCtx.action = action;
14269
14259
  this.editor.update(dragCtx.action, true);
14270
- if (this.mode !== 'fg') {
14260
+ if (!this.isModeFunctionalGroup) {
14271
14261
  dragCtx.mergeItems = getItemsToFuse(this.editor, pasteItems);
14272
14262
  this.editor.hover(getHoverToFuse(dragCtx.mergeItems));
14273
14263
  }
@@ -14277,15 +14267,9 @@ var TemplateTool = function () {
14277
14267
  }, {
14278
14268
  key: "mouseup",
14279
14269
  value: function mouseup(event) {
14280
- var _this = this,
14270
+ var _this2 = this,
14281
14271
  _ci;
14282
14272
  var dragCtx = this.dragCtx;
14283
- if (this.targetGroupsIds.length && this.mode !== 'fg') {
14284
- this.editor.event.removeFG.dispatch({
14285
- fgIds: this.targetGroupsIds
14286
- });
14287
- return;
14288
- }
14289
14273
  if (!dragCtx) {
14290
14274
  return true;
14291
14275
  }
@@ -14294,16 +14278,16 @@ var TemplateTool = function () {
14294
14278
  var struct = restruct.molecule;
14295
14279
  var ci = dragCtx.item;
14296
14280
  var functionalGroups = struct.functionalGroups;
14297
- if (dragCtx.action && ci && ci.map === 'bonds' && this.mode !== 'fg') {
14281
+ if (dragCtx.action && ci && ci.map === 'bonds' && !this.isModeFunctionalGroup) {
14298
14282
  dragCtx.action.perform(restruct);
14299
14283
  var promise = fromTemplateOnBondAction(restruct, this.template, ci.id, this.editor.event, dragCtx.sign1 * dragCtx.sign2 > 0, true);
14300
14284
  promise.then(function (_ref) {
14301
14285
  var _ref2 = _slicedToArray(_ref, 2),
14302
14286
  action = _ref2[0],
14303
14287
  pasteItems = _ref2[1];
14304
- var mergeItems = getItemsToFuse(_this.editor, pasteItems);
14288
+ var mergeItems = getItemsToFuse(_this2.editor, pasteItems);
14305
14289
  action = fromItemsFuse(restruct, mergeItems).mergeWith(action);
14306
- _this.editor.update(action);
14290
+ _this2.editor.update(action);
14307
14291
  });
14308
14292
  return true;
14309
14293
  }
@@ -14312,7 +14296,7 @@ var TemplateTool = function () {
14312
14296
  if (this.isSaltOrSolvent) {
14313
14297
  addSaltsAndSolventsOnCanvasWithoutMerge(restruct, this.template, dragCtx, this.editor);
14314
14298
  return true;
14315
- } else if (((_ci = ci) === null || _ci === void 0 ? void 0 : _ci.map) === 'functionalGroups' && FunctionalGroup.isContractedFunctionalGroup(ci.id, functionalGroups) && this.mode === 'fg' && this.targetGroupsIds.length) {
14299
+ } else if (((_ci = ci) === null || _ci === void 0 ? void 0 : _ci.map) === 'functionalGroups' && FunctionalGroup.isContractedFunctionalGroup(ci.id, functionalGroups) && this.isModeFunctionalGroup && this.targetGroupsIds.length) {
14316
14300
  functionalGroupRemoveAction = new Action();
14317
14301
  var _struct = this.editor.struct();
14318
14302
  var _restruct = this.editor.render.ctab;
@@ -14360,23 +14344,23 @@ var TemplateTool = function () {
14360
14344
  action = functionalGroupRemoveAction.mergeWith(action);
14361
14345
  }
14362
14346
  dragCtx.action = action;
14363
- } else if (ci.map === 'bonds' && this.mode !== 'fg') {
14347
+ } else if (ci.map === 'bonds' && !this.isModeFunctionalGroup) {
14364
14348
  var _promise = fromTemplateOnBondAction(restruct, this.template, ci.id, this.editor.event, dragCtx.sign1 * dragCtx.sign2 > 0, true);
14365
14349
  _promise.then(function (_ref3) {
14366
14350
  var _ref4 = _slicedToArray(_ref3, 2),
14367
14351
  action = _ref4[0],
14368
14352
  pasteItems = _ref4[1];
14369
- if (_this.mode !== 'fg') {
14370
- var mergeItems = getItemsToFuse(_this.editor, pasteItems);
14353
+ if (!_this2.isModeFunctionalGroup) {
14354
+ var mergeItems = getItemsToFuse(_this2.editor, pasteItems);
14371
14355
  action = fromItemsFuse(restruct, mergeItems).mergeWith(action);
14372
- _this.editor.update(action);
14356
+ _this2.editor.update(action);
14373
14357
  }
14374
14358
  });
14375
14359
  return true;
14376
14360
  }
14377
14361
  }
14378
14362
  this.editor.selection(null);
14379
- if (!dragCtx.mergeItems && pasteItems && this.mode !== 'fg') {
14363
+ if (!dragCtx.mergeItems && pasteItems && !this.isModeFunctionalGroup) {
14380
14364
  dragCtx.mergeItems = getItemsToFuse(this.editor, pasteItems);
14381
14365
  }
14382
14366
  dragCtx.action = dragCtx.action ? fromItemsFuse(restruct, dragCtx.mergeItems).mergeWith(dragCtx.action) : fromItemsFuse(restruct, dragCtx.mergeItems);
@@ -14417,8 +14401,12 @@ function addSaltsAndSolventsOnCanvasWithoutMerge(restruct, template, dragCtx, ed
14417
14401
  }
14418
14402
  function getTemplateMode(tmpl) {
14419
14403
  var _tmpl$props;
14420
- if (tmpl.mode) return tmpl.mode;
14421
- if (['Functional Groups', 'Salts and Solvents'].includes((_tmpl$props = tmpl.props) === null || _tmpl$props === void 0 ? void 0 : _tmpl$props.group)) return 'fg';
14404
+ if (tmpl.mode) {
14405
+ return tmpl.mode;
14406
+ }
14407
+ if (['Functional Groups', 'Salts and Solvents'].includes((_tmpl$props = tmpl.props) === null || _tmpl$props === void 0 ? void 0 : _tmpl$props.group)) {
14408
+ return MODES.FG;
14409
+ }
14422
14410
  return null;
14423
14411
  }
14424
14412
  function getSign(molecule, bond, v) {
@@ -15937,7 +15925,7 @@ var HoverIcon = function () {
15937
15925
  }, {
15938
15926
  key: "onMouseLeave",
15939
15927
  value: function onMouseLeave(event) {
15940
- if (!this.isOverLoader(event)) {
15928
+ if (!this.isOverLoader(event) && this.isShown) {
15941
15929
  this.shouldBeShownWhenMouseBack = true;
15942
15930
  this.hide();
15943
15931
  }
@@ -15962,9 +15950,12 @@ var HoverIcon = function () {
15962
15950
  }
15963
15951
  }, {
15964
15952
  key: "hide",
15965
- value: function hide() {
15953
+ value: function hide(restShouldBeShownWhenMouseBack) {
15966
15954
  this.element.hide();
15967
15955
  this.isShown = false;
15956
+ if (restShouldBeShownWhenMouseBack) {
15957
+ this.shouldBeShownWhenMouseBack = false;
15958
+ }
15968
15959
  }
15969
15960
  }, {
15970
15961
  key: "initialize",
@@ -15989,9 +15980,8 @@ var HoverIcon = function () {
15989
15980
  this.element = icon.element;
15990
15981
  this._fill = icon.fill;
15991
15982
  this._label = icon.label;
15992
- this.isShown = true;
15993
15983
  this.shouldBeShownWhenMouseBack = false;
15994
- this.updatePosition();
15984
+ this.hide();
15995
15985
  }
15996
15986
  }]);
15997
15987
  return HoverIcon;
@@ -16096,7 +16086,7 @@ var Editor$3 = function () {
16096
16086
  var tool = new tools[name](this, opts);
16097
16087
  var isAtomToolChosen = name === 'atom';
16098
16088
  if (!isAtomToolChosen) {
16099
- this.hoverIcon.hide();
16089
+ this.hoverIcon.hide(true);
16100
16090
  }
16101
16091
  if (!tool || tool.isNotActiveTool) {
16102
16092
  return null;
@@ -16155,7 +16145,7 @@ var Editor$3 = function () {
16155
16145
  this.render = new Render(this.render.clientArea, Object.assign({
16156
16146
  scale: SCALE
16157
16147
  }, value));
16158
- this.render.setMolecule(struct);
16148
+ this.struct(struct);
16159
16149
  this.render.setZoom(zoom);
16160
16150
  this.render.update();
16161
16151
  return this.render.options;
@@ -24055,8 +24045,8 @@ var KetcherBuilder = function () {
24055
24045
  initApp(element, staticResourcesUrl, {
24056
24046
  buttons: buttons || {},
24057
24047
  errorHandler: errorHandler || null,
24058
- version: "2.9.0-rc.5-dev.1" ,
24059
- buildDate: "2023-03-30T12:13:55" ,
24048
+ version: "2.9.0-rc.6" ,
24049
+ buildDate: "2023-04-10T13:09:58" ,
24060
24050
  buildNumber: ''
24061
24051
  }, structService, resolve);
24062
24052
  });
@@ -24166,5 +24156,5 @@ function Editor(props) {
24166
24156
  });
24167
24157
  }
24168
24158
 
24169
- export { Editor, KETCHER_INIT_EVENT_NAME, KETCHER_SAVED_SETTINGS_KEY };
24159
+ export { Editor, KETCHER_INIT_EVENT_NAME, KETCHER_SAVED_SETTINGS_KEY, MODES };
24170
24160
  //# sourceMappingURL=index.modern.js.map