ketcher-react 2.9.0-rc.9 → 2.10.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.
Files changed (31) hide show
  1. package/dist/constants.d.ts +4 -0
  2. package/dist/index.css +1 -1
  3. package/dist/index.css.map +1 -1
  4. package/dist/index.js +926 -675
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.modern.js +928 -678
  7. package/dist/index.modern.js.map +1 -1
  8. package/dist/script/editor/Editor.d.ts +2 -1
  9. package/dist/script/editor/shared/closest.d.ts +3 -1
  10. package/dist/script/editor/tool/helper/dropAndMerge.d.ts +2 -1
  11. package/dist/script/editor/tool/select.d.ts +3 -1
  12. package/dist/script/editor/tool/template.d.ts +8 -1
  13. package/dist/script/ui/data/schema/struct-schema.d.ts +115 -98
  14. package/dist/script/ui/dialog/template/template-attach.d.ts +5 -0
  15. package/dist/script/ui/state/editor/index.d.ts +1 -1
  16. package/dist/script/ui/state/editor/utils/generateCommonProperties.d.ts +6 -0
  17. package/dist/script/ui/state/editor/utils/index.d.ts +1 -0
  18. package/dist/script/ui/state/modal/atoms.d.ts +0 -6
  19. package/dist/script/ui/state/modal/bonds.d.ts +6 -0
  20. package/dist/script/ui/state/modal/utils/index.d.ts +1 -0
  21. package/dist/script/ui/state/modal/utils/updateOnlyChangedProperties.d.ts +1 -0
  22. package/dist/script/ui/state/shared.d.ts +4 -0
  23. package/dist/script/ui/views/components/ContextMenu/hooks/useFunctionalGroupEoc.d.ts +1 -1
  24. package/dist/script/ui/views/modal/components/ExtendedTable/components/GenericGroups/BoxWithLines.d.ts +1 -1
  25. package/dist/script/ui/views/modal/components/ExtendedTable/components/GenericGroups/GenGroup.d.ts +3 -2
  26. package/dist/script/ui/views/modal/components/ExtendedTable/components/GenericGroups/GenSet.d.ts +3 -2
  27. package/dist/script/ui/views/modal/components/ExtendedTable/components/GenericGroups/GenericGroups.d.ts +3 -2
  28. package/dist/script/ui/views/modal/components/ExtendedTable/components/GenericGroups/components/ButtonGenSet/ButtonGenSet.d.ts +25 -0
  29. package/dist/script/ui/views/modal/components/ExtendedTable/components/GenericGroups/components/ButtonGenSet/index.d.ts +16 -0
  30. package/dist/script/ui/views/modal/components/ExtendedTable/components/GenericGroups/index.d.ts +1 -1
  31. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -39,8 +39,8 @@ var _typeof = require('@babel/runtime/helpers/typeof');
39
39
  var Ajv = require('ajv');
40
40
  var fp = require('lodash/fp');
41
41
  var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
42
- var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
43
42
  var reactDeviceDetect = require('react-device-detect');
43
+ var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
44
44
  var ReactDOM = require('react-dom');
45
45
  var reactRedux = require('react-redux');
46
46
  var redux = require('redux');
@@ -328,7 +328,7 @@ var debugObj = {
328
328
  }
329
329
  };
330
330
 
331
- var classes$N = {"cliparea":"cliparea-module_cliparea__GdPrN"};
331
+ var classes$O = {"cliparea":"cliparea-module_cliparea__GdPrN"};
332
332
 
333
333
  function _createSuper$c(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$c(); return function _createSuperInternal() { var Super = _getPrototypeOf__default["default"](Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf__default["default"](this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn__default["default"](this, result); }; }
334
334
  function _isNativeReflectConstruct$c() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
@@ -402,7 +402,7 @@ var ClipArea = function (_Component) {
402
402
  value: function render() {
403
403
  return jsxRuntime.jsx("textarea", {
404
404
  ref: this.textAreaRef,
405
- className: clsx__default["default"]('cliparea', classes$N.cliparea),
405
+ className: clsx__default["default"]('cliparea', classes$O.cliparea),
406
406
  contentEditable: true,
407
407
  autoFocus: true
408
408
  ,
@@ -596,8 +596,8 @@ var render = {
596
596
  },
597
597
  showHydrogenLabels: {
598
598
  title: 'Show hydrogen labels',
599
- "enum": ['off', 'Hetero', 'Terminal', 'Terminal and Hetero', 'on'],
600
- "default": 'on'
599
+ "enum": Object.values(ketcherCore.ShowHydrogenLabels),
600
+ "default": ketcherCore.ShowHydrogenLabels.TerminalAndHetero
601
601
  },
602
602
  aromaticCircle: {
603
603
  title: 'Aromatic Bonds as circle',
@@ -1494,6 +1494,11 @@ var atom = {
1494
1494
  enumNames: ['', 'Monoradical', 'Diradical (singlet)', 'Diradical (triplet)'],
1495
1495
  "default": 0
1496
1496
  },
1497
+ cip: {
1498
+ title: 'CIP',
1499
+ type: 'string',
1500
+ "enum": ['R', 'S', 'r', 's']
1501
+ },
1497
1502
  ringBondCount: {
1498
1503
  title: 'Ring bond count',
1499
1504
  "enum": [0, -2, -1, 2, 3, 4],
@@ -1580,8 +1585,8 @@ var bond = {
1580
1585
  properties: {
1581
1586
  type: {
1582
1587
  title: 'Type',
1583
- "enum": ['single', 'up', 'down', 'updown', 'double', 'crossed', 'triple', 'aromatic', 'any', 'hydrogen', 'singledouble', 'singlearomatic', 'doublearomatic', 'dative'],
1584
- enumNames: ['Single', 'Single Up', 'Single Down', 'Single Up/Down', 'Double', 'Double Cis/Trans', 'Triple', 'Aromatic', 'Any', 'Hydrogen', 'Single/Double', 'Single/Aromatic', 'Double/Aromatic', 'Dative'],
1588
+ "enum": ['', 'single', 'up', 'down', 'updown', 'double', 'crossed', 'triple', 'aromatic', 'any', 'hydrogen', 'singledouble', 'singlearomatic', 'doublearomatic', 'dative'],
1589
+ enumNames: ['', 'Single', 'Single Up', 'Single Down', 'Single Up/Down', 'Double', 'Double Cis/Trans', 'Triple', 'Aromatic', 'Any', 'Hydrogen', 'Single/Double', 'Single/Aromatic', 'Double/Aromatic', 'Dative'],
1585
1590
  "default": 'single'
1586
1591
  },
1587
1592
  topology: {
@@ -1595,6 +1600,11 @@ var bond = {
1595
1600
  "enum": [0, -1, 1, 2, 4, 8, 12],
1596
1601
  enumNames: ['Unmarked', 'Not center', 'Center', 'No change', 'Made/broken', 'Order changes', 'Made/broken and changes'],
1597
1602
  "default": 0
1603
+ },
1604
+ cip: {
1605
+ title: 'CIP',
1606
+ type: 'string',
1607
+ "enum": ['E', 'Z', 'M', 'P']
1598
1608
  }
1599
1609
  }
1600
1610
  };
@@ -1875,7 +1885,7 @@ function fromBondType(type, stereo) {
1875
1885
  for (var caption in bondCaptionMap) {
1876
1886
  if (bondCaptionMap[caption].type === type && bondCaptionMap[caption].stereo === stereo) return caption;
1877
1887
  }
1878
- throw Error('No such bond caption');
1888
+ return '';
1879
1889
  }
1880
1890
  var bondCaptionMap = {
1881
1891
  single: {
@@ -1985,9 +1995,9 @@ function toSgroup(sgroup) {
1985
1995
  };
1986
1996
  }
1987
1997
 
1988
- function _createForOfIteratorHelper$e(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$e(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; } } }; }
1989
- function _unsupportedIterableToArray$e(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$e(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$e(o, minLen); }
1990
- function _arrayLikeToArray$e(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; }
1998
+ function _createForOfIteratorHelper$d(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$d(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; } } }; }
1999
+ function _unsupportedIterableToArray$d(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$d(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$d(o, minLen); }
2000
+ function _arrayLikeToArray$d(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; }
1991
2001
  function isFlipDisabled(editor) {
1992
2002
  var selection = editor.selection();
1993
2003
  var restruct = editor.render.ctab;
@@ -1998,74 +2008,54 @@ function isFlipDisabled(editor) {
1998
2008
  bonds = _selection$bonds === void 0 ? [] : _selection$bonds,
1999
2009
  _selection$atoms = selection.atoms,
2000
2010
  atoms = _selection$atoms === void 0 ? [] : _selection$atoms;
2001
- var getBondIdsForAtom = function getBondIdsForAtom(atomId) {
2011
+ var getBondIdsForAttachmentAtoms = function getBondIdsForAttachmentAtoms() {
2002
2012
  var result = [];
2003
- var _iterator = _createForOfIteratorHelper$e(restruct.bonds.entries()),
2013
+ var _iterator = _createForOfIteratorHelper$d(atoms),
2004
2014
  _step;
2005
2015
  try {
2006
2016
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
2007
- var _step$value = _slicedToArray__default["default"](_step.value, 2),
2008
- bondId = _step$value[0],
2009
- bond = _step$value[1];
2010
- if (bond.b.begin === atomId || bond.b.end === atomId) {
2011
- result.push(bondId);
2012
- }
2013
- }
2014
- } catch (err) {
2015
- _iterator.e(err);
2016
- } finally {
2017
- _iterator.f();
2018
- }
2019
- return result;
2020
- };
2021
- var getBondIdsForAttachmentAtoms = function getBondIdsForAttachmentAtoms() {
2022
- var result = [];
2023
- var _iterator2 = _createForOfIteratorHelper$e(atoms),
2024
- _step2;
2025
- try {
2026
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
2027
- var atomId = _step2.value;
2028
- var atomBondIds = getBondIdsForAtom(atomId);
2029
- var _iterator3 = _createForOfIteratorHelper$e(atomBondIds),
2030
- _step3;
2017
+ var atomId = _step.value;
2018
+ var atomBondIds = ketcherCore.Atom.getConnectedBondIds(restruct.molecule, atomId);
2019
+ var _iterator2 = _createForOfIteratorHelper$d(atomBondIds),
2020
+ _step2;
2031
2021
  try {
2032
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
2033
- var atomBondId = _step3.value;
2022
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
2023
+ var atomBondId = _step2.value;
2034
2024
  var bond = restruct.bonds.get(atomBondId);
2035
2025
  if (bond && ketcherCore.isAttachmentBond(bond.b, selection)) {
2036
2026
  result.push(atomBondId);
2037
2027
  }
2038
2028
  }
2039
2029
  } catch (err) {
2040
- _iterator3.e(err);
2030
+ _iterator2.e(err);
2041
2031
  } finally {
2042
- _iterator3.f();
2032
+ _iterator2.f();
2043
2033
  }
2044
2034
  }
2045
2035
  } catch (err) {
2046
- _iterator2.e(err);
2036
+ _iterator.e(err);
2047
2037
  } finally {
2048
- _iterator2.f();
2038
+ _iterator.f();
2049
2039
  }
2050
2040
  return result;
2051
2041
  };
2052
2042
  var getAmountOfAttachmentBonds = function getAmountOfAttachmentBonds() {
2053
2043
  var amountOfAttachmentBonds = 0;
2054
2044
  var totalBondIds = new Set([].concat(_toConsumableArray__default["default"](bonds), _toConsumableArray__default["default"](getBondIdsForAttachmentAtoms())));
2055
- var _iterator4 = _createForOfIteratorHelper$e(totalBondIds),
2056
- _step4;
2045
+ var _iterator3 = _createForOfIteratorHelper$d(totalBondIds),
2046
+ _step3;
2057
2047
  try {
2058
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
2059
- var bondId = _step4.value;
2048
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
2049
+ var bondId = _step3.value;
2060
2050
  var bond = restruct.bonds.get(bondId);
2061
2051
  if (bond && ketcherCore.isAttachmentBond(bond.b, selection)) {
2062
2052
  amountOfAttachmentBonds++;
2063
2053
  }
2064
2054
  }
2065
2055
  } catch (err) {
2066
- _iterator4.e(err);
2056
+ _iterator3.e(err);
2067
2057
  } finally {
2068
- _iterator4.f();
2058
+ _iterator3.f();
2069
2059
  }
2070
2060
  return amountOfAttachmentBonds;
2071
2061
  };
@@ -2542,6 +2532,10 @@ var KETCHER_SAVED_SETTINGS_KEY = 'ketcher_editor_saved_settings';
2542
2532
  var MODES = {
2543
2533
  FG: 'fg'
2544
2534
  };
2535
+ var STRUCT_TYPE = {
2536
+ atoms: 'atoms',
2537
+ bonds: 'bonds'
2538
+ };
2545
2539
 
2546
2540
  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; }
2547
2541
  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__default["default"](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; }
@@ -2622,10 +2616,14 @@ function parseStruct(struct, server, options) {
2622
2616
  return Promise.resolve(struct);
2623
2617
  }
2624
2618
  }
2619
+ function removeStructAction() {
2620
+ var savedSelectedTool = SettingsManager.selectionTool;
2621
+ return onAction(savedSelectedTool || tools$1['select-rectangle'].action);
2622
+ }
2625
2623
  function load(struct, options) {
2626
2624
  return function () {
2627
2625
  var _ref = _asyncToGenerator__default["default"]( _regeneratorRuntime__default["default"].mark(function _callee(dispatch, getState) {
2628
- var state, editor, server, errorHandler, parsedStruct, _options2, fragment, hasUnsupportedGroups, oldStruct, stereAtomsMap, savedSelectedTool;
2626
+ var state, editor, server, errorHandler, parsedStruct, _options2, fragment, hasUnsupportedGroups, oldStruct, stereAtomsMap;
2629
2627
  return _regeneratorRuntime__default["default"].wrap(function _callee$(_context) {
2630
2628
  while (1) {
2631
2629
  switch (_context.prev = _context.next) {
@@ -2690,11 +2688,7 @@ function load(struct, options) {
2690
2688
  parsedStruct.markFragments();
2691
2689
  if (fragment) {
2692
2690
  if (parsedStruct.isBlank()) {
2693
- savedSelectedTool = SettingsManager.selectionTool;
2694
- dispatch({
2695
- type: 'ACTION',
2696
- action: savedSelectedTool || tools$1['select-rectangle'].action
2697
- });
2691
+ dispatch(removeStructAction());
2698
2692
  } else {
2699
2693
  dispatch(onAction({
2700
2694
  tool: 'paste',
@@ -3022,7 +3016,7 @@ var templates = templates$1.reduce(function (res, struct, i) {
3022
3016
  var zoomList = [0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.7, 2, 2.5, 3, 3.5, 4];
3023
3017
  var zoom = {
3024
3018
  zoom: {
3025
- shortcut: ['Mod+Shift+0'],
3019
+ shortcut: ['Mod+0'],
3026
3020
  selected: function selected(editor) {
3027
3021
  return editor.zoom();
3028
3022
  },
@@ -3076,7 +3070,7 @@ var zoom = {
3076
3070
 
3077
3071
  var openHelpLink = function openHelpLink() {
3078
3072
  var _window$open;
3079
- return (_window$open = window.open("https://github.com/epam/ketcher/blob/".concat("v2.9.0-rc.9\n", "/documentation/help.md#ketcher-overview"))) === null || _window$open === void 0 ? void 0 : _window$open.focus();
3073
+ return (_window$open = window.open("https://github.com/epam/ketcher/blob/".concat("v2.10.0-rc.2\n", "/documentation/help.md#ketcher-overview"))) === null || _window$open === void 0 ? void 0 : _window$open.focus();
3080
3074
  };
3081
3075
  var help = {
3082
3076
  help: {
@@ -7055,7 +7049,7 @@ function Icon(_ref) {
7055
7049
  return jsxRuntime.jsx(Component, _objectSpread$17({}, props));
7056
7050
  }
7057
7051
 
7058
- var classes$M = {"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"};
7052
+ var classes$N = {"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"};
7059
7053
 
7060
7054
  var shortcutAliasMap = {
7061
7055
  Escape: 'Esc',
@@ -7094,10 +7088,11 @@ var ActionButton = function ActionButton(props) {
7094
7088
  }
7095
7089
  };
7096
7090
  return jsxRuntime.jsxs("button", {
7091
+ "data-testid": name,
7097
7092
  disabled: disabled,
7098
7093
  onClick: handleClick,
7099
7094
  title: shortcut ? "".concat(action === null || action === void 0 ? void 0 : action.title, " (").concat(shortcut, ")") : action === null || action === void 0 ? void 0 : action.title,
7100
- className: clsx__default["default"](classes$M.button, _defineProperty__default["default"]({}, classes$M.selected, selected), className),
7095
+ className: clsx__default["default"](classes$N.button, _defineProperty__default["default"]({}, classes$N.selected, selected), className),
7101
7096
  children: [jsxRuntime.jsx(Icon, {
7102
7097
  name: name
7103
7098
  }), jsxRuntime.jsx("kbd", {
@@ -7253,7 +7248,7 @@ var DefaultMultiTool = function DefaultMultiTool(props) {
7253
7248
  });
7254
7249
  };
7255
7250
 
7256
- var classes$L = {"group":"GroupedMultiTool-module_group__BJQAU"};
7251
+ var classes$M = {"group":"GroupedMultiTool-module_group__BJQAU"};
7257
7252
 
7258
7253
  var GroupedMultiTool = function GroupedMultiTool(props) {
7259
7254
  var groups = props.groups,
@@ -7268,7 +7263,7 @@ var GroupedMultiTool = function GroupedMultiTool(props) {
7268
7263
  return jsxRuntime.jsx(jsxRuntime.Fragment, {
7269
7264
  children: groups.map(function (descriptor) {
7270
7265
  return jsxRuntime.jsx("div", {
7271
- className: classes$L.group,
7266
+ className: classes$M.group,
7272
7267
  children: options.slice(descriptor.start, descriptor.end).map(function (toolbarItem) {
7273
7268
  var currentStatus = status[toolbarItem.id];
7274
7269
  return jsxRuntime.jsx(ActionButton, {
@@ -7298,7 +7293,7 @@ function chooseMultiTool() {
7298
7293
  }
7299
7294
  }
7300
7295
 
7301
- var classes$K = {"button-common-styles":"ToolbarMultiToolItem-module_button-common-styles__Fuxbo","scrollbar":"ToolbarMultiToolItem-module_scrollbar__XTmfz","icon":"ToolbarMultiToolItem-module_icon__-HQal","iconSelected":"ToolbarMultiToolItem-module_iconSelected__hlO0J","portal":"ToolbarMultiToolItem-module_portal__2XJgz","portal-vertical":"ToolbarMultiToolItem-module_portal-vertical__A0DVe"};
7296
+ var classes$L = {"button-common-styles":"ToolbarMultiToolItem-module_button-common-styles__Fuxbo","scrollbar":"ToolbarMultiToolItem-module_scrollbar__XTmfz","icon":"ToolbarMultiToolItem-module_icon__-HQal","iconSelected":"ToolbarMultiToolItem-module_iconSelected__hlO0J","portal":"ToolbarMultiToolItem-module_portal__2XJgz","portal-vertical":"ToolbarMultiToolItem-module_portal-vertical__A0DVe"};
7302
7297
 
7303
7298
  function usePortalOpening(_ref) {
7304
7299
  var _ref2 = _slicedToArray__default["default"](_ref, 3),
@@ -7417,7 +7412,7 @@ var ToolbarMultiToolItem = function ToolbarMultiToolItem(props) {
7417
7412
  portalClassName = _chooseMultiTool2[1];
7418
7413
  return displayMultiToolItem ? jsxRuntime.jsxs("div", {
7419
7414
  ref: ref,
7420
- className: classes$K.root,
7415
+ className: classes$L.root,
7421
7416
  children: [jsxRuntime.jsx(ActionButton, _objectSpread$16(_objectSpread$16({}, actionButtonProps), {}, {
7422
7417
  className: className,
7423
7418
  name: currentId,
@@ -7425,12 +7420,12 @@ var ToolbarMultiToolItem = function ToolbarMultiToolItem(props) {
7425
7420
  status: currentStatus,
7426
7421
  selected: selected
7427
7422
  })), !isOpen && jsxRuntime.jsx(Icon, {
7428
- className: "".concat(classes$K.icon, " ").concat((currentStatus === null || currentStatus === void 0 ? void 0 : currentStatus.selected) && classes$K.iconSelected),
7423
+ className: "".concat(classes$L.icon, " ").concat((currentStatus === null || currentStatus === void 0 ? void 0 : currentStatus.selected) && classes$L.iconSelected),
7429
7424
  name: "dropdown",
7430
7425
  onClick: onOpenOptions
7431
7426
  }), isOpen ? jsxRuntime.jsx(Portal, {
7432
7427
  isOpen: isOpen,
7433
- className: clsx__default["default"](classes$K.portal, vertical && classes$K['portal-vertical'], portalClassName),
7428
+ className: clsx__default["default"](classes$L.portal, vertical && classes$L['portal-vertical'], portalClassName),
7434
7429
  style: portalStyle,
7435
7430
  children: jsxRuntime.jsx(Component, {
7436
7431
  options: options,
@@ -7515,7 +7510,7 @@ var TemplatesList = function TemplatesList(props) {
7515
7510
  });
7516
7511
  };
7517
7512
 
7518
- var classes$J = {"button-common-styles":"BottomToolbar-module_button-common-styles__PbtE9","scrollbar":"BottomToolbar-module_scrollbar__i1f8P","group":"BottomToolbar-module_group__b-pGt","root":"BottomToolbar-module_root__kjkSm"};
7513
+ var classes$K = {"button-common-styles":"BottomToolbar-module_button-common-styles__PbtE9","scrollbar":"BottomToolbar-module_scrollbar__i1f8P","group":"BottomToolbar-module_group__b-pGt","root":"BottomToolbar-module_root__kjkSm"};
7519
7514
 
7520
7515
  var _excluded$A = ["className"];
7521
7516
  function ownKeys$15(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; }
@@ -7524,7 +7519,7 @@ var Group$1 = function Group(_ref) {
7524
7519
  var children = _ref.children,
7525
7520
  className = _ref.className;
7526
7521
  return jsxRuntime.jsx("div", {
7527
- className: clsx__default["default"](classes$J.group, className),
7522
+ className: clsx__default["default"](classes$K.group, className),
7528
7523
  children: children
7529
7524
  });
7530
7525
  };
@@ -7536,7 +7531,7 @@ var BottomToolbar = function BottomToolbar(props) {
7536
7531
  indigoVerification = rest.indigoVerification,
7537
7532
  onAction = rest.onAction;
7538
7533
  return jsxRuntime.jsxs("div", {
7539
- className: clsx__default["default"](classes$J.root, className),
7534
+ className: clsx__default["default"](classes$K.root, className),
7540
7535
  children: [jsxRuntime.jsx(Group$1, {
7541
7536
  children: jsxRuntime.jsx(TemplatesList, {
7542
7537
  active: active,
@@ -7952,9 +7947,11 @@ var RenderStruct = function () {
7952
7947
  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
7953
7948
  if (el && struct) {
7954
7949
  var _options$cachePrefix = options.cachePrefix,
7955
- cachePrefix = _options$cachePrefix === void 0 ? '' : _options$cachePrefix;
7950
+ cachePrefix = _options$cachePrefix === void 0 ? '' : _options$cachePrefix,
7951
+ _options$needCache = options.needCache,
7952
+ needCache = _options$needCache === void 0 ? true : _options$needCache;
7956
7953
  var cacheKey = "".concat(cachePrefix).concat(struct.name);
7957
- if (renderCache.has(cacheKey)) {
7954
+ if (renderCache.has(cacheKey) && needCache) {
7958
7955
  el.innerHTML = renderCache.get(cacheKey);
7959
7956
  return;
7960
7957
  }
@@ -7968,7 +7965,9 @@ var RenderStruct = function () {
7968
7965
  }, options));
7969
7966
  rnd.setMolecule(preparedStruct);
7970
7967
  rnd.update(true, options.viewSz);
7971
- renderCache.set(cacheKey, rnd.clientArea.innerHTML);
7968
+ if (needCache) {
7969
+ renderCache.set(cacheKey, rnd.clientArea.innerHTML);
7970
+ }
7972
7971
  }
7973
7972
  }
7974
7973
  }]);
@@ -8095,6 +8094,26 @@ function memoizedDebounce(func) {
8095
8094
 
8096
8095
  var showTooltipTimer = null;
8097
8096
  var TOOLTIP_DELAY = 300;
8097
+ function makeStruct(editor, sGroup) {
8098
+ var existingStruct = editor.struct();
8099
+ var struct = new ketcherCore.Struct();
8100
+ var atomsIdMapping = new Map();
8101
+ sGroup.atoms.forEach(function (atomId) {
8102
+ var atomIdInTooltip = struct.atoms.add(existingStruct.atoms.get(atomId));
8103
+ atomsIdMapping.set(atomId, atomIdInTooltip);
8104
+ });
8105
+ Array.from(existingStruct.bonds).forEach(function (value) {
8106
+ var _value = _slicedToArray__default["default"](value, 2);
8107
+ _value[0];
8108
+ var bond = _value[1];
8109
+ var clonedBond = bond.clone(atomsIdMapping);
8110
+ var isInsideSGroup = sGroup.atoms.includes(bond.begin) || sGroup.atoms.includes(bond.end);
8111
+ if (isInsideSGroup) {
8112
+ struct.bonds.add(clonedBond);
8113
+ }
8114
+ });
8115
+ return struct;
8116
+ }
8098
8117
  function showTooltip(editor, infoPanelData) {
8099
8118
  editor.event.showInfo.dispatch(null);
8100
8119
  if (showTooltipTimer) {
@@ -8113,9 +8132,10 @@ function showFunctionalGroupsTooltip(editor) {
8113
8132
  if (closestCollapsibleStructures) {
8114
8133
  var _editor$struct;
8115
8134
  var sGroup = (_editor$struct = editor.struct()) === null || _editor$struct === void 0 ? void 0 : _editor$struct.sgroups.get(closestCollapsibleStructures.id);
8116
- if (sGroup && !sGroup.data.expanded) {
8135
+ if (sGroup && !sGroup.data.expanded && sGroup.hovering) {
8117
8136
  var groupName = sGroup.data.name;
8118
- var groupStruct = ketcherCore.FunctionalGroup.getFunctionalGroupByName(groupName);
8137
+ var groupStruct = makeStruct(editor, sGroup);
8138
+ groupStruct.name = groupName;
8119
8139
  infoPanelData = {
8120
8140
  groupStruct: groupStruct,
8121
8141
  event: event,
@@ -8522,7 +8542,7 @@ var selectOptions$2 = makeItems(['select-rectangle', 'select-lasso', 'select-fra
8522
8542
  var arrowsOptions = makeItems(['reaction-arrow-open-angle', 'reaction-arrow-filled-triangle', 'reaction-arrow-filled-bow', 'reaction-arrow-dashed-open-angle', 'reaction-arrow-failed', 'reaction-arrow-both-ends-filled-triangle', 'reaction-arrow-equilibrium-filled-half-bow', 'reaction-arrow-equilibrium-filled-triangle', 'reaction-arrow-equilibrium-open-angle', 'reaction-arrow-unbalanced-equilibrium-filled-half-bow', 'reaction-arrow-unbalanced-equilibrium-open-half-angle', 'reaction-arrow-unbalanced-equilibrium-large-filled-half-bow', 'reaction-arrow-unbalanced-equilibrium-filled-half-triangle', 'reaction-arrow-elliptical-arc-arrow-filled-bow', 'reaction-arrow-elliptical-arc-arrow-filled-triangle', 'reaction-arrow-elliptical-arc-arrow-open-angle', 'reaction-arrow-elliptical-arc-arrow-open-half-angle']);
8523
8543
  var mappingOptions = makeItems(['reaction-map', 'reaction-unmap', 'reaction-automap']);
8524
8544
 
8525
- var classes$I = {"scroll":"ArrowScroll-module_scroll__h9kCx","button":"ArrowScroll-module_button__ygMgL","down":"ArrowScroll-module_down__yDzZX","up":"ArrowScroll-module_up__Q1ubd"};
8545
+ var classes$J = {"scroll":"ArrowScroll-module_scroll__h9kCx","button":"ArrowScroll-module_button__ygMgL","down":"ArrowScroll-module_down__yDzZX","up":"ArrowScroll-module_up__Q1ubd"};
8526
8546
 
8527
8547
  function useSettingsContext() {
8528
8548
  return React__default["default"].useContext(settingsContext);
@@ -8641,7 +8661,7 @@ var ArrowScroll = function ArrowScroll(_ref) {
8641
8661
  };
8642
8662
  }, [endInView]);
8643
8663
  return jsxRuntime.jsxs("div", {
8644
- className: classes$I.scroll,
8664
+ className: classes$J.scroll,
8645
8665
  children: [endInView ? jsxRuntime.jsx(jsxRuntime.Fragment, {}) : jsxRuntime.jsx("button", {
8646
8666
  onClick: function onClick() {
8647
8667
  return scrollDown();
@@ -8652,7 +8672,7 @@ var ArrowScroll = function ArrowScroll(_ref) {
8652
8672
  onMouseDown: function onMouseDown() {
8653
8673
  return setScrollDown(true);
8654
8674
  },
8655
- className: clsx__default["default"](classes$I.button, classes$I.down),
8675
+ className: clsx__default["default"](classes$J.button, classes$J.down),
8656
8676
  children: "\u25BC"
8657
8677
  }), startInView ? jsxRuntime.jsx(jsxRuntime.Fragment, {}) : jsxRuntime.jsx("button", {
8658
8678
  onClick: function onClick() {
@@ -8664,7 +8684,7 @@ var ArrowScroll = function ArrowScroll(_ref) {
8664
8684
  onMouseDown: function onMouseDown() {
8665
8685
  return setScrollUp(true);
8666
8686
  },
8667
- className: clsx__default["default"](classes$I.button, classes$I.up),
8687
+ className: clsx__default["default"](classes$J.button, classes$J.up),
8668
8688
  children: "\u25B2"
8669
8689
  })]
8670
8690
  });
@@ -8750,7 +8770,7 @@ var Transform = function Transform(props) {
8750
8770
  });
8751
8771
  };
8752
8772
 
8753
- var classes$H = {"button-common-styles":"LeftToolbar-module_button-common-styles__WgnON","scrollbar":"LeftToolbar-module_scrollbar__OBwid","group":"LeftToolbar-module_group__0s41t","root":"LeftToolbar-module_root__yhhZm","buttons":"LeftToolbar-module_buttons__lnIjn","borderOff":"LeftToolbar-module_borderOff__om425","groupItem":"LeftToolbar-module_groupItem__OqQu0"};
8773
+ var classes$I = {"button-common-styles":"LeftToolbar-module_button-common-styles__WgnON","scrollbar":"LeftToolbar-module_scrollbar__OBwid","group":"LeftToolbar-module_group__0s41t","root":"LeftToolbar-module_root__yhhZm","buttons":"LeftToolbar-module_buttons__lnIjn","borderOff":"LeftToolbar-module_borderOff__om425","groupItem":"LeftToolbar-module_groupItem__OqQu0"};
8754
8774
 
8755
8775
  var _excluded$v = ["className"];
8756
8776
  function ownKeys$T(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; }
@@ -8810,7 +8830,7 @@ var LeftToolbar = function LeftToolbar(props) {
8810
8830
  });
8811
8831
  }
8812
8832
  return visibleItems.length ? jsxRuntime.jsx("div", {
8813
- className: clsx__default["default"](classes$H.group, className),
8833
+ className: clsx__default["default"](classes$I.group, className),
8814
8834
  children: visibleItems.map(function (item) {
8815
8835
  switch (item.id) {
8816
8836
  case 'bond-common':
@@ -8841,16 +8861,16 @@ var LeftToolbar = function LeftToolbar(props) {
8841
8861
  }) : null;
8842
8862
  };
8843
8863
  return jsxRuntime.jsxs("div", {
8844
- className: clsx__default["default"](classes$H.root, className),
8864
+ className: clsx__default["default"](classes$I.root, className),
8845
8865
  ref: ref,
8846
8866
  children: [jsxRuntime.jsxs("div", {
8847
- className: classes$H.buttons,
8867
+ className: classes$I.buttons,
8848
8868
  ref: scrollRef,
8849
8869
  children: [jsxRuntime.jsx("div", {
8850
- className: classes$H.listener,
8870
+ className: classes$I.listener,
8851
8871
  ref: startRef,
8852
8872
  children: jsxRuntime.jsx(Group, {
8853
- className: classes$H.groupItem,
8873
+ className: classes$I.groupItem,
8854
8874
  items: [{
8855
8875
  id: 'hand'
8856
8876
  }, {
@@ -8861,7 +8881,7 @@ var LeftToolbar = function LeftToolbar(props) {
8861
8881
  }]
8862
8882
  })
8863
8883
  }), jsxRuntime.jsx(Group, {
8864
- className: classes$H.groupItem,
8884
+ className: classes$I.groupItem,
8865
8885
  items: [{
8866
8886
  id: 'bonds',
8867
8887
  options: [].concat(_toConsumableArray__default["default"](bondCommon), _toConsumableArray__default["default"](bondQuery), _toConsumableArray__default["default"](bondSpecial), _toConsumableArray__default["default"](bondStereo))
@@ -8869,30 +8889,30 @@ var LeftToolbar = function LeftToolbar(props) {
8869
8889
  id: 'chain'
8870
8890
  }]
8871
8891
  }), jsxRuntime.jsx(Group, {
8872
- className: classes$H.groupItem,
8892
+ className: classes$I.groupItem,
8873
8893
  items: [{
8874
8894
  id: 'enhanced-stereo'
8875
8895
  }]
8876
8896
  }), jsxRuntime.jsx(Group, {
8877
- className: classes$H.groupItem,
8897
+ className: classes$I.groupItem,
8878
8898
  items: [{
8879
8899
  id: 'charge-plus'
8880
8900
  }, {
8881
8901
  id: 'charge-minus'
8882
8902
  }]
8883
8903
  }), jsxRuntime.jsx(Group, {
8884
- className: classes$H.groupItem,
8904
+ className: classes$I.groupItem,
8885
8905
  items: [{
8886
8906
  id: 'transforms',
8887
8907
  options: transformOptions
8888
8908
  }]
8889
8909
  }), jsxRuntime.jsx(Group, {
8890
- className: classes$H.groupItem,
8910
+ className: classes$I.groupItem,
8891
8911
  items: [{
8892
8912
  id: 'sgroup'
8893
8913
  }]
8894
8914
  }), jsxRuntime.jsx(Group, {
8895
- className: classes$H.groupItem,
8915
+ className: classes$I.groupItem,
8896
8916
  items: [{
8897
8917
  id: 'reaction-plus'
8898
8918
  }, {
@@ -8903,17 +8923,17 @@ var LeftToolbar = function LeftToolbar(props) {
8903
8923
  options: mappingOptions
8904
8924
  }]
8905
8925
  }), jsxRuntime.jsx("div", {
8906
- className: classes$H.listener,
8926
+ className: classes$I.listener,
8907
8927
  ref: sizeRef,
8908
8928
  children: jsxRuntime.jsx(Group, {
8909
- className: classes$H.groupItem,
8929
+ className: classes$I.groupItem,
8910
8930
  items: [{
8911
8931
  id: 'rgroup',
8912
8932
  options: rGroupOptions
8913
8933
  }]
8914
8934
  })
8915
8935
  }), jsxRuntime.jsx(Group, {
8916
- className: classes$H.groupItem,
8936
+ className: classes$I.groupItem,
8917
8937
  items: [{
8918
8938
  id: 'shapes',
8919
8939
  options: shapeOptions
@@ -8921,7 +8941,7 @@ var LeftToolbar = function LeftToolbar(props) {
8921
8941
  }), jsxRuntime.jsx("div", {
8922
8942
  ref: endRef,
8923
8943
  children: jsxRuntime.jsx(Group, {
8924
- className: classes$H.groupItem,
8944
+ className: classes$I.groupItem,
8925
8945
  items: [{
8926
8946
  id: 'text'
8927
8947
  }]
@@ -8962,7 +8982,7 @@ var mapDispatchToProps$h = function mapDispatchToProps(dispatch) {
8962
8982
  };
8963
8983
  var LeftToolbarContainer = reactRedux.connect(mapStateToProps$i, mapDispatchToProps$h)(LeftToolbar);
8964
8984
 
8965
- var classes$G = {"button-common-styles":"Atom-module_button-common-styles__j3EUJ","scrollbar":"Atom-module_scrollbar__iO-Ni","atom":"Atom-module_atom__g2RUu"};
8985
+ var classes$H = {"button-common-styles":"Atom-module_button-common-styles__j3EUJ","scrollbar":"Atom-module_scrollbar__iO-Ni","atom":"Atom-module_atom__g2RUu"};
8966
8986
 
8967
8987
  var _excluded$u = ["el", "shortcut", "selected"];
8968
8988
  function ownKeys$S(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; }
@@ -8974,7 +8994,7 @@ function Atom$1(_ref) {
8974
8994
  props = _objectWithoutProperties__default["default"](_ref, _excluded$u);
8975
8995
  return jsxRuntime.jsx("button", _objectSpread$S(_objectSpread$S({
8976
8996
  title: shortcut ? "".concat(el.title, " (").concat(shortcut, ")") : el.title,
8977
- className: clsx__default["default"](classes$G.atom, {
8997
+ className: clsx__default["default"](classes$H.atom, {
8978
8998
  selected: selected
8979
8999
  }),
8980
9000
  value: el.number
@@ -9353,7 +9373,7 @@ var AtomsList = React.forwardRef(function (props, ref) {
9353
9373
  });
9354
9374
  });
9355
9375
 
9356
- var classes$F = {"button-common-styles":"RightToolbar-module_button-common-styles__fNlqY","scrollbar":"RightToolbar-module_scrollbar__2Q0UU","group":"RightToolbar-module_group__3mhUx","root":"RightToolbar-module_root__1D5hp","atomsList":"RightToolbar-module_atomsList__ar08-","buttons":"RightToolbar-module_buttons__YxRHI"};
9376
+ var classes$G = {"button-common-styles":"RightToolbar-module_button-common-styles__fNlqY","scrollbar":"RightToolbar-module_scrollbar__2Q0UU","group":"RightToolbar-module_group__3mhUx","root":"RightToolbar-module_root__1D5hp","atomsList":"RightToolbar-module_atomsList__ar08-","buttons":"RightToolbar-module_buttons__YxRHI"};
9357
9377
 
9358
9378
  var _excluded$t = ["className"];
9359
9379
  function ownKeys$R(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; }
@@ -9362,7 +9382,7 @@ var Group = function Group(_ref) {
9362
9382
  var children = _ref.children,
9363
9383
  className = _ref.className;
9364
9384
  return jsxRuntime.jsx("div", {
9365
- className: clsx__default["default"](classes$F.group, className),
9385
+ className: clsx__default["default"](classes$G.group, className),
9366
9386
  children: children
9367
9387
  });
9368
9388
  };
@@ -9393,12 +9413,12 @@ var RightToolbar = function RightToolbar(props) {
9393
9413
  scrollRef.current.scrollTop += sizeRef.current.offsetHeight;
9394
9414
  };
9395
9415
  return jsxRuntime.jsxs("div", {
9396
- className: clsx__default["default"](classes$F.root, className),
9416
+ className: clsx__default["default"](classes$G.root, className),
9397
9417
  children: [jsxRuntime.jsxs("div", {
9398
- className: classes$F.buttons,
9418
+ className: classes$G.buttons,
9399
9419
  ref: scrollRef,
9400
9420
  children: [jsxRuntime.jsxs(Group, {
9401
- className: classes$F.atomsList,
9421
+ className: classes$G.atomsList,
9402
9422
  children: [jsxRuntime.jsx(AtomsList, {
9403
9423
  ref: startRef,
9404
9424
  atoms: basicAtoms,
@@ -10111,7 +10131,8 @@ var mapDispatchToProps$e = function mapDispatchToProps(dispatch) {
10111
10131
  return dispatchAction('open');
10112
10132
  },
10113
10133
  onSave: function onSave() {
10114
- return dispatchAction('save');
10134
+ dispatch(removeStructAction());
10135
+ dispatchAction('save');
10115
10136
  },
10116
10137
  onUndo: function onUndo() {
10117
10138
  return dispatchAction('undo');
@@ -10261,9 +10282,9 @@ function lookup(map, event) {
10261
10282
  }
10262
10283
  keyNorm.lookup = lookup;
10263
10284
 
10264
- function _createForOfIteratorHelper$d(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$d(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; } } }; }
10265
- function _unsupportedIterableToArray$d(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$d(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$d(o, minLen); }
10266
- function _arrayLikeToArray$d(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; }
10285
+ function _createForOfIteratorHelper$c(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$c(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; } } }; }
10286
+ function _unsupportedIterableToArray$c(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$c(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$c(o, minLen); }
10287
+ function _arrayLikeToArray$c(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; }
10267
10288
  var APointTool = function () {
10268
10289
  function APointTool(editor) {
10269
10290
  _classCallCheck__default["default"](this, APointTool);
@@ -10299,7 +10320,7 @@ var APointTool = function () {
10299
10320
  }
10300
10321
  }
10301
10322
  if (atomResult.length > 0) {
10302
- var _iterator = _createForOfIteratorHelper$d(atomResult),
10323
+ var _iterator = _createForOfIteratorHelper$c(atomResult),
10303
10324
  _step;
10304
10325
  try {
10305
10326
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -10410,9 +10431,9 @@ var utils = {
10410
10431
  getNonGroupItemsAndAttachmentPoints: getNonGroupItemsAndAttachmentPoints
10411
10432
  };
10412
10433
 
10413
- function _createForOfIteratorHelper$c(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$c(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; } } }; }
10414
- function _unsupportedIterableToArray$c(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$c(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$c(o, minLen); }
10415
- function _arrayLikeToArray$c(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; }
10434
+ function _createForOfIteratorHelper$b(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$b(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; } } }; }
10435
+ function _unsupportedIterableToArray$b(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$b(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$b(o, minLen); }
10436
+ function _arrayLikeToArray$b(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; }
10416
10437
  function _classPrivateFieldInitSpec$2(obj, privateMap, value) { _checkPrivateRedeclaration$2(obj, privateMap); privateMap.set(obj, value); }
10417
10438
  function _checkPrivateRedeclaration$2(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
10418
10439
  var _bondProps = new WeakMap();
@@ -10489,7 +10510,7 @@ var AtomTool = function () {
10489
10510
  if (atomId !== null) atomResult.push(atomId);
10490
10511
  }
10491
10512
  if (atomResult.length > 0) {
10492
- var _iterator = _createForOfIteratorHelper$c(atomResult),
10513
+ var _iterator = _createForOfIteratorHelper$b(atomResult),
10493
10514
  _step;
10494
10515
  try {
10495
10516
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -10520,12 +10541,14 @@ var AtomTool = function () {
10520
10541
  }, {
10521
10542
  key: "mousemove",
10522
10543
  value: function mousemove(event) {
10523
- this.editor.hoverIcon.show();
10524
10544
  var rnd = this.editor.render;
10525
10545
  if (!this.dragCtx || !this.dragCtx.item) {
10546
+ this.editor.hoverIcon.show();
10526
10547
  this.editor.hoverIcon.updatePosition();
10527
10548
  this.editor.hover(this.editor.findItem(event, ['atoms', 'functionalGroups']), null, event);
10528
10549
  return;
10550
+ } else {
10551
+ this.editor.hoverIcon.hide();
10529
10552
  }
10530
10553
  var dragCtx = this.dragCtx;
10531
10554
  var ci = this.editor.findItem(event, ['atoms']);
@@ -10542,7 +10565,7 @@ var AtomTool = function () {
10542
10565
  });
10543
10566
  var newAtomPos = utils.calcNewAtomPos(atom === null || atom === void 0 ? void 0 : atom.pp, rnd.page2obj(event), event.ctrlKey);
10544
10567
  if (dragCtx.action) dragCtx.action.perform(rnd.ctab);
10545
- dragCtx.action = ketcherCore.fromBondAddition(rnd.ctab, _classPrivateFieldGet__default["default"](this, _bondProps), dragCtx.item.id, Object.assign({}, this.atomProps), newAtomPos, newAtomPos)[0];
10568
+ dragCtx.action = ketcherCore.fromBondAddition(rnd.ctab, _classPrivateFieldGet__default["default"](this, _bondProps), dragCtx.item.id, Object.assign({}, this.atomProps), undefined, newAtomPos)[0];
10546
10569
  this.editor.update(dragCtx.action, true);
10547
10570
  }
10548
10571
  }, {
@@ -10559,7 +10582,7 @@ var AtomTool = function () {
10559
10582
  if (atomId !== null) atomResult.push(atomId);
10560
10583
  }
10561
10584
  if (atomResult.length > 0) {
10562
- var _iterator2 = _createForOfIteratorHelper$c(atomResult),
10585
+ var _iterator2 = _createForOfIteratorHelper$b(atomResult),
10563
10586
  _step2;
10564
10587
  try {
10565
10588
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
@@ -10628,9 +10651,9 @@ function atomLongtapEvent(tool, render) {
10628
10651
  };
10629
10652
  }
10630
10653
 
10631
- function _createForOfIteratorHelper$b(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$b(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; } } }; }
10632
- function _unsupportedIterableToArray$b(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$b(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$b(o, minLen); }
10633
- function _arrayLikeToArray$b(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; }
10654
+ function _createForOfIteratorHelper$a(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$a(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; } } }; }
10655
+ function _unsupportedIterableToArray$a(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$a(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$a(o, minLen); }
10656
+ function _arrayLikeToArray$a(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; }
10634
10657
  var AttachTool = function () {
10635
10658
  function AttachTool(editor, attachPoints) {
10636
10659
  _classCallCheck__default["default"](this, AttachTool);
@@ -10683,7 +10706,7 @@ var AttachTool = function () {
10683
10706
  }
10684
10707
  }
10685
10708
  if (atomResult.length > 0) {
10686
- var _iterator = _createForOfIteratorHelper$b(atomResult),
10709
+ var _iterator = _createForOfIteratorHelper$a(atomResult),
10687
10710
  _step;
10688
10711
  try {
10689
10712
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -10703,7 +10726,7 @@ var AttachTool = function () {
10703
10726
  });
10704
10727
  return;
10705
10728
  } else if (bondResult.length > 0) {
10706
- var _iterator2 = _createForOfIteratorHelper$b(bondResult),
10729
+ var _iterator2 = _createForOfIteratorHelper$a(bondResult),
10707
10730
  _step2;
10708
10731
  try {
10709
10732
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
@@ -10739,9 +10762,9 @@ var AttachTool = function () {
10739
10762
  return AttachTool;
10740
10763
  }();
10741
10764
 
10742
- function _createForOfIteratorHelper$a(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$a(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; } } }; }
10743
- function _unsupportedIterableToArray$a(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$a(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$a(o, minLen); }
10744
- function _arrayLikeToArray$a(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; }
10765
+ function _createForOfIteratorHelper$9(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$9(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; } } }; }
10766
+ function _unsupportedIterableToArray$9(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$9(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$9(o, minLen); }
10767
+ 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; }
10745
10768
  var BondTool = function () {
10746
10769
  function BondTool(editor, bondProps) {
10747
10770
  var _editor$selection;
@@ -10765,7 +10788,7 @@ var BondTool = function () {
10765
10788
  var struct = this.editor.render.ctab;
10766
10789
  var molecule = struct.molecule;
10767
10790
  var functionalGroups = molecule.functionalGroups;
10768
- var ci = this.editor.findItem(event, ['atoms', 'bonds']);
10791
+ var ci = this.editor.findItem(event, ['atoms', 'bonds', 'functionalGroups']);
10769
10792
  var atomResult = [];
10770
10793
  var bondResult = [];
10771
10794
  var result = [];
@@ -10778,7 +10801,7 @@ var BondTool = function () {
10778
10801
  if (bondId !== null) bondResult.push(bondId);
10779
10802
  }
10780
10803
  if (atomResult.length > 0) {
10781
- var _iterator = _createForOfIteratorHelper$a(atomResult),
10804
+ var _iterator = _createForOfIteratorHelper$9(atomResult),
10782
10805
  _step;
10783
10806
  try {
10784
10807
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -10798,7 +10821,7 @@ var BondTool = function () {
10798
10821
  });
10799
10822
  return;
10800
10823
  } else if (bondResult.length > 0) {
10801
- var _iterator2 = _createForOfIteratorHelper$a(bondResult),
10824
+ var _iterator2 = _createForOfIteratorHelper$9(bondResult),
10802
10825
  _step2;
10803
10826
  try {
10804
10827
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
@@ -10818,12 +10841,19 @@ var BondTool = function () {
10818
10841
  });
10819
10842
  return;
10820
10843
  }
10844
+ var attachmentAtomId;
10845
+ if ((ci === null || ci === void 0 ? void 0 : ci.map) === 'functionalGroups') {
10846
+ attachmentAtomId = ketcherCore.SGroup.getAttachmentAtomIdBySGroupId(ci.id, molecule);
10847
+ }
10821
10848
  var rnd = this.editor.render;
10822
10849
  this.editor.hover(null);
10823
10850
  this.editor.selection(null);
10824
10851
  this.dragCtx = {
10825
10852
  xy0: rnd.page2obj(event),
10826
- item: this.editor.findItem(event, ['atoms', 'bonds'])
10853
+ item: attachmentAtomId === undefined ? ci : {
10854
+ map: 'atoms',
10855
+ id: attachmentAtomId
10856
+ }
10827
10857
  };
10828
10858
  if (!this.dragCtx.item)
10829
10859
  delete this.dragCtx.item;
@@ -10848,24 +10878,26 @@ var BondTool = function () {
10848
10878
  info: degrees + 'º'
10849
10879
  });
10850
10880
  if (!('item' in dragCtx) || dragCtx.item.map === 'atoms') {
10851
- var _endAtom;
10881
+ var _endAtom2;
10852
10882
  if ('action' in dragCtx) dragCtx.action.perform(rnd.ctab);
10853
10883
  var beginAtom;
10854
10884
  var endAtom;
10855
10885
  var beginPos;
10856
10886
  var endPos;
10857
- var extraNeighbour = [];
10858
10887
  if ('item' in dragCtx && dragCtx.item.map === 'atoms') {
10859
10888
  beginAtom = dragCtx.item.id;
10860
10889
  endAtom = editor.findItem(event, ['atoms'], dragCtx.item);
10861
10890
  var closestSGroup = editor.findItem(event, ['functionalGroups']);
10862
10891
  if (closestSGroup && ketcherCore.FunctionalGroup.isContractedFunctionalGroup(closestSGroup.id, functionalGroups)) {
10863
- var sGroup = sgroups.get(closestSGroup.id);
10864
- var sGroupAtoms = ketcherCore.SGroup.getAtoms(molecule, sGroup === null || sGroup === void 0 ? void 0 : sGroup.item);
10865
- endAtom = {
10866
- id: sGroupAtoms[0],
10867
- map: 'atoms'
10868
- };
10892
+ var closestAttachmentAtomId = ketcherCore.SGroup.getAttachmentAtomIdBySGroupId(closestSGroup.id, molecule);
10893
+ var isSaltOrSolvent = closestAttachmentAtomId === undefined;
10894
+ var isBeginFunctionalGroupItself = closestAttachmentAtomId === beginAtom;
10895
+ if (!isSaltOrSolvent && !isBeginFunctionalGroupItself) {
10896
+ endAtom = {
10897
+ id: closestAttachmentAtomId,
10898
+ map: 'atoms'
10899
+ };
10900
+ }
10869
10901
  }
10870
10902
  var fGroupId = endAtom && ketcherCore.FunctionalGroup.findFunctionalGroupByAtom(functionalGroups, endAtom.id);
10871
10903
  var fGroup = typeof fGroupId === 'number' && sgroups.get(fGroupId);
@@ -10876,27 +10908,28 @@ var BondTool = function () {
10876
10908
  });
10877
10909
  endAtom = null;
10878
10910
  }
10879
- if (endAtom && fGroup && endAtom.id === (fGroupAtoms === null || fGroupAtoms === void 0 ? void 0 : fGroupAtoms[0])) {
10880
- var atomNeighbours = molecule.atomGetNeighbors(endAtom.id);
10881
- atomNeighbours === null || atomNeighbours === void 0 ? void 0 : atomNeighbours.forEach(function (nei) {
10882
- !(fGroupAtoms !== null && fGroupAtoms !== void 0 && fGroupAtoms.includes(nei.aid)) && !extraNeighbour.includes(nei.aid) && extraNeighbour.push(nei.aid);
10883
- });
10884
- }
10885
- if (extraNeighbour.length >= 1) {
10886
- endAtom = null;
10887
- }
10888
10911
  } else {
10912
+ var _endAtom;
10889
10913
  beginAtom = this.atomProps;
10890
10914
  beginPos = dragCtx.xy0;
10891
- endAtom = editor.findItem(event, ['atoms']);
10915
+ endAtom = editor.findItem(event, ['atoms', 'functionalGroups']);
10892
10916
  var atomResult = [];
10893
10917
  var result = [];
10894
10918
  if (endAtom && endAtom.map === 'atoms' && functionalGroups.size && this.dragCtx) {
10895
10919
  var atomId = ketcherCore.FunctionalGroup.atomsInFunctionalGroup(functionalGroups, endAtom.id);
10896
10920
  if (atomId !== null) atomResult.push(atomId);
10921
+ } else if (((_endAtom = endAtom) === null || _endAtom === void 0 ? void 0 : _endAtom.map) === 'functionalGroups') {
10922
+ var functionalGroup = molecule.functionalGroups.get(endAtom.id);
10923
+ if (!ketcherCore.SGroup.isSaltOrSolvent((functionalGroup === null || functionalGroup === void 0 ? void 0 : functionalGroup.name) || '')) {
10924
+ var attachmentAtomId = ketcherCore.SGroup.getAttachmentAtomIdBySGroupId(endAtom.id, molecule);
10925
+ endAtom = attachmentAtomId === undefined ? null : {
10926
+ map: 'atoms',
10927
+ id: attachmentAtomId
10928
+ };
10929
+ }
10897
10930
  }
10898
10931
  if (atomResult.length > 0) {
10899
- var _iterator3 = _createForOfIteratorHelper$a(atomResult),
10932
+ var _iterator3 = _createForOfIteratorHelper$9(atomResult),
10900
10933
  _step3;
10901
10934
  try {
10902
10935
  for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
@@ -10919,7 +10952,7 @@ var BondTool = function () {
10919
10952
  }
10920
10953
  }
10921
10954
  var dist = Number.MAX_VALUE;
10922
- if (((_endAtom = endAtom) === null || _endAtom === void 0 ? void 0 : _endAtom.map) === 'atoms') {
10955
+ if (((_endAtom2 = endAtom) === null || _endAtom2 === void 0 ? void 0 : _endAtom2.map) === 'atoms') {
10923
10956
  endAtom = endAtom.id;
10924
10957
  } else {
10925
10958
  endAtom = this.atomProps;
@@ -10929,7 +10962,7 @@ var BondTool = function () {
10929
10962
  endPos = utils.calcNewAtomPos(beginPos, xy1, event.ctrlKey);
10930
10963
  } else {
10931
10964
  var atom = rnd.ctab.molecule.atoms.get(beginAtom);
10932
- beginPos = utils.calcNewAtomPos(atom === null || atom === void 0 ? void 0 : atom.pp.get_xy0(), xy1, event.ctrlKey);
10965
+ endPos = utils.calcNewAtomPos(atom === null || atom === void 0 ? void 0 : atom.pp.get_xy0(), xy1, event.ctrlKey);
10933
10966
  }
10934
10967
  }
10935
10968
  if (dist > 0.3) {
@@ -10950,7 +10983,7 @@ var BondTool = function () {
10950
10983
  return true;
10951
10984
  }
10952
10985
  }
10953
- this.editor.hover(this.editor.findItem(event, ['atoms', 'bonds']), null, event);
10986
+ this.editor.hover(this.editor.findItem(event, ['atoms', 'bonds', 'functionalGroups']), null, event);
10954
10987
  return true;
10955
10988
  }
10956
10989
  }, {
@@ -10973,7 +11006,9 @@ var BondTool = function () {
10973
11006
  }, ketcherCore.Vec2.diff(xy, v), ketcherCore.Vec2.sum(xy, v));
10974
11007
  this.editor.update(bondAddition[0]);
10975
11008
  } else if (dragCtx.item.map === 'atoms') {
10976
- this.editor.update(ketcherCore.fromBondAddition(rnd.ctab, this.bondProps, dragCtx.item.id, undefined)[0]);
11009
+ this.editor.update(ketcherCore.fromBondAddition(rnd.ctab, this.bondProps, dragCtx.item.id, {
11010
+ label: 'C'
11011
+ })[0]);
10977
11012
  delete this.dragCtx.existedBond;
10978
11013
  } else if (dragCtx.item.map === 'bonds') {
10979
11014
  var bondProps = Object.assign({}, this.bondProps);
@@ -11007,7 +11042,7 @@ var BondTool = function () {
11007
11042
  }, {
11008
11043
  key: "getExistingBond",
11009
11044
  value: function getExistingBond(struct, begin, end) {
11010
- var _iterator4 = _createForOfIteratorHelper$a(struct.bonds.entries()),
11045
+ var _iterator4 = _createForOfIteratorHelper$9(struct.bonds.entries()),
11011
11046
  _step4;
11012
11047
  try {
11013
11048
  for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
@@ -11030,9 +11065,9 @@ var BondTool = function () {
11030
11065
  return BondTool;
11031
11066
  }();
11032
11067
 
11033
- function _createForOfIteratorHelper$9(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$9(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; } } }; }
11034
- function _unsupportedIterableToArray$9(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$9(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$9(o, minLen); }
11035
- 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; }
11068
+ function _createForOfIteratorHelper$8(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$8(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; } } }; }
11069
+ function _unsupportedIterableToArray$8(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$8(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$8(o, minLen); }
11070
+ function _arrayLikeToArray$8(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; }
11036
11071
  var ChainTool = function () {
11037
11072
  function ChainTool(editor) {
11038
11073
  _classCallCheck__default["default"](this, ChainTool);
@@ -11047,7 +11082,7 @@ var ChainTool = function () {
11047
11082
  var molecule = struct.molecule;
11048
11083
  var functionalGroups = molecule.functionalGroups;
11049
11084
  var rnd = this.editor.render;
11050
- var ci = this.editor.findItem(event, ['atoms', 'bonds']);
11085
+ var ci = this.editor.findItem(event, ['atoms', 'bonds', 'functionalGroups']);
11051
11086
  var atomResult = [];
11052
11087
  var bondResult = [];
11053
11088
  var result = [];
@@ -11064,7 +11099,7 @@ var ChainTool = function () {
11064
11099
  }
11065
11100
  }
11066
11101
  if (atomResult.length > 0) {
11067
- var _iterator = _createForOfIteratorHelper$9(atomResult),
11102
+ var _iterator = _createForOfIteratorHelper$8(atomResult),
11068
11103
  _step;
11069
11104
  try {
11070
11105
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -11084,7 +11119,7 @@ var ChainTool = function () {
11084
11119
  });
11085
11120
  return;
11086
11121
  } else if (bondResult.length > 0) {
11087
- var _iterator2 = _createForOfIteratorHelper$9(bondResult),
11122
+ var _iterator2 = _createForOfIteratorHelper$8(bondResult),
11088
11123
  _step2;
11089
11124
  try {
11090
11125
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
@@ -11115,6 +11150,18 @@ var ChainTool = function () {
11115
11150
  });
11116
11151
  atomLongtapEvent(this, rnd);
11117
11152
  }
11153
+ if ((ci === null || ci === void 0 ? void 0 : ci.map) === 'functionalGroups') {
11154
+ var functionalGroup = molecule.functionalGroups.get(ci.id);
11155
+ if (!ketcherCore.SGroup.isSaltOrSolvent((functionalGroup === null || functionalGroup === void 0 ? void 0 : functionalGroup.name) || '')) {
11156
+ var sGroupId = ci.id;
11157
+ var sGroup = molecule.sgroups.get(sGroupId);
11158
+ var attachmentAtomId = sGroup === null || sGroup === void 0 ? void 0 : sGroup.getAttAtomId(molecule);
11159
+ this.dragCtx.item = {
11160
+ map: 'atoms',
11161
+ id: attachmentAtomId
11162
+ };
11163
+ }
11164
+ }
11118
11165
  if (!this.dragCtx.item)
11119
11166
  delete this.dragCtx.item;
11120
11167
  return true;
@@ -11125,7 +11172,7 @@ var ChainTool = function () {
11125
11172
  var editor = this.editor;
11126
11173
  var restruct = editor.render.ctab;
11127
11174
  var dragCtx = this.dragCtx;
11128
- editor.hover(this.editor.findItem(event, ['atoms', 'bonds']), null, event);
11175
+ editor.hover(this.editor.findItem(event, ['atoms', 'bonds', 'functionalGroups']), null, event);
11129
11176
  if (!dragCtx) {
11130
11177
  return true;
11131
11178
  }
@@ -11177,7 +11224,7 @@ var ChainTool = function () {
11177
11224
  }
11178
11225
  }
11179
11226
  if (atomResult.length > 0) {
11180
- var _iterator3 = _createForOfIteratorHelper$9(atomResult),
11227
+ var _iterator3 = _createForOfIteratorHelper$8(atomResult),
11181
11228
  _step3;
11182
11229
  try {
11183
11230
  for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
@@ -11239,9 +11286,9 @@ var ChainTool = function () {
11239
11286
  return ChainTool;
11240
11287
  }();
11241
11288
 
11242
- function _createForOfIteratorHelper$8(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$8(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; } } }; }
11243
- function _unsupportedIterableToArray$8(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$8(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$8(o, minLen); }
11244
- function _arrayLikeToArray$8(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; }
11289
+ function _createForOfIteratorHelper$7(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$7(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; } } }; }
11290
+ function _unsupportedIterableToArray$7(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$7(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$7(o, minLen); }
11291
+ function _arrayLikeToArray$7(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; }
11245
11292
  var ChargeTool = function () {
11246
11293
  function ChargeTool(editor, charge) {
11247
11294
  _classCallCheck__default["default"](this, ChargeTool);
@@ -11282,7 +11329,7 @@ var ChargeTool = function () {
11282
11329
  }
11283
11330
  }
11284
11331
  if (atomResult.length > 0) {
11285
- var _iterator = _createForOfIteratorHelper$8(atomResult),
11332
+ var _iterator = _createForOfIteratorHelper$7(atomResult),
11286
11333
  _step;
11287
11334
  try {
11288
11335
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -11645,9 +11692,9 @@ var LassoHelper = function () {
11645
11692
  return LassoHelper;
11646
11693
  }();
11647
11694
 
11648
- function _createForOfIteratorHelper$7(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$7(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; } } }; }
11649
- function _unsupportedIterableToArray$7(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$7(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$7(o, minLen); }
11650
- function _arrayLikeToArray$7(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; }
11695
+ 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; } } }; }
11696
+ 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); }
11697
+ 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; }
11651
11698
  var searchMaps = ['atoms', 'bonds', 'sgroups', 'functionalGroups', 'sgroupData'];
11652
11699
  var SGroupTool = function () {
11653
11700
  function SGroupTool(editor) {
@@ -11679,7 +11726,7 @@ var SGroupTool = function () {
11679
11726
  return fp.isEqual(sgroup.atoms, selectedAtoms);
11680
11727
  });
11681
11728
  if (selectedAtoms && functionalGroups.size) {
11682
- var _iterator = _createForOfIteratorHelper$7(selectedAtoms),
11729
+ var _iterator = _createForOfIteratorHelper$6(selectedAtoms),
11683
11730
  _step;
11684
11731
  try {
11685
11732
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -11691,7 +11738,7 @@ var SGroupTool = function () {
11691
11738
  }
11692
11739
  var atomFromStruct = atomId !== null && ((_struct$atoms$get = struct.atoms.get(atomId)) === null || _struct$atoms$get === void 0 ? void 0 : _struct$atoms$get.a);
11693
11740
  if (atomFromStruct) {
11694
- var _iterator2 = _createForOfIteratorHelper$7(atomFromStruct.sgs.values()),
11741
+ var _iterator2 = _createForOfIteratorHelper$6(atomFromStruct.sgs.values()),
11695
11742
  _step2;
11696
11743
  try {
11697
11744
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
@@ -11704,7 +11751,7 @@ var SGroupTool = function () {
11704
11751
  _iterator2.f();
11705
11752
  }
11706
11753
  }
11707
- if (atomFromStruct && ketcherCore.FunctionalGroup.isAtomInContractedFunctionalGroup(atomFromStruct, sgroups, functionalGroups, false)) {
11754
+ if (atomFromStruct && (ketcherCore.FunctionalGroup.isAtomInContractedFunctionalGroup(atomFromStruct, sgroups, functionalGroups, false) || ketcherCore.SGroup.isAtomInContractedSGroup(atomFromStruct, sgroups))) {
11708
11755
  var _newSelected$atoms, _newSelected$bonds;
11709
11756
  var sgroupAtoms = actualSgroupId !== undefined && ketcherCore.SGroup.getAtoms(molecule, sgroups.get(actualSgroupId));
11710
11757
  var sgroupBonds = actualSgroupId !== undefined && ketcherCore.SGroup.getBonds(molecule, sgroups.get(actualSgroupId));
@@ -11724,7 +11771,7 @@ var SGroupTool = function () {
11724
11771
  atomsResult = [];
11725
11772
  }
11726
11773
  if (atomsResult && atomsResult.length > 0) {
11727
- var _iterator3 = _createForOfIteratorHelper$7(atomsResult),
11774
+ var _iterator3 = _createForOfIteratorHelper$6(atomsResult),
11728
11775
  _step3;
11729
11776
  try {
11730
11777
  for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
@@ -11766,7 +11813,7 @@ var SGroupTool = function () {
11766
11813
  var _struct$atoms$get2;
11767
11814
  var atomId = ketcherCore.FunctionalGroup.atomsInFunctionalGroup(functionalGroups, ci.id);
11768
11815
  var atomFromStruct = atomId !== null && ((_struct$atoms$get2 = struct.atoms.get(atomId)) === null || _struct$atoms$get2 === void 0 ? void 0 : _struct$atoms$get2.a);
11769
- if (atomFromStruct && !ketcherCore.FunctionalGroup.isAtomInContractedFunctionalGroup(atomFromStruct, sgroups, functionalGroups, true)) {
11816
+ if (atomFromStruct && !(ketcherCore.FunctionalGroup.isAtomInContractedFunctionalGroup(atomFromStruct, sgroups, functionalGroups, true) || ketcherCore.SGroup.isAtomInContractedSGroup(atomFromStruct, sgroups))) {
11770
11817
  atomResult.push(atomId);
11771
11818
  }
11772
11819
  }
@@ -11774,7 +11821,7 @@ var SGroupTool = function () {
11774
11821
  var _struct$bonds$get;
11775
11822
  var bondId = ketcherCore.FunctionalGroup.bondsInFunctionalGroup(molecule, functionalGroups, ci.id);
11776
11823
  var bondFromStruct = bondId !== null && ((_struct$bonds$get = struct.bonds.get(bondId)) === null || _struct$bonds$get === void 0 ? void 0 : _struct$bonds$get.b);
11777
- if (bondFromStruct && !ketcherCore.FunctionalGroup.isBondInContractedFunctionalGroup(bondFromStruct, sgroups, functionalGroups)) {
11824
+ if (bondFromStruct && !(ketcherCore.FunctionalGroup.isBondInContractedFunctionalGroup(bondFromStruct, sgroups, functionalGroups) || ketcherCore.SGroup.isBondInContractedSGroup(bondFromStruct, sgroups))) {
11778
11825
  bondResult.push(bondId);
11779
11826
  }
11780
11827
  }
@@ -11788,7 +11835,7 @@ var SGroupTool = function () {
11788
11835
  }
11789
11836
  }
11790
11837
  if (atomResult.length > 0) {
11791
- var _iterator4 = _createForOfIteratorHelper$7(atomResult),
11838
+ var _iterator4 = _createForOfIteratorHelper$6(atomResult),
11792
11839
  _step4;
11793
11840
  try {
11794
11841
  for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
@@ -11808,7 +11855,7 @@ var SGroupTool = function () {
11808
11855
  });
11809
11856
  return;
11810
11857
  } else if (bondResult.length > 0) {
11811
- var _iterator5 = _createForOfIteratorHelper$7(bondResult),
11858
+ var _iterator5 = _createForOfIteratorHelper$6(bondResult),
11812
11859
  _step5;
11813
11860
  try {
11814
11861
  for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
@@ -11870,7 +11917,7 @@ var SGroupTool = function () {
11870
11917
  var result = [];
11871
11918
  if (ci && ci.map === 'functionalGroups' && functionalGroups.size && ketcherCore.FunctionalGroup.isContractedFunctionalGroup(ci.id, functionalGroups)) return;
11872
11919
  if (selected && functionalGroups.size && selected.atoms) {
11873
- var _iterator6 = _createForOfIteratorHelper$7(selected.atoms),
11920
+ var _iterator6 = _createForOfIteratorHelper$6(selected.atoms),
11874
11921
  _step6;
11875
11922
  try {
11876
11923
  for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
@@ -11882,7 +11929,7 @@ var SGroupTool = function () {
11882
11929
  }
11883
11930
  var atomFromStruct = atomId !== null && ((_struct$atoms$get3 = struct.atoms.get(atomId)) === null || _struct$atoms$get3 === void 0 ? void 0 : _struct$atoms$get3.a);
11884
11931
  if (atomFromStruct) {
11885
- var _iterator7 = _createForOfIteratorHelper$7(atomFromStruct.sgs.values()),
11932
+ var _iterator7 = _createForOfIteratorHelper$6(atomFromStruct.sgs.values()),
11886
11933
  _step7;
11887
11934
  try {
11888
11935
  for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
@@ -11895,7 +11942,7 @@ var SGroupTool = function () {
11895
11942
  _iterator7.f();
11896
11943
  }
11897
11944
  }
11898
- if (atomFromStruct && ketcherCore.FunctionalGroup.isAtomInContractedFunctionalGroup(atomFromStruct, sgroups, functionalGroups, true)) {
11945
+ if (atomFromStruct && (ketcherCore.FunctionalGroup.isAtomInContractedFunctionalGroup(atomFromStruct, sgroups, functionalGroups, true) || ketcherCore.SGroup.isAtomInContractedSGroup(atomFromStruct, sgroups))) {
11899
11946
  var _struct$sgroups$get, _struct$sgroups$get2, _newSelected$atoms2, _newSelected$bonds2;
11900
11947
  var sgroupAtoms = actualSgroupId !== undefined && ketcherCore.SGroup.getAtoms(molecule, (_struct$sgroups$get = struct.sgroups.get(actualSgroupId)) === null || _struct$sgroups$get === void 0 ? void 0 : _struct$sgroups$get.item);
11901
11948
  var sgroupBonds = actualSgroupId !== undefined && ketcherCore.SGroup.getBonds(molecule, (_struct$sgroups$get2 = struct.sgroups.get(actualSgroupId)) === null || _struct$sgroups$get2 === void 0 ? void 0 : _struct$sgroups$get2.item);
@@ -11912,7 +11959,7 @@ var SGroupTool = function () {
11912
11959
  }
11913
11960
  }
11914
11961
  if (selected && functionalGroups.size && selected.bonds) {
11915
- var _iterator8 = _createForOfIteratorHelper$7(selected.bonds),
11962
+ var _iterator8 = _createForOfIteratorHelper$6(selected.bonds),
11916
11963
  _step8;
11917
11964
  try {
11918
11965
  for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
@@ -11954,7 +12001,7 @@ var SGroupTool = function () {
11954
12001
  bondsResult = null;
11955
12002
  }
11956
12003
  if (atomsResult && atomsResult.length > 0) {
11957
- var _iterator9 = _createForOfIteratorHelper$7(atomsResult),
12004
+ var _iterator9 = _createForOfIteratorHelper$6(atomsResult),
11958
12005
  _step9;
11959
12006
  try {
11960
12007
  for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
@@ -11971,7 +12018,7 @@ var SGroupTool = function () {
11971
12018
  }
11972
12019
  }
11973
12020
  if (bondsResult && bondsResult.length > 0) {
11974
- var _iterator10 = _createForOfIteratorHelper$7(bondsResult),
12021
+ var _iterator10 = _createForOfIteratorHelper$6(bondsResult),
11975
12022
  _step10;
11976
12023
  try {
11977
12024
  for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {
@@ -12124,6 +12171,9 @@ function fromContextType(id, editor, newSg, currSelection) {
12124
12171
  var sg = restruct.molecule.sgroups.get(id);
12125
12172
  var sourceAtoms = sg && sg.atoms || currSelection.atoms || [];
12126
12173
  var context = newSg.attrs.context;
12174
+ if (newSg.type === ketcherCore.SGroup.TYPES.SUP) {
12175
+ newSg.attrs.expanded = true;
12176
+ }
12127
12177
  var result = ketcherCore.fromSgroupAction(context, restruct, newSg, sourceAtoms, currSelection);
12128
12178
  result.selection = result.selection || currSelection;
12129
12179
  if (id !== null && id !== undefined) {
@@ -12192,8 +12242,16 @@ function dropAndMerge(editor, mergeItems, action, resizeCanvas) {
12192
12242
  if (isMerging) {
12193
12243
  var expandGroupsAction = getExpandGroupsInMergeAction(editor.render.ctab, mergeItems);
12194
12244
  dropItemAction = dropItemAction.mergeWith(expandGroupsAction);
12245
+ if (mergeItems.atomToFunctionalGroup) {
12246
+ var _extractAttachmentAto = extractAttachmentAtom(mergeItems, editor),
12247
+ _extractAttachmentAto2 = _slicedToArray__default["default"](_extractAttachmentAto, 2),
12248
+ newMergeItems = _extractAttachmentAto2[0],
12249
+ extractAttachmentAtomAction = _extractAttachmentAto2[1];
12250
+ mergeItems = newMergeItems;
12251
+ dropItemAction = dropItemAction.mergeWith(extractAttachmentAtomAction);
12252
+ }
12253
+ dropItemAction = ketcherCore.fromItemsFuse(restruct, mergeItems).mergeWith(dropItemAction);
12195
12254
  }
12196
- dropItemAction = ketcherCore.fromItemsFuse(restruct, mergeItems).mergeWith(dropItemAction);
12197
12255
  if (action) {
12198
12256
  dropItemAction = dropItemAction.mergeWith(action);
12199
12257
  }
@@ -12204,6 +12262,7 @@ function dropAndMerge(editor, mergeItems, action, resizeCanvas) {
12204
12262
  resizeCanvas: !!resizeCanvas
12205
12263
  });
12206
12264
  }
12265
+ return dropItemAction;
12207
12266
  }
12208
12267
  function getExpandGroupsInMergeAction(restruct, mergeItems) {
12209
12268
  var action = new ketcherCore.Action();
@@ -12217,6 +12276,33 @@ function getExpandGroupsInMergeAction(restruct, mergeItems) {
12217
12276
  }
12218
12277
  return action;
12219
12278
  }
12279
+ function extractAttachmentAtom(mergeItems, editor) {
12280
+ var _mergeItems$atomToFun;
12281
+ var struct = editor.struct();
12282
+ var reStruct = editor.render.ctab;
12283
+ var newMergeItems = {
12284
+ atoms: new Map(mergeItems.atoms),
12285
+ bonds: new Map(mergeItems.bonds)
12286
+ };
12287
+ var action = new ketcherCore.Action();
12288
+ (_mergeItems$atomToFun = mergeItems.atomToFunctionalGroup) === null || _mergeItems$atomToFun === void 0 ? void 0 : _mergeItems$atomToFun.forEach(function (functionalGroupId, srcAtomId) {
12289
+ var sGroup = struct.sgroups.get(functionalGroupId);
12290
+ var attachmentAtomId = sGroup === null || sGroup === void 0 ? void 0 : sGroup.getAttAtomId(struct);
12291
+ if (attachmentAtomId !== undefined) {
12292
+ var atomsToDelete = _toConsumableArray__default["default"](ketcherCore.SGroup.getAtoms(struct, sGroup)).filter(function (atomId) {
12293
+ return atomId !== attachmentAtomId;
12294
+ });
12295
+ var bondsToDelete = _toConsumableArray__default["default"](ketcherCore.SGroup.getBonds(struct, sGroup));
12296
+ action.mergeWith(ketcherCore.fromSgroupDeletion(reStruct, functionalGroupId));
12297
+ action.mergeWith(ketcherCore.fromFragmentDeletion(reStruct, {
12298
+ atoms: atomsToDelete,
12299
+ bonds: bondsToDelete
12300
+ }));
12301
+ newMergeItems.atoms.set(srcAtomId, attachmentAtomId);
12302
+ }
12303
+ });
12304
+ return [newMergeItems, action];
12305
+ }
12220
12306
 
12221
12307
  function ownKeys$Q(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; }
12222
12308
  function _objectSpread$Q(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$Q(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$Q(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -12225,29 +12311,6 @@ function getMergeItems(editor, items) {
12225
12311
  return ketcherCore.getItemsToFuse(editor, nonGroupItemsAndAttachPoints);
12226
12312
  }
12227
12313
 
12228
- function isAtomsArray(selectedElements) {
12229
- return Array.isArray(selectedElements) && (selectedElements === null || selectedElements === void 0 ? void 0 : selectedElements.every(function (element) {
12230
- return element instanceof ketcherCore.Atom;
12231
- }));
12232
- }
12233
- function generateCommonProperties(selectedElements) {
12234
- var normalizedAtom = fromElement(selectedElements[0]);
12235
- var properties = Object.getOwnPropertyNames(normalizedAtom);
12236
- var resultAtomAttributes = {};
12237
- properties.forEach(function (property) {
12238
- var uniqueValues = new Set();
12239
- selectedElements.forEach(function (element) {
12240
- uniqueValues.add(element[property]);
12241
- });
12242
- var allAtomsHaveTheSameValue = uniqueValues.size === 1;
12243
- if (allAtomsHaveTheSameValue) {
12244
- resultAtomAttributes[property] = normalizedAtom[property];
12245
- } else {
12246
- resultAtomAttributes[property] = '';
12247
- }
12248
- });
12249
- return resultAtomAttributes;
12250
- }
12251
12314
  function castAtomPropToType(property, value) {
12252
12315
  var typesMapping = {
12253
12316
  charge: Number,
@@ -12259,21 +12322,21 @@ function castAtomPropToType(property, value) {
12259
12322
  }
12260
12323
  return value;
12261
12324
  }
12262
- function updateOnlyChangedProperties(atomId, userChangedAtom, molecule) {
12263
- var unchangedAtom = molecule.atoms.get(atomId);
12264
- var updatedKeys = Object.getOwnPropertyNames(userChangedAtom).filter(function (key) {
12265
- return userChangedAtom[key] !== '';
12325
+ function updateOnlyChangedProperties(unchangedElement, userChangedElement) {
12326
+ var updatedKeys = Object.getOwnPropertyNames(userChangedElement).filter(function (key) {
12327
+ return userChangedElement[key] !== '';
12266
12328
  });
12267
- return Object.getOwnPropertyNames(unchangedAtom).reduce(function (updatedAtom, key) {
12268
- var isPropertyChanged = updatedKeys.includes(key);
12269
- if (isPropertyChanged) {
12270
- updatedAtom[key] = castAtomPropToType(key, userChangedAtom[key]);
12271
- } else {
12272
- updatedAtom[key] = unchangedAtom[key];
12273
- }
12274
- return updatedAtom;
12329
+ return Object.getOwnPropertyNames(unchangedElement).reduce(function (updatedElement, key) {
12330
+ updatedElement[key] = updatedKeys.includes(key) ? castAtomPropToType(key, userChangedElement[key]) : unchangedElement[key];
12331
+ return updatedElement;
12275
12332
  }, {});
12276
12333
  }
12334
+
12335
+ function isAtomsArray(selectedElements) {
12336
+ return Array.isArray(selectedElements) && (selectedElements === null || selectedElements === void 0 ? void 0 : selectedElements.every(function (element) {
12337
+ return element instanceof ketcherCore.Atom;
12338
+ }));
12339
+ }
12277
12340
  function updateSelectedAtoms(_ref) {
12278
12341
  var atoms = _ref.atoms,
12279
12342
  changeAtomPromise = _ref.changeAtomPromise,
@@ -12284,7 +12347,8 @@ function updateSelectedAtoms(_ref) {
12284
12347
  if (atoms) {
12285
12348
  Promise.resolve(changeAtomPromise).then(function (userChangedAtom) {
12286
12349
  atoms.forEach(function (atomId) {
12287
- var atomWithChangedProperties = updateOnlyChangedProperties(atomId, userChangedAtom, molecule);
12350
+ var unchangedAtom = molecule.atoms.get(atomId);
12351
+ var atomWithChangedProperties = updateOnlyChangedProperties(unchangedAtom, userChangedAtom);
12288
12352
  action.mergeWith(ketcherCore.fromAtomsAttrs(struct, atomId, atomWithChangedProperties, false));
12289
12353
  });
12290
12354
  editor.update(action);
@@ -12294,6 +12358,27 @@ function updateSelectedAtoms(_ref) {
12294
12358
  }
12295
12359
  }
12296
12360
 
12361
+ function updateSelectedBonds(_ref) {
12362
+ var bonds = _ref.bonds,
12363
+ changeBondPromise = _ref.changeBondPromise,
12364
+ editor = _ref.editor;
12365
+ var action = new ketcherCore.Action();
12366
+ var struct = editor.render.ctab;
12367
+ var molecule = struct.molecule;
12368
+ if (bonds) {
12369
+ Promise.resolve(changeBondPromise).then(function (userChangedBond) {
12370
+ bonds.forEach(function (bondId) {
12371
+ var unchangedBond = molecule.bonds.get(bondId);
12372
+ var bondWithChangedProperties = updateOnlyChangedProperties(unchangedBond, userChangedBond);
12373
+ action.mergeWith(ketcherCore.fromBondsAttrs(struct, bondId, bondWithChangedProperties, false));
12374
+ });
12375
+ editor.update(action);
12376
+ })["catch"](function () {
12377
+ return null;
12378
+ });
12379
+ }
12380
+ }
12381
+
12297
12382
  function hasAtomsOutsideCanvas(atoms, render, scale) {
12298
12383
  return atoms.some(function (atom) {
12299
12384
  var canvasSize = render.sz;
@@ -12304,9 +12389,9 @@ function hasAtomsOutsideCanvas(atoms, render, scale) {
12304
12389
  });
12305
12390
  }
12306
12391
 
12307
- 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; } } }; }
12308
- 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); }
12309
- 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; }
12392
+ function _createForOfIteratorHelper$5(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$5(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; } } }; }
12393
+ function _unsupportedIterableToArray$5(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$5(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$5(o, minLen); }
12394
+ function _arrayLikeToArray$5(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; }
12310
12395
  function ownKeys$P(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; }
12311
12396
  function _objectSpread$P(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$P(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$P(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
12312
12397
  function _classPrivateFieldInitSpec$1(obj, privateMap, value) { _checkPrivateRedeclaration$1(obj, privateMap); privateMap.set(obj, value); }
@@ -12471,7 +12556,8 @@ var SelectTool = function () {
12471
12556
  if ((_this$dragCtx = this.dragCtx) !== null && _this$dragCtx !== void 0 && _this$dragCtx.stopTapping) this.dragCtx.stopTapping();
12472
12557
  var possibleSaltOrSolvent = struct.sgroups.get(selectedSgroups[selectedSgroups.length - 1]);
12473
12558
  var isDraggingSaltOrSolventOnStructure = ketcherCore.SGroup.isSaltOrSolvent(possibleSaltOrSolvent === null || possibleSaltOrSolvent === void 0 ? void 0 : possibleSaltOrSolvent.item.data.name);
12474
- if (this.dragCtx && (isDraggingSaltOrSolventOnStructure || this.isDraggingStructureOnSaltOrSolvent(this.dragCtx, struct.sgroups))) {
12559
+ var isDraggingCustomSgroupOnStructure = ketcherCore.SGroup.isSuperAtom(possibleSaltOrSolvent === null || possibleSaltOrSolvent === void 0 ? void 0 : possibleSaltOrSolvent.item) && !ketcherCore.FunctionalGroup.isFunctionalGroup(possibleSaltOrSolvent === null || possibleSaltOrSolvent === void 0 ? void 0 : possibleSaltOrSolvent.item);
12560
+ if (this.dragCtx && (isDraggingCustomSgroupOnStructure || isDraggingSaltOrSolventOnStructure || this.isDraggingStructureOnSaltOrSolvent(this.dragCtx, struct.sgroups))) {
12475
12561
  preventSaltAndSolventsMerge(struct, this.dragCtx, editor);
12476
12562
  delete this.dragCtx;
12477
12563
  }
@@ -12497,7 +12583,6 @@ var SelectTool = function () {
12497
12583
  var molecule = struct.molecule,
12498
12584
  sgroups = struct.sgroups;
12499
12585
  var functionalGroups = molecule.functionalGroups;
12500
- var rnd = editor.render;
12501
12586
  var ci = editor.findItem(event, ['atoms', 'bonds', 'sgroups', 'functionalGroups', 'sgroupData', 'texts'], null);
12502
12587
  var atomResult = [];
12503
12588
  var bondResult = [];
@@ -12506,7 +12591,7 @@ var SelectTool = function () {
12506
12591
  var _struct$atoms$get;
12507
12592
  var atomId = ketcherCore.FunctionalGroup.atomsInFunctionalGroup(functionalGroups, ci.id);
12508
12593
  var atomFromStruct = atomId !== null && ((_struct$atoms$get = struct.atoms.get(atomId)) === null || _struct$atoms$get === void 0 ? void 0 : _struct$atoms$get.a);
12509
- if (atomId !== null && !ketcherCore.FunctionalGroup.isAtomInContractedFunctionalGroup(
12594
+ if (atomFromStruct && !ketcherCore.FunctionalGroup.isAtomInContractedFunctionalGroup(
12510
12595
  atomFromStruct, sgroups, functionalGroups, true)) atomResult.push(atomId);
12511
12596
  }
12512
12597
  if (ci && functionalGroups && ci.map === 'bonds') {
@@ -12517,7 +12602,7 @@ var SelectTool = function () {
12517
12602
  bondFromStruct, sgroups, functionalGroups)) bondResult.push(bondId);
12518
12603
  }
12519
12604
  if (atomResult.length > 0) {
12520
- var _iterator = _createForOfIteratorHelper$6(atomResult),
12605
+ var _iterator = _createForOfIteratorHelper$5(atomResult),
12521
12606
  _step;
12522
12607
  try {
12523
12608
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -12537,7 +12622,7 @@ var SelectTool = function () {
12537
12622
  });
12538
12623
  return;
12539
12624
  } else if (bondResult.length > 0) {
12540
- var _iterator2 = _createForOfIteratorHelper$6(bondResult),
12625
+ var _iterator2 = _createForOfIteratorHelper$5(bondResult),
12541
12626
  _step2;
12542
12627
  try {
12543
12628
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
@@ -12568,21 +12653,13 @@ var SelectTool = function () {
12568
12653
  changeAtomPromise: changeAtomPromise
12569
12654
  });
12570
12655
  } else if (ci.map === 'bonds') {
12571
- var _rnd$ctab$bonds$get;
12572
- var bond = (_rnd$ctab$bonds$get = rnd.ctab.bonds.get(ci.id)) === null || _rnd$ctab$bonds$get === void 0 ? void 0 : _rnd$ctab$bonds$get.b;
12573
- var rb = editor.event.bondEdit.dispatch(bond);
12574
- if (selection !== null && selection !== void 0 && selection.bonds) {
12575
- var action = new ketcherCore.Action();
12576
- var bondsSelection = selection.bonds;
12577
- Promise.resolve(rb).then(function (newbond) {
12578
- bondsSelection.forEach(function (bid) {
12579
- action.mergeWith(ketcherCore.fromBondsAttrs(struct, bid, newbond));
12580
- });
12581
- editor.update(action);
12582
- })["catch"](function () {
12583
- return null;
12584
- });
12585
- }
12656
+ var bonds = getSelectedBonds(selection, molecule);
12657
+ var changeBondPromise = editor.event.bondEdit.dispatch(bonds);
12658
+ updateSelectedBonds({
12659
+ bonds: (selection === null || selection === void 0 ? void 0 : selection.bonds) || [],
12660
+ changeBondPromise: changeBondPromise,
12661
+ editor: editor
12662
+ });
12586
12663
  } else if (ci.map === 'sgroups' && !ketcherCore.FunctionalGroup.isFunctionalGroup(molecule.sgroups.get(ci.id)) || ci.map === 'sgroupData') {
12587
12664
  editor.selection(closestToSel(ci));
12588
12665
  SGroupTool.sgroupDialog(editor, ci.id);
@@ -12717,12 +12794,24 @@ function getSelectedAtoms(selection, molecule) {
12717
12794
  }
12718
12795
  return [];
12719
12796
  }
12797
+ function getSelectedBonds(selection, molecule) {
12798
+ if (selection !== null && selection !== void 0 && selection.bonds) {
12799
+ return mapBondIdsToBonds(selection === null || selection === void 0 ? void 0 : selection.bonds, molecule);
12800
+ }
12801
+ return [];
12802
+ }
12720
12803
  function mapAtomIdsToAtoms(atomsIds, molecule) {
12721
12804
  return atomsIds.map(function (atomId) {
12722
12805
  var atomOrReAtom = molecule.atoms.get(atomId);
12723
12806
  return atomOrReAtom.a || atomOrReAtom;
12724
12807
  });
12725
12808
  }
12809
+ function mapBondIdsToBonds(bondsIds, molecule) {
12810
+ return bondsIds.map(function (bondId) {
12811
+ var bondOrReBond = molecule.bonds.get(bondId);
12812
+ return (bondOrReBond === null || bondOrReBond === void 0 ? void 0 : bondOrReBond.b) || bondOrReBond;
12813
+ });
12814
+ }
12726
12815
  function uniqArray(dest, add, reversible) {
12727
12816
  return add.reduce(function (_, item) {
12728
12817
  if (reversible) dest = fp.xor(dest, [item]);else if (!dest.includes(item)) dest.push(item);
@@ -12753,7 +12842,7 @@ function getNewSelectedItems(editor, selectedSgroups) {
12753
12842
  atoms: [],
12754
12843
  bonds: []
12755
12844
  };
12756
- var _iterator3 = _createForOfIteratorHelper$6(selectedSgroups),
12845
+ var _iterator3 = _createForOfIteratorHelper$5(selectedSgroups),
12757
12846
  _step3;
12758
12847
  try {
12759
12848
  for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
@@ -12775,9 +12864,9 @@ function getNewSelectedItems(editor, selectedSgroups) {
12775
12864
  return newSelected;
12776
12865
  }
12777
12866
 
12778
- function _createForOfIteratorHelper$5(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$5(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; } } }; }
12779
- function _unsupportedIterableToArray$5(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$5(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$5(o, minLen); }
12780
- function _arrayLikeToArray$5(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; }
12867
+ function _createForOfIteratorHelper$4(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$4(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; } } }; }
12868
+ function _unsupportedIterableToArray$4(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$4(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$4(o, minLen); }
12869
+ function _arrayLikeToArray$4(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; }
12781
12870
  var EraserTool = function () {
12782
12871
  function EraserTool(editor, mode) {
12783
12872
  _classCallCheck__default["default"](this, EraserTool);
@@ -12825,7 +12914,7 @@ var EraserTool = function () {
12825
12914
  var bondsResult = [];
12826
12915
  var preResult = [];
12827
12916
  if (selected && functionalGroups.size && selected.atoms) {
12828
- var _iterator = _createForOfIteratorHelper$5(selected.atoms),
12917
+ var _iterator = _createForOfIteratorHelper$4(selected.atoms),
12829
12918
  _step;
12830
12919
  try {
12831
12920
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -12834,7 +12923,7 @@ var EraserTool = function () {
12834
12923
  var atomId = ketcherCore.FunctionalGroup.atomsInFunctionalGroup(functionalGroups, atom);
12835
12924
  var atomFromStruct = atomId !== null && ((_struct$atoms$get = struct.atoms.get(atomId)) === null || _struct$atoms$get === void 0 ? void 0 : _struct$atoms$get.a);
12836
12925
  if (atomFromStruct) {
12837
- var _iterator2 = _createForOfIteratorHelper$5(atomFromStruct.sgs.values()),
12926
+ var _iterator2 = _createForOfIteratorHelper$4(atomFromStruct.sgs.values()),
12838
12927
  _step2;
12839
12928
  try {
12840
12929
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
@@ -12864,7 +12953,7 @@ var EraserTool = function () {
12864
12953
  }
12865
12954
  }
12866
12955
  if (selected && functionalGroups.size && selected.bonds) {
12867
- var _iterator3 = _createForOfIteratorHelper$5(selected.bonds),
12956
+ var _iterator3 = _createForOfIteratorHelper$4(selected.bonds),
12868
12957
  _step3;
12869
12958
  try {
12870
12959
  for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
@@ -12883,7 +12972,7 @@ var EraserTool = function () {
12883
12972
  }
12884
12973
  }
12885
12974
  if (atomsResult.length > 0) {
12886
- var _iterator4 = _createForOfIteratorHelper$5(atomsResult),
12975
+ var _iterator4 = _createForOfIteratorHelper$4(atomsResult),
12887
12976
  _step4;
12888
12977
  try {
12889
12978
  for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
@@ -12898,7 +12987,7 @@ var EraserTool = function () {
12898
12987
  }
12899
12988
  }
12900
12989
  if (bondsResult.length > 0) {
12901
- var _iterator5 = _createForOfIteratorHelper$5(bondsResult),
12990
+ var _iterator5 = _createForOfIteratorHelper$4(bondsResult),
12902
12991
  _step5;
12903
12992
  try {
12904
12993
  for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
@@ -12969,7 +13058,7 @@ var EraserTool = function () {
12969
13058
  }
12970
13059
  }
12971
13060
  if (atomResult.length) {
12972
- var _iterator6 = _createForOfIteratorHelper$5(atomResult),
13061
+ var _iterator6 = _createForOfIteratorHelper$4(atomResult),
12973
13062
  _step6;
12974
13063
  try {
12975
13064
  for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
@@ -12985,7 +13074,7 @@ var EraserTool = function () {
12985
13074
  _iterator6.f();
12986
13075
  }
12987
13076
  } else if (bondResult.length) {
12988
- var _iterator7 = _createForOfIteratorHelper$5(bondResult),
13077
+ var _iterator7 = _createForOfIteratorHelper$4(bondResult),
12989
13078
  _step7;
12990
13079
  try {
12991
13080
  for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
@@ -13146,7 +13235,8 @@ function ownKeys$O(object, enumerableOnly) { var keys = Object.keys(object); if
13146
13235
  function _objectSpread$O(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$O(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$O(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
13147
13236
  var PasteTool = function () {
13148
13237
  function PasteTool(editor, struct) {
13149
- var _struct$functionalGro;
13238
+ var _struct$functionalGro,
13239
+ _this = this;
13150
13240
  _classCallCheck__default["default"](this, PasteTool);
13151
13241
  this.editor = editor;
13152
13242
  this.editor.selection(null);
@@ -13166,6 +13256,15 @@ var PasteTool = function () {
13166
13256
  pasteItems = _fromPaste2[1];
13167
13257
  this.action = action;
13168
13258
  this.editor.update(this.action, true);
13259
+ struct.sgroups.forEach(function (sgroup) {
13260
+ var countAttachmentPoint = ketcherCore.FunctionalGroup.getAttachmentPointCount(sgroup, _this.editor.render.ctab.molecule);
13261
+ if (countAttachmentPoint > 1) {
13262
+ action.mergeWith(ketcherCore.setExpandSGroup(_this.editor.render.ctab, sgroup.id, {
13263
+ expanded: true
13264
+ }));
13265
+ }
13266
+ });
13267
+ this.editor.update(this.action, true);
13169
13268
  this.findItems = ['functionalGroups'];
13170
13269
  this.mergeItems = ketcherCore.getItemsToFuse(this.editor, pasteItems);
13171
13270
  this.editor.hover(ketcherCore.getHoverToFuse(this.mergeItems), this);
@@ -13199,6 +13298,7 @@ var PasteTool = function () {
13199
13298
  }, {
13200
13299
  key: "mousemove",
13201
13300
  value: function mousemove(event) {
13301
+ var _this2 = this;
13202
13302
  if (this.action) {
13203
13303
  var _this$action2;
13204
13304
  (_this$action2 = this.action) === null || _this$action2 === void 0 ? void 0 : _this$action2.perform(this.editor.render.ctab);
@@ -13229,6 +13329,12 @@ var PasteTool = function () {
13229
13329
  this.dragCtx.action = action;
13230
13330
  this.editor.update(this.dragCtx.action, true);
13231
13331
  } else {
13332
+ this.struct.sgroups.forEach(function (sgroup) {
13333
+ var countAttachmentPoint = ketcherCore.FunctionalGroup.getAttachmentPointCount(sgroup, _this2.struct);
13334
+ if (countAttachmentPoint > 1) {
13335
+ sgroup.setAttr('expanded', true);
13336
+ }
13337
+ });
13232
13338
  var _fromPaste5 = ketcherCore.fromPaste(this.editor.render.ctab, this.struct, this.editor.render.page2obj(event)),
13233
13339
  _fromPaste6 = _slicedToArray__default["default"](_fromPaste5, 2),
13234
13340
  _action = _fromPaste6[0],
@@ -13268,7 +13374,9 @@ var PasteTool = function () {
13268
13374
  } else {
13269
13375
  var action = this.action;
13270
13376
  delete this.action;
13271
- dropAndMerge(this.editor, this.mergeItems, action, true);
13377
+ if (!this.isSingleContractedGroup || !this.mergeItems) {
13378
+ this.editor.update(dropAndMerge(this.editor, this.mergeItems, action, true));
13379
+ }
13272
13380
  }
13273
13381
  }
13274
13382
  }, {
@@ -13307,9 +13415,9 @@ function prepareTemplateFromSingleGroup(molecule) {
13307
13415
  return template;
13308
13416
  }
13309
13417
 
13310
- function _createForOfIteratorHelper$4(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$4(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; } } }; }
13311
- function _unsupportedIterableToArray$4(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$4(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$4(o, minLen); }
13312
- function _arrayLikeToArray$4(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; }
13418
+ function _createForOfIteratorHelper$3(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$3(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; } } }; }
13419
+ function _unsupportedIterableToArray$3(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$3(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$3(o, minLen); }
13420
+ function _arrayLikeToArray$3(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; }
13313
13421
  var RGroupAtomTool = function () {
13314
13422
  function RGroupAtomTool(editor) {
13315
13423
  _classCallCheck__default["default"](this, RGroupAtomTool);
@@ -13345,7 +13453,7 @@ var RGroupAtomTool = function () {
13345
13453
  }
13346
13454
  }
13347
13455
  if (atomResult.length > 0) {
13348
- var _iterator = _createForOfIteratorHelper$4(atomResult),
13456
+ var _iterator = _createForOfIteratorHelper$3(atomResult),
13349
13457
  _step;
13350
13458
  try {
13351
13459
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -13409,9 +13517,9 @@ function propsDialog$1(editor, id, pos) {
13409
13517
  });
13410
13518
  }
13411
13519
 
13412
- function _createForOfIteratorHelper$3(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$3(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; } } }; }
13413
- function _unsupportedIterableToArray$3(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$3(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$3(o, minLen); }
13414
- function _arrayLikeToArray$3(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; }
13520
+ function _createForOfIteratorHelper$2(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$2(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; } } }; }
13521
+ function _unsupportedIterableToArray$2(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$2(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$2(o, minLen); }
13522
+ function _arrayLikeToArray$2(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; }
13415
13523
  var RGroupFragmentTool = function () {
13416
13524
  function RGroupFragmentTool(editor) {
13417
13525
  _classCallCheck__default["default"](this, RGroupFragmentTool);
@@ -13448,7 +13556,7 @@ var RGroupFragmentTool = function () {
13448
13556
  }
13449
13557
  }
13450
13558
  if (atomResult.length > 0) {
13451
- var _iterator = _createForOfIteratorHelper$3(atomResult),
13559
+ var _iterator = _createForOfIteratorHelper$2(atomResult),
13452
13560
  _step;
13453
13561
  try {
13454
13562
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -13468,7 +13576,7 @@ var RGroupFragmentTool = function () {
13468
13576
  });
13469
13577
  return;
13470
13578
  } else if (bondResult.length > 0) {
13471
- var _iterator2 = _createForOfIteratorHelper$3(bondResult),
13579
+ var _iterator2 = _createForOfIteratorHelper$2(bondResult),
13472
13580
  _step2;
13473
13581
  try {
13474
13582
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
@@ -14130,6 +14238,47 @@ var TemplateTool = function () {
14130
14238
  editor.hoverIcon.updatePosition();
14131
14239
  }
14132
14240
  _createClass__default["default"](TemplateTool, [{
14241
+ key: "struct",
14242
+ get: function get() {
14243
+ return this.editor.render.ctab.molecule;
14244
+ }
14245
+ }, {
14246
+ key: "functionalGroups",
14247
+ get: function get() {
14248
+ return this.struct.functionalGroups;
14249
+ }
14250
+ }, {
14251
+ key: "isModeFunctionalGroup",
14252
+ get: function get() {
14253
+ return this.mode === MODES.FG;
14254
+ }
14255
+ }, {
14256
+ key: "closestItem",
14257
+ get: function get() {
14258
+ return this.editor.findItem(this.event, ['atoms', 'bonds', 'sgroups', 'functionalGroups']);
14259
+ }
14260
+ }, {
14261
+ key: "isNeedToShowRemoveAbbreviationPopup",
14262
+ get: function get() {
14263
+ var _this$closestItem, _this$functionalGroup;
14264
+ var targetId = this.findKeyOfRelatedGroupId((_this$closestItem = this.closestItem) === null || _this$closestItem === void 0 ? void 0 : _this$closestItem.id);
14265
+ var isTargetExpanded = (_this$functionalGroup = this.functionalGroups.get(targetId)) === null || _this$functionalGroup === void 0 ? void 0 : _this$functionalGroup.isExpanded;
14266
+ var isTargetAtomOrBond = this.targetGroupsIds.length && !this.isModeFunctionalGroup;
14267
+ return Boolean(isTargetExpanded || isTargetAtomOrBond);
14268
+ }
14269
+ }, {
14270
+ key: "findKeyOfRelatedGroupId",
14271
+ value: function findKeyOfRelatedGroupId(clickedClosestItemId) {
14272
+ var targetId;
14273
+ var relatedGroupId = ketcherCore.FunctionalGroup.findFunctionalGroupByAtom(this.functionalGroups, clickedClosestItemId);
14274
+ this.functionalGroups.forEach(function (fg, key) {
14275
+ if (fg.relatedSGroupId === relatedGroupId) {
14276
+ targetId = key;
14277
+ }
14278
+ });
14279
+ return targetId;
14280
+ }
14281
+ }, {
14133
14282
  key: "showRemoveAbbreviationPopup",
14134
14283
  value: function showRemoveAbbreviationPopup() {
14135
14284
  var _this = this;
@@ -14140,77 +14289,68 @@ var TemplateTool = function () {
14140
14289
  return Promise.resolve();
14141
14290
  });
14142
14291
  }
14143
- }, {
14144
- key: "isModeFunctionalGroup",
14145
- get: function get() {
14146
- return this.mode === MODES.FG;
14147
- }
14148
14292
  }, {
14149
14293
  key: "mousedown",
14150
14294
  value: function () {
14151
14295
  var _mousedown = _asyncToGenerator__default["default"]( _regeneratorRuntime__default["default"].mark(function _callee(event) {
14152
- var _struct$functionalGro;
14153
- 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;
14296
+ var _this2 = this;
14297
+ var _this$closestItem2, _this$closestItem3, _this$closestItem4, dragCtx, ci, _this$struct$atoms$ge, _this$struct$halfBond, xy0, bond, frid, frIds, count, loop, _this$struct$halfBond2, _this$struct$loops$ge, loopHbs, sign;
14154
14298
  return _regeneratorRuntime__default["default"].wrap(function _callee$(_context) {
14155
14299
  while (1) {
14156
14300
  switch (_context.prev = _context.next) {
14157
14301
  case 0:
14158
- closestItem = this.editor.findItem(event, ['atoms', 'bonds', 'sgroups', 'functionalGroups']);
14159
- ctab = this.editor.render.ctab;
14160
- struct = ctab.molecule;
14161
- if (struct.functionalGroups.size) {
14162
- this.targetGroupsIds = getGroupIdsFromItemArrays(struct, _objectSpread$N(_objectSpread$N({}, (closestItem === null || closestItem === void 0 ? void 0 : closestItem.map) === 'atoms' && {
14163
- atoms: [closestItem.id]
14164
- }), (closestItem === null || closestItem === void 0 ? void 0 : closestItem.map) === 'bonds' && {
14165
- bonds: [closestItem.id]
14302
+ this.event = event;
14303
+ if (this.functionalGroups.size) {
14304
+ this.targetGroupsIds = getGroupIdsFromItemArrays(this.struct, _objectSpread$N(_objectSpread$N({}, ((_this$closestItem2 = this.closestItem) === null || _this$closestItem2 === void 0 ? void 0 : _this$closestItem2.map) === 'atoms' && {
14305
+ atoms: [this.closestItem.id]
14306
+ }), ((_this$closestItem3 = this.closestItem) === null || _this$closestItem3 === void 0 ? void 0 : _this$closestItem3.map) === 'bonds' && {
14307
+ bonds: [this.closestItem.id]
14166
14308
  }));
14167
14309
  if (
14168
- (closestItem === null || closestItem === void 0 ? void 0 : closestItem.map) === 'functionalGroups' && ketcherCore.FunctionalGroup.isContractedFunctionalGroup(closestItem.id, struct.functionalGroups)) {
14169
- this.targetGroupsIds.push(closestItem.id);
14310
+ ((_this$closestItem4 = this.closestItem) === null || _this$closestItem4 === void 0 ? void 0 : _this$closestItem4.map) === 'functionalGroups' && ketcherCore.FunctionalGroup.isContractedFunctionalGroup(this.closestItem.id, this.functionalGroups)) {
14311
+ this.targetGroupsIds.push(this.closestItem.id);
14170
14312
  }
14171
14313
  }
14172
- isTargetExpanded = (_struct$functionalGro = struct.functionalGroups.get(this.targetGroupsIds[0])) === null || _struct$functionalGro === void 0 ? void 0 : _struct$functionalGro.isExpanded;
14173
- isTargetAtomOrBond = this.targetGroupsIds.length && !this.isModeFunctionalGroup;
14174
- if (!(isTargetAtomOrBond || isTargetExpanded)) {
14175
- _context.next = 10;
14314
+ if (!this.isNeedToShowRemoveAbbreviationPopup) {
14315
+ _context.next = 6;
14176
14316
  break;
14177
14317
  }
14178
- _context.next = 9;
14318
+ _context.next = 5;
14179
14319
  return this.showRemoveAbbreviationPopup();
14180
- case 9:
14320
+ case 5:
14181
14321
  return _context.abrupt("return");
14182
- case 10:
14322
+ case 6:
14183
14323
  this.editor.hover(null);
14184
14324
  this.dragCtx = {
14185
- xy0: this.editor.render.page2obj(event),
14186
- item: this.editor.findItem(event, this.findItems)
14325
+ xy0: this.editor.render.page2obj(this.event),
14326
+ item: this.editor.findItem(this.event, this.findItems)
14187
14327
  };
14188
14328
  dragCtx = this.dragCtx;
14189
14329
  ci = dragCtx.item;
14190
14330
  if (!(!ci || this.isSaltOrSolvent)) {
14191
- _context.next = 17;
14331
+ _context.next = 13;
14192
14332
  break;
14193
14333
  }
14194
14334
  delete dragCtx.item;
14195
14335
  return _context.abrupt("return");
14196
- case 17:
14336
+ case 13:
14197
14337
  if (ci.map === 'bonds' && !this.isModeFunctionalGroup) {
14198
14338
  xy0 = new ketcherCore.Vec2();
14199
- bond = struct.bonds.get(ci.id);
14200
- 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;
14201
- frIds = struct.getFragmentIds(frid);
14339
+ bond = this.struct.bonds.get(ci.id);
14340
+ frid = (_this$struct$atoms$ge = this.struct.atoms.get(bond === null || bond === void 0 ? void 0 : bond.begin)) === null || _this$struct$atoms$ge === void 0 ? void 0 : _this$struct$atoms$ge.fragment;
14341
+ frIds = this.struct.getFragmentIds(frid);
14202
14342
  count = 0;
14203
- 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;
14343
+ loop = (_this$struct$halfBond = this.struct.halfBonds.get(bond === null || bond === void 0 ? void 0 : bond.hb1)) === null || _this$struct$halfBond === void 0 ? void 0 : _this$struct$halfBond.loop;
14204
14344
  if (loop && loop < 0) {
14205
- 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;
14345
+ loop = (_this$struct$halfBond2 = this.struct.halfBonds.get(bond === null || bond === void 0 ? void 0 : bond.hb2)) === null || _this$struct$halfBond2 === void 0 ? void 0 : _this$struct$halfBond2.loop;
14206
14346
  }
14207
14347
  if (loop && loop >= 0) {
14208
- loopHbs = (_struct$loops$get = struct.loops.get(loop)) === null || _struct$loops$get === void 0 ? void 0 : _struct$loops$get.hbs;
14348
+ loopHbs = (_this$struct$loops$ge = this.struct.loops.get(loop)) === null || _this$struct$loops$ge === void 0 ? void 0 : _this$struct$loops$ge.hbs;
14209
14349
  loopHbs === null || loopHbs === void 0 ? void 0 : loopHbs.forEach(function (hb) {
14210
- var _struct$halfBonds$get3;
14211
- var halfBondBegin = (_struct$halfBonds$get3 = struct.halfBonds.get(hb)) === null || _struct$halfBonds$get3 === void 0 ? void 0 : _struct$halfBonds$get3.begin;
14350
+ var _this2$struct$halfBon;
14351
+ var halfBondBegin = (_this2$struct$halfBon = _this2.struct.halfBonds.get(hb)) === null || _this2$struct$halfBon === void 0 ? void 0 : _this2$struct$halfBon.begin;
14212
14352
  if (halfBondBegin) {
14213
- var hbbAtom = struct.atoms.get(halfBondBegin);
14353
+ var hbbAtom = _this2.struct.atoms.get(halfBondBegin);
14214
14354
  if (hbbAtom) {
14215
14355
  xy0.add_(hbbAtom.pp);
14216
14356
  count++;
@@ -14219,7 +14359,7 @@ var TemplateTool = function () {
14219
14359
  });
14220
14360
  } else {
14221
14361
  frIds.forEach(function (id) {
14222
- var atomById = struct.atoms.get(id);
14362
+ var atomById = _this2.struct.atoms.get(id);
14223
14363
  if (atomById) {
14224
14364
  xy0.add_(atomById.pp);
14225
14365
  count++;
@@ -14227,11 +14367,11 @@ var TemplateTool = function () {
14227
14367
  });
14228
14368
  }
14229
14369
  dragCtx.v0 = xy0.scaled(1 / count);
14230
- sign = getSign(struct, bond, dragCtx.v0);
14370
+ sign = getSign(this.struct, bond, dragCtx.v0);
14231
14371
  dragCtx.sign1 = sign || 1;
14232
14372
  dragCtx.sign2 = this.template.sign;
14233
14373
  }
14234
- case 18:
14374
+ case 14:
14235
14375
  case "end":
14236
14376
  return _context.stop();
14237
14377
  }
@@ -14256,10 +14396,9 @@ var TemplateTool = function () {
14256
14396
  var ci = dragCtx.item;
14257
14397
  var targetPos = null;
14258
14398
  var eventPos = this.editor.render.page2obj(event);
14259
- var struct = this.editor.render.ctab.molecule;
14260
14399
  if (ci && ci.map === 'bonds' && !this.isModeFunctionalGroup) {
14261
- var bond = struct.bonds.get(ci.id);
14262
- var sign = getSign(struct, bond, eventPos);
14400
+ var bond = this.struct.bonds.get(ci.id);
14401
+ var sign = getSign(this.struct, bond, eventPos);
14263
14402
  if (dragCtx.sign1 * this.template.sign > 0) {
14264
14403
  sign = -sign;
14265
14404
  }
@@ -14283,9 +14422,9 @@ var TemplateTool = function () {
14283
14422
  if (!ci) {
14284
14423
  targetPos = dragCtx.xy0;
14285
14424
  } else if (ci.map === 'atoms' || ci.map === 'functionalGroups') {
14286
- var atomId = getTargetAtomId(struct, ci);
14425
+ var atomId = getTargetAtomId(this.struct, ci);
14287
14426
  if (atomId !== undefined) {
14288
- var atom = struct.atoms.get(atomId);
14427
+ var atom = this.struct.atoms.get(atomId);
14289
14428
  targetPos = atom === null || atom === void 0 ? void 0 : atom.pp;
14290
14429
  if (targetPos) {
14291
14430
  extraBond = this.isModeFunctionalGroup ? true : ketcherCore.Vec2.dist(targetPos, eventPos) > 1;
@@ -14325,7 +14464,7 @@ var TemplateTool = function () {
14325
14464
  action = _fromTemplateOnCanvas2[0];
14326
14465
  pasteItems = _fromTemplateOnCanvas2[1];
14327
14466
  } else if ((ci === null || ci === void 0 ? void 0 : ci.map) === 'atoms' || (ci === null || ci === void 0 ? void 0 : ci.map) === 'functionalGroups') {
14328
- var _atomId = getTargetAtomId(struct, ci);
14467
+ var _atomId = getTargetAtomId(this.struct, ci);
14329
14468
  var _fromTemplateOnAtom = ketcherCore.fromTemplateOnAtom(this.editor.render.ctab, this.template, _atomId, angle, extraBond);
14330
14469
  var _fromTemplateOnAtom2 = _slicedToArray__default["default"](_fromTemplateOnAtom, 2);
14331
14470
  action = _fromTemplateOnAtom2[0];
@@ -14344,7 +14483,7 @@ var TemplateTool = function () {
14344
14483
  }, {
14345
14484
  key: "mouseup",
14346
14485
  value: function mouseup(event) {
14347
- var _this2 = this,
14486
+ var _this3 = this,
14348
14487
  _ci;
14349
14488
  var dragCtx = this.dragCtx;
14350
14489
  if (!dragCtx) {
@@ -14352,9 +14491,7 @@ var TemplateTool = function () {
14352
14491
  }
14353
14492
  delete this.dragCtx;
14354
14493
  var restruct = this.editor.render.ctab;
14355
- var struct = restruct.molecule;
14356
14494
  var ci = dragCtx.item;
14357
- var functionalGroups = struct.functionalGroups;
14358
14495
  if (dragCtx.action && ci && ci.map === 'bonds' && !this.isModeFunctionalGroup) {
14359
14496
  dragCtx.action.perform(restruct);
14360
14497
  var promise = ketcherCore.fromTemplateOnBondAction(restruct, this.template, ci.id, this.editor.event, dragCtx.sign1 * dragCtx.sign2 > 0, true);
@@ -14362,9 +14499,9 @@ var TemplateTool = function () {
14362
14499
  var _ref2 = _slicedToArray__default["default"](_ref, 2),
14363
14500
  action = _ref2[0],
14364
14501
  pasteItems = _ref2[1];
14365
- var mergeItems = ketcherCore.getItemsToFuse(_this2.editor, pasteItems);
14502
+ var mergeItems = ketcherCore.getItemsToFuse(_this3.editor, pasteItems);
14366
14503
  action = ketcherCore.fromItemsFuse(restruct, mergeItems).mergeWith(action);
14367
- _this2.editor.update(action);
14504
+ _this3.editor.update(action);
14368
14505
  });
14369
14506
  return true;
14370
14507
  }
@@ -14372,14 +14509,14 @@ var TemplateTool = function () {
14372
14509
  var pasteItems = null;
14373
14510
  if (this.isSaltOrSolvent) {
14374
14511
  addSaltsAndSolventsOnCanvasWithoutMerge(restruct, this.template, dragCtx, this.editor);
14512
+ this.editor.hover(this.editor.findItem(event, this.findItems), null, event);
14375
14513
  return true;
14376
- } else if (((_ci = ci) === null || _ci === void 0 ? void 0 : _ci.map) === 'functionalGroups' && ketcherCore.FunctionalGroup.isContractedFunctionalGroup(ci.id, functionalGroups) && this.isModeFunctionalGroup && this.targetGroupsIds.length) {
14514
+ } else if (((_ci = ci) === null || _ci === void 0 ? void 0 : _ci.map) === 'functionalGroups' && ketcherCore.FunctionalGroup.isContractedFunctionalGroup(ci.id, this.functionalGroups) && this.isModeFunctionalGroup && this.targetGroupsIds.length) {
14377
14515
  functionalGroupRemoveAction = new ketcherCore.Action();
14378
- var _struct = this.editor.struct();
14379
14516
  var _restruct = this.editor.render.ctab;
14380
- var functionalGroupToReplace = _struct.sgroups.get(ci.id);
14381
- var attachmentAtomId = functionalGroupToReplace.getAttAtomId(_struct);
14382
- var atomsWithoutAttachmentAtom = ketcherCore.SGroup.getAtoms(_struct, functionalGroupToReplace).filter(function (id) {
14517
+ var functionalGroupToReplace = this.struct.sgroups.get(ci.id);
14518
+ var attachmentAtomId = functionalGroupToReplace.getAttAtomId(this.struct);
14519
+ var atomsWithoutAttachmentAtom = ketcherCore.SGroup.getAtoms(this.struct, functionalGroupToReplace).filter(function (id) {
14383
14520
  return id !== attachmentAtomId;
14384
14521
  });
14385
14522
  functionalGroupRemoveAction.mergeWith(ketcherCore.fromSgroupDeletion(_restruct, ci.id));
@@ -14405,10 +14542,10 @@ var TemplateTool = function () {
14405
14542
  if (degree && degree > 1) {
14406
14543
  angle = null;
14407
14544
  } else if (degree === 1) {
14408
- var _struct$halfBonds$get4;
14409
- var atom = struct.atoms.get(ci.id);
14410
- var neiId = atom && ((_struct$halfBonds$get4 = struct.halfBonds.get(atom.neighbors[0])) === null || _struct$halfBonds$get4 === void 0 ? void 0 : _struct$halfBonds$get4.end);
14411
- var nei = (neiId || neiId === 0) && struct.atoms.get(neiId);
14545
+ var _this$struct$halfBond3;
14546
+ var atom = this.struct.atoms.get(ci.id);
14547
+ var neiId = atom && ((_this$struct$halfBond3 = this.struct.halfBonds.get(atom.neighbors[0])) === null || _this$struct$halfBond3 === void 0 ? void 0 : _this$struct$halfBond3.end);
14548
+ var nei = (neiId || neiId === 0) && this.struct.atoms.get(neiId);
14412
14549
  angle = event.ctrlKey ? utils.calcAngle(nei === null || nei === void 0 ? void 0 : nei.pp, atom === null || atom === void 0 ? void 0 : atom.pp) : utils.fracAngle(utils.calcAngle(nei.pp, atom === null || atom === void 0 ? void 0 : atom.pp), null);
14413
14550
  } else {
14414
14551
  angle = 0;
@@ -14427,10 +14564,10 @@ var TemplateTool = function () {
14427
14564
  var _ref4 = _slicedToArray__default["default"](_ref3, 2),
14428
14565
  action = _ref4[0],
14429
14566
  pasteItems = _ref4[1];
14430
- if (!_this2.isModeFunctionalGroup) {
14431
- var mergeItems = ketcherCore.getItemsToFuse(_this2.editor, pasteItems);
14567
+ if (!_this3.isModeFunctionalGroup) {
14568
+ var mergeItems = ketcherCore.getItemsToFuse(_this3.editor, pasteItems);
14432
14569
  action = ketcherCore.fromItemsFuse(restruct, mergeItems).mergeWith(action);
14433
- _this2.editor.update(action);
14570
+ _this3.editor.update(action);
14434
14571
  }
14435
14572
  });
14436
14573
  return true;
@@ -14628,9 +14765,6 @@ var tools = {
14628
14765
  text: TextTool
14629
14766
  };
14630
14767
 
14631
- function _createForOfIteratorHelper$2(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$2(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; } } }; }
14632
- function _unsupportedIterableToArray$2(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$2(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$2(o, minLen); }
14633
- function _arrayLikeToArray$2(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; }
14634
14768
  function ownKeys$M(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; }
14635
14769
  function _objectSpread$M(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$M(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$M(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
14636
14770
  function handleHotkeyOverItem(props) {
@@ -14640,20 +14774,53 @@ function handleHotkeyOverItem(props) {
14640
14774
  handleDialog(props);
14641
14775
  } else if (props.newAction.tool) {
14642
14776
  handleTool(props);
14777
+ } else {
14778
+ handleOtherActions(props);
14643
14779
  }
14644
14780
  }
14645
- function handleEraser(_ref) {
14646
- var editor = _ref.editor,
14647
- hoveredItem = _ref.hoveredItem;
14648
- var action = ketcherCore.fromFragmentDeletion(editor.render.ctab, mapItemsToArrays(hoveredItem));
14781
+ function handleOtherActions(_ref) {
14782
+ var dispatch = _ref.dispatch,
14783
+ newAction = _ref.newAction;
14784
+ dispatch(onAction(newAction));
14785
+ }
14786
+ function eraseItem(_ref2) {
14787
+ var editor = _ref2.editor,
14788
+ item = _ref2.item;
14789
+ var action = ketcherCore.fromFragmentDeletion(editor.render.ctab, item);
14649
14790
  editor.update(action);
14650
14791
  editor.hover(null);
14651
14792
  }
14652
- function handleDialog(_ref2) {
14653
- var hoveredItem = _ref2.hoveredItem,
14654
- newAction = _ref2.newAction,
14655
- editor = _ref2.editor,
14656
- dispatch = _ref2.dispatch;
14793
+ function handleEraser(_ref3) {
14794
+ var editor = _ref3.editor,
14795
+ hoveredItem = _ref3.hoveredItem,
14796
+ newAction = _ref3.newAction,
14797
+ dispatch = _ref3.dispatch;
14798
+ var item = mapItemsToArrays(hoveredItem);
14799
+ var itemType = Object.keys(hoveredItem)[0];
14800
+ if ([STRUCT_TYPE.atoms, STRUCT_TYPE.bonds].includes(itemType)) {
14801
+ isFunctionalGroupChange({
14802
+ editor: editor,
14803
+ hoveredItemId: item[itemType][0],
14804
+ newAction: newAction,
14805
+ dispatch: dispatch
14806
+ }, itemType).then(function (res) {
14807
+ res && eraseItem({
14808
+ editor: editor,
14809
+ item: item
14810
+ });
14811
+ });
14812
+ return;
14813
+ }
14814
+ eraseItem({
14815
+ editor: editor,
14816
+ item: item
14817
+ });
14818
+ }
14819
+ function handleDialog(_ref4) {
14820
+ var hoveredItem = _ref4.hoveredItem,
14821
+ newAction = _ref4.newAction,
14822
+ editor = _ref4.editor,
14823
+ dispatch = _ref4.dispatch;
14657
14824
  var dialogType = Object.keys(hoveredItem)[0];
14658
14825
  var dialogHandler = getDialogHandler(dialogType);
14659
14826
  var hoveredItemId = hoveredItem[dialogType];
@@ -14679,11 +14846,11 @@ function getDialogHandler(itemType) {
14679
14846
  var dialog = dialogs[itemType];
14680
14847
  return dialog;
14681
14848
  }
14682
- function handleAtomPropsDialog(_ref3) {
14683
- var hoveredItemId = _ref3.hoveredItemId,
14684
- newAction = _ref3.newAction,
14685
- editor = _ref3.editor,
14686
- dispatch = _ref3.dispatch;
14849
+ function handleAtomPropsDialog(_ref5) {
14850
+ var hoveredItemId = _ref5.hoveredItemId,
14851
+ newAction = _ref5.newAction,
14852
+ editor = _ref5.editor,
14853
+ dispatch = _ref5.dispatch;
14687
14854
  var selection = editor.selection();
14688
14855
  var atomsSelected = selection === null || selection === void 0 ? void 0 : selection.atoms;
14689
14856
  var restruct = editor.render.ctab;
@@ -14706,11 +14873,11 @@ function handleAtomPropsDialog(_ref3) {
14706
14873
  });
14707
14874
  }
14708
14875
  }
14709
- function handleBondPropsDialog(_ref4) {
14710
- var hoveredItemId = _ref4.hoveredItemId,
14711
- newAction = _ref4.newAction,
14712
- editor = _ref4.editor,
14713
- dispatch = _ref4.dispatch;
14876
+ function handleBondPropsDialog(_ref6) {
14877
+ var hoveredItemId = _ref6.hoveredItemId,
14878
+ newAction = _ref6.newAction,
14879
+ editor = _ref6.editor,
14880
+ dispatch = _ref6.dispatch;
14714
14881
  var restruct = editor.render.ctab;
14715
14882
  var bondFromStruct = restruct.bonds.get(hoveredItemId);
14716
14883
  var convertedBondForModal = fromBond(bondFromStruct === null || bondFromStruct === void 0 ? void 0 : bondFromStruct.b);
@@ -14721,11 +14888,11 @@ function handleBondPropsDialog(_ref4) {
14721
14888
  return null;
14722
14889
  });
14723
14890
  }
14724
- function handleTool(_ref5) {
14725
- var hoveredItem = _ref5.hoveredItem,
14726
- newAction = _ref5.newAction,
14727
- editor = _ref5.editor,
14728
- dispatch = _ref5.dispatch;
14891
+ function handleTool(_ref7) {
14892
+ var hoveredItem = _ref7.hoveredItem,
14893
+ newAction = _ref7.newAction,
14894
+ editor = _ref7.editor,
14895
+ dispatch = _ref7.dispatch;
14729
14896
  var _loop = function _loop(item) {
14730
14897
  var toolHandler = getToolHandler(item, newAction.tool);
14731
14898
  var isChangeStructureTool = newAction.tool !== 'hand';
@@ -14737,7 +14904,7 @@ function handleTool(_ref5) {
14737
14904
  newAction: newAction,
14738
14905
  dispatch: dispatch
14739
14906
  };
14740
- isFunctionalGroupChange(props).then(function (result) {
14907
+ isFunctionalGroupChange(props, item).then(function (result) {
14741
14908
  if (!result && isChangeStructureTool) return;
14742
14909
  toolHandler(props);
14743
14910
  });
@@ -14747,17 +14914,17 @@ function handleTool(_ref5) {
14747
14914
  _loop(item);
14748
14915
  }
14749
14916
  }
14750
- function isFunctionalGroupChange(_x) {
14917
+ function isFunctionalGroupChange(_x, _x2) {
14751
14918
  return _isFunctionalGroupChange.apply(this, arguments);
14752
14919
  }
14753
14920
  function _isFunctionalGroupChange() {
14754
- _isFunctionalGroupChange = _asyncToGenerator__default["default"]( _regeneratorRuntime__default["default"].mark(function _callee(props) {
14921
+ _isFunctionalGroupChange = _asyncToGenerator__default["default"]( _regeneratorRuntime__default["default"].mark(function _callee(props, type) {
14755
14922
  return _regeneratorRuntime__default["default"].wrap(function _callee$(_context) {
14756
14923
  while (1) {
14757
14924
  switch (_context.prev = _context.next) {
14758
14925
  case 0:
14759
14926
  _context.next = 2;
14760
- return isChangingFunctionalGroup(props);
14927
+ return isChangingFunctionalGroup(props, type);
14761
14928
  case 2:
14762
14929
  return _context.abrupt("return", _context.sent);
14763
14930
  case 3:
@@ -14785,13 +14952,13 @@ function getToolHandler(itemType) {
14785
14952
  rgroupatom: function rgroupatom(props) {
14786
14953
  return handleRGroupAtomTool(props);
14787
14954
  },
14788
- sgroup: function sgroup(_ref6) {
14789
- var editor = _ref6.editor,
14790
- hoveredItemId = _ref6.hoveredItemId;
14955
+ sgroup: function sgroup(_ref8) {
14956
+ var editor = _ref8.editor,
14957
+ hoveredItemId = _ref8.hoveredItemId;
14791
14958
  tools.sgroup.sgroupDialog(editor, hoveredItemId);
14792
14959
  },
14793
- hand: function hand(_ref7) {
14794
- var dispatch = _ref7.dispatch;
14960
+ hand: function hand(_ref9) {
14961
+ var dispatch = _ref9.dispatch;
14795
14962
  return dispatch(onAction({
14796
14963
  tool: 'hand'
14797
14964
  }));
@@ -14805,26 +14972,28 @@ function getToolHandler(itemType) {
14805
14972
  }
14806
14973
  return items._default[toolName];
14807
14974
  }
14808
- function handleAtomTool(_ref8) {
14809
- var hoveredItemId = _ref8.hoveredItemId,
14810
- newAction = _ref8.newAction,
14811
- editor = _ref8.editor;
14975
+ function handleAtomTool(_ref10) {
14976
+ var hoveredItemId = _ref10.hoveredItemId,
14977
+ newAction = _ref10.newAction,
14978
+ editor = _ref10.editor;
14812
14979
  var atomProps = _objectSpread$M({}, newAction.opts);
14813
14980
  var updatedAtoms = ketcherCore.fromAtomsAttrs(editor.render.ctab, hoveredItemId, atomProps, true);
14814
14981
  editor.update(updatedAtoms);
14815
14982
  }
14816
- function handleBondTool(_ref9) {
14817
- var hoveredItemId = _ref9.hoveredItemId,
14818
- newAction = _ref9.newAction,
14819
- editor = _ref9.editor;
14820
- var newBond = ketcherCore.fromBondAddition(editor.render.ctab, newAction.opts, hoveredItemId, undefined)[0];
14983
+ function handleBondTool(_ref11) {
14984
+ var hoveredItemId = _ref11.hoveredItemId,
14985
+ newAction = _ref11.newAction,
14986
+ editor = _ref11.editor;
14987
+ var newBond = ketcherCore.fromBondAddition(editor.render.ctab, newAction.opts, hoveredItemId, {
14988
+ label: 'C'
14989
+ })[0];
14821
14990
  editor.update(newBond);
14822
14991
  }
14823
- function handleChargeTool(_ref10) {
14992
+ function handleChargeTool(_ref12) {
14824
14993
  var _editor$render$ctab$a;
14825
- var hoveredItemId = _ref10.hoveredItemId,
14826
- newAction = _ref10.newAction,
14827
- editor = _ref10.editor;
14994
+ var hoveredItemId = _ref12.hoveredItemId,
14995
+ newAction = _ref12.newAction,
14996
+ editor = _ref12.editor;
14828
14997
  var existingAtom = (_editor$render$ctab$a = editor.render.ctab.atoms.get(hoveredItemId)) === null || _editor$render$ctab$a === void 0 ? void 0 : _editor$render$ctab$a.a;
14829
14998
  if (existingAtom) {
14830
14999
  var updatedAtom = ketcherCore.fromAtomsAttrs(editor.render.ctab, hoveredItemId, {
@@ -14840,17 +15009,17 @@ function mapItemsToArrays(items) {
14840
15009
  }
14841
15010
  return mappedItems;
14842
15011
  }
14843
- function handleRGroupAtomTool(_x2) {
15012
+ function handleRGroupAtomTool(_x3) {
14844
15013
  return _handleRGroupAtomTool.apply(this, arguments);
14845
15014
  }
14846
15015
  function _handleRGroupAtomTool() {
14847
- _handleRGroupAtomTool = _asyncToGenerator__default["default"]( _regeneratorRuntime__default["default"].mark(function _callee2(_ref11) {
15016
+ _handleRGroupAtomTool = _asyncToGenerator__default["default"]( _regeneratorRuntime__default["default"].mark(function _callee2(_ref13) {
14848
15017
  var hoveredItemId, editor, struct, atom, rglabel, label, element;
14849
15018
  return _regeneratorRuntime__default["default"].wrap(function _callee2$(_context2) {
14850
15019
  while (1) {
14851
15020
  switch (_context2.prev = _context2.next) {
14852
15021
  case 0:
14853
- hoveredItemId = _ref11.hoveredItemId, editor = _ref11.editor;
15022
+ hoveredItemId = _ref13.hoveredItemId, editor = _ref13.editor;
14854
15023
  struct = editor.render.ctab.molecule;
14855
15024
  atom = hoveredItemId || hoveredItemId === 0 ? struct.atoms.get(hoveredItemId) : null;
14856
15025
  rglabel = atom ? atom.rglabel : 0;
@@ -14887,64 +15056,36 @@ function _handleRGroupAtomTool() {
14887
15056
  }));
14888
15057
  return _handleRGroupAtomTool.apply(this, arguments);
14889
15058
  }
14890
- function isChangingFunctionalGroup(_x3) {
15059
+ function getFunctionalGroupIdByItem(editor, hoveredItemId, type) {
15060
+ var molecule = editor.render.ctab.molecule;
15061
+ var functionalGroups = molecule.functionalGroups;
15062
+ return type === 'atoms' ? ketcherCore.FunctionalGroup.findFunctionalGroupByAtom(functionalGroups, hoveredItemId) : ketcherCore.FunctionalGroup.findFunctionalGroupByBond(molecule, functionalGroups, hoveredItemId);
15063
+ }
15064
+ function isChangingFunctionalGroup(_x4, _x5) {
14891
15065
  return _isChangingFunctionalGroup.apply(this, arguments);
14892
15066
  }
14893
15067
  function _isChangingFunctionalGroup() {
14894
- _isChangingFunctionalGroup = _asyncToGenerator__default["default"]( _regeneratorRuntime__default["default"].mark(function _callee3(_ref12) {
14895
- var _editor$render$ctab$a2;
14896
- var hoveredItemId, editor, atomResult, result, atom, molecule, functionalGroups, sgroupsOnCanvas, atomId, isFunctionalGroup, _iterator, _step, id, fgId;
15068
+ _isChangingFunctionalGroup = _asyncToGenerator__default["default"]( _regeneratorRuntime__default["default"].mark(function _callee3(_ref14, type) {
15069
+ var hoveredItemId, editor, fgId;
14897
15070
  return _regeneratorRuntime__default["default"].wrap(function _callee3$(_context3) {
14898
15071
  while (1) {
14899
15072
  switch (_context3.prev = _context3.next) {
14900
15073
  case 0:
14901
- hoveredItemId = _ref12.hoveredItemId, editor = _ref12.editor;
14902
- atomResult = [];
14903
- result = [];
14904
- atom = (_editor$render$ctab$a2 = editor.render.ctab.atoms.get(hoveredItemId)) === null || _editor$render$ctab$a2 === void 0 ? void 0 : _editor$render$ctab$a2.a;
14905
- molecule = editor.render.ctab.molecule;
14906
- functionalGroups = molecule.functionalGroups;
14907
- sgroupsOnCanvas = Array.from(molecule.sgroups.values());
14908
- if (atom && functionalGroups) {
14909
- atomId = ketcherCore.FunctionalGroup.atomsInFunctionalGroup(functionalGroups, hoveredItemId);
14910
- if (atomId !== null) {
14911
- atomResult.push(atomId);
14912
- }
14913
- }
14914
- isFunctionalGroup = atomResult.length > 0;
14915
- if (!isFunctionalGroup) {
14916
- _context3.next = 17;
15074
+ hoveredItemId = _ref14.hoveredItemId, editor = _ref14.editor;
15075
+ fgId = getFunctionalGroupIdByItem(editor, hoveredItemId, type);
15076
+ if (!(fgId !== null)) {
15077
+ _context3.next = 6;
14917
15078
  break;
14918
15079
  }
14919
- if (!ketcherCore.SGroup.isAtomInSaltOrSolvent(hoveredItemId, sgroupsOnCanvas)) {
14920
- _context3.next = 12;
14921
- break;
14922
- }
14923
- return _context3.abrupt("return", false);
14924
- case 12:
14925
- _iterator = _createForOfIteratorHelper$2(atomResult);
14926
- try {
14927
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
14928
- id = _step.value;
14929
- fgId = ketcherCore.FunctionalGroup.findFunctionalGroupByAtom(functionalGroups, id);
14930
- if (fgId !== null && !result.includes(fgId)) {
14931
- result.push(fgId);
14932
- }
14933
- }
14934
- } catch (err) {
14935
- _iterator.e(err);
14936
- } finally {
14937
- _iterator.f();
14938
- }
14939
- _context3.next = 16;
15080
+ _context3.next = 5;
14940
15081
  return editor.event.removeFG.dispatch({
14941
- fgIds: result
15082
+ fgIds: [fgId]
14942
15083
  });
14943
- case 16:
14944
- return _context3.abrupt("return", _context3.sent);
14945
- case 17:
15084
+ case 5:
15085
+ return _context3.abrupt("return", false);
15086
+ case 6:
14946
15087
  return _context3.abrupt("return", true);
14947
- case 18:
15088
+ case 7:
14948
15089
  case "end":
14949
15090
  return _context3.stop();
14950
15091
  }
@@ -14962,15 +15103,10 @@ function initKeydownListener(element) {
14962
15103
  });
14963
15104
  };
14964
15105
  }
14965
- function removeNotRenderedStruct(actionTool, event, dispatch) {
14966
- var code = event.code,
14967
- metaKey = event.metaKey;
14968
- if (actionTool.tool === 'paste' && code === 'KeyS' && metaKey) {
14969
- var savedSelectedTool = SettingsManager.selectionTool;
14970
- dispatch({
14971
- type: 'ACTION',
14972
- action: savedSelectedTool || tools$1['select-rectangle'].action
14973
- });
15106
+ function removeNotRenderedStruct(actionTool, group, dispatch) {
15107
+ var affectedTools = ['paste', 'template'];
15108
+ if (affectedTools.includes(actionTool.tool) && group !== null && group !== void 0 && group.includes('save')) {
15109
+ dispatch(removeStructAction());
14974
15110
  }
14975
15111
  }
14976
15112
  function keyHandle(dispatch, state, hotKeys, event) {
@@ -15022,7 +15158,7 @@ function keyHandle(dispatch, state, hotKeys, event) {
15022
15158
  event.preventDefault();
15023
15159
  return;
15024
15160
  }
15025
- removeNotRenderedStruct(actionTool, event, dispatch);
15161
+ removeNotRenderedStruct(actionTool, group, dispatch);
15026
15162
  if (actions.indexOf(actName) === -1) {
15027
15163
  var newAction = config[actName].action;
15028
15164
  var _hoveredItem = getHoveredItem(render.ctab);
@@ -15192,7 +15328,7 @@ var mapDispatchToProps$d = function mapDispatchToProps(dispatch) {
15192
15328
  };
15193
15329
  var AppHiddenContainer = reactRedux.connect(null, mapDispatchToProps$d)(AppHidden);
15194
15330
 
15195
- var classes$E = {"button-common-styles":"Modal-module_button-common-styles__ko9E5","scrollbar":"Modal-module_scrollbar__yPIJc","modalOverlay":"Modal-module_modalOverlay__AzVeg","animate":"Modal-module_animate__pnPNj","hide":"Modal-module_hide__0CTey","smallScreen":"Modal-module_smallScreen__nzt2L"};
15331
+ var classes$F = {"button-common-styles":"Modal-module_button-common-styles__ko9E5","scrollbar":"Modal-module_scrollbar__yPIJc","modalOverlay":"Modal-module_modalOverlay__AzVeg","animate":"Modal-module_animate__pnPNj","hide":"Modal-module_hide__0CTey","smallScreen":"Modal-module_smallScreen__nzt2L"};
15196
15332
 
15197
15333
  var selectClasses = {"button-common-styles":"Select-module_button-common-styles__cgaVz","scrollbar":"Select-module_scrollbar__cA89D","dropdownList":"Select-module_dropdownList__rdcrH","listDivider":"Select-module_listDivider__4vJyh","selectContainer":"Select-module_selectContainer__yXT-t"};
15198
15334
 
@@ -15451,7 +15587,7 @@ function findClosestBond(restruct, pos, skip, minDist, scale) {
15451
15587
  if (bid === skipId) return;
15452
15588
  var a1 = restruct.atoms.get(bond.b.begin).a;
15453
15589
  var a2 = restruct.atoms.get(bond.b.end).a;
15454
- if (ketcherCore.FunctionalGroup.isBondInContractedFunctionalGroup(bond.b, sGroups, functionalGroups)) return null;
15590
+ if (ketcherCore.FunctionalGroup.isBondInContractedFunctionalGroup(bond.b, sGroups, functionalGroups) || ketcherCore.SGroup.isBondInContractedSGroup(bond.b, sGroups)) return null;
15455
15591
  var mid = ketcherCore.Vec2.lc2(a1.pp, 0.5, a2.pp, 0.5);
15456
15592
  var cdist = ketcherCore.Vec2.dist(pos, mid);
15457
15593
  if (cdist < minCDist) {
@@ -15461,7 +15597,7 @@ function findClosestBond(restruct, pos, skip, minDist, scale) {
15461
15597
  });
15462
15598
  restruct.bonds.forEach(function (bond, bid) {
15463
15599
  if (bid === skipId) return;
15464
- if (ketcherCore.FunctionalGroup.isBondInContractedFunctionalGroup(bond.b, sGroups, functionalGroups)) return null;
15600
+ if (ketcherCore.FunctionalGroup.isBondInContractedFunctionalGroup(bond.b, sGroups, functionalGroups) || ketcherCore.SGroup.isBondInContractedSGroup(bond.b, sGroups)) return null;
15465
15601
  var hb = restruct.molecule.halfBonds.get(bond.b.hb1);
15466
15602
  var dir = hb.dir;
15467
15603
  var norm = hb.norm;
@@ -15636,7 +15772,7 @@ function findClosestFG(restruct, pos, skip) {
15636
15772
  reSGroupId = _step$value[0],
15637
15773
  reSGroup = _step$value[1];
15638
15774
  if (reSGroupId === skipId) continue;
15639
- var _reSGroup$getTextHigh = reSGroup.getTextHighlightDimensions(),
15775
+ var _reSGroup$getTextHigh = reSGroup.getTextHighlightDimensions(0, restruct.render),
15640
15776
  startX = _reSGroup$getTextHigh.startX,
15641
15777
  startY = _reSGroup$getTextHigh.startY,
15642
15778
  width = _reSGroup$getTextHigh.width,
@@ -15697,20 +15833,55 @@ function findCloseMerge(restruct, selected) {
15697
15833
  var bond = struct.bonds.get(bid);
15698
15834
  pos.bonds.set(bid, ketcherCore.Vec2.lc2(struct.atoms.get(bond.begin).pp, 0.5, struct.atoms.get(bond.end).pp, 0.5));
15699
15835
  });
15700
- var result = {};
15701
- maps.forEach(function (mp) {
15702
- result[mp] = Array.from(pos[mp].keys()).reduce(function (res, srcId) {
15703
- var skip = {
15704
- map: mp,
15705
- id: srcId
15706
- };
15707
- var item = findMaps[mp](restruct, pos[mp].get(srcId), skip, null, scale);
15708
- if (item && !selected[mp].includes(item.id)) res.set(srcId, item.id);
15709
- return res;
15710
- }, new Map());
15836
+ var result = {
15837
+ atoms: new Map(),
15838
+ atomToFunctionalGroup: new Map()
15839
+ };
15840
+ maps.forEach(function (map) {
15841
+ if (map === 'atoms') {
15842
+ Array.from(pos.atoms.keys()).forEach(function (atomId) {
15843
+ var atomPosition = pos.atoms.get(atomId);
15844
+ mergeAtomToAtom(atomId, restruct, atomPosition, selected, result) || mergeAtomToFunctionalGroup(atomId, restruct, atomPosition, result);
15845
+ });
15846
+ } else {
15847
+ result[map] = Array.from(pos[map].keys()).reduce(function (res, srcId) {
15848
+ var skip = {
15849
+ map: map,
15850
+ id: srcId
15851
+ };
15852
+ var item = findMaps[map](restruct, pos[map].get(srcId), skip, null, scale);
15853
+ if (item && !selected[map].includes(item.id)) {
15854
+ res.set(srcId, item.id);
15855
+ }
15856
+ return res;
15857
+ }, new Map());
15858
+ }
15711
15859
  });
15712
15860
  return result;
15713
15861
  }
15862
+ function mergeAtomToAtom(atomId, restruct, atomPosition, selected, result) {
15863
+ var skip = {
15864
+ map: 'atoms',
15865
+ id: atomId
15866
+ };
15867
+ var closestAtom = findClosestAtom(restruct, atomPosition, skip, null);
15868
+ if (closestAtom && !selected.atoms.includes(closestAtom.id)) {
15869
+ result.atoms.set(atomId, closestAtom.id);
15870
+ return true;
15871
+ }
15872
+ return false;
15873
+ }
15874
+ function mergeAtomToFunctionalGroup(atomId, restruct, atomPosition, result) {
15875
+ if (ketcherCore.FunctionalGroup.isAttachmentPointAtom(atomId, restruct.molecule)) {
15876
+ return false;
15877
+ }
15878
+ var closestFunctionalGroup = findClosestFG(restruct, atomPosition, null);
15879
+ if (closestFunctionalGroup) {
15880
+ result.atomToFunctionalGroup.set(atomId, closestFunctionalGroup.id);
15881
+ return true;
15882
+ }
15883
+ return false;
15884
+ }
15714
15885
  var closest = {
15715
15886
  atom: findClosestAtom,
15716
15887
  item: findClosestItem,
@@ -16589,7 +16760,7 @@ function setHover(ci, visible, render) {
16589
16760
  return true;
16590
16761
  }
16591
16762
 
16592
- var classes$D = {"button-common-styles":"StructEditor-module_button-common-styles__3P7PO","scrollbar":"StructEditor-module_scrollbar__SUs-o","spinnerOverlay":"StructEditor-module_spinnerOverlay__5H1IM","canvas":"StructEditor-module_canvas__LLnzh","measureLog":"StructEditor-module_measureLog__B2wuy","visible":"StructEditor-module_visible__3eFNB","intermediateCanvas":"StructEditor-module_intermediateCanvas__fR3ws","enableCursor":"StructEditor-module_enableCursor__Qla0A"};
16763
+ var classes$E = {"button-common-styles":"StructEditor-module_button-common-styles__3P7PO","scrollbar":"StructEditor-module_scrollbar__SUs-o","spinnerOverlay":"StructEditor-module_spinnerOverlay__5H1IM","canvas":"StructEditor-module_canvas__LLnzh","measureLog":"StructEditor-module_measureLog__B2wuy","visible":"StructEditor-module_visible__3eFNB","intermediateCanvas":"StructEditor-module_intermediateCanvas__fR3ws","enableCursor":"StructEditor-module_enableCursor__Qla0A"};
16593
16764
 
16594
16765
  var Cursor = function Cursor(_ref) {
16595
16766
  var Icon = _ref.Icon,
@@ -16851,8 +17022,7 @@ var useBondEdit = function useBondEdit() {
16851
17022
  getKetcherInstance = _useAppContext.getKetcherInstance;
16852
17023
  var handler = React.useCallback( function () {
16853
17024
  var _ref2 = _asyncToGenerator__default["default"]( _regeneratorRuntime__default["default"].mark(function _callee(_ref) {
16854
- var _editor$render$ctab$b;
16855
- var props, editor, bondIds, bond, newBond;
17025
+ var props, editor, bondIds, molecule, bonds, changeBondPromise;
16856
17026
  return _regeneratorRuntime__default["default"].wrap(function _callee$(_context) {
16857
17027
  while (1) {
16858
17028
  switch (_context.prev = _context.next) {
@@ -16860,24 +17030,29 @@ var useBondEdit = function useBondEdit() {
16860
17030
  props = _ref.props;
16861
17031
  editor = getKetcherInstance().editor;
16862
17032
  bondIds = (props === null || props === void 0 ? void 0 : props.bondIds) || [];
16863
- bond = (_editor$render$ctab$b = editor.render.ctab.bonds.get(bondIds[0])) === null || _editor$render$ctab$b === void 0 ? void 0 : _editor$render$ctab$b.b;
17033
+ molecule = editor.render.ctab;
16864
17034
  _context.prev = 4;
16865
- _context.next = 7;
16866
- return editor.event.bondEdit.dispatch(bond);
16867
- case 7:
16868
- newBond = _context.sent;
16869
- editor.update(ketcherCore.fromBondsAttrs(editor.render.ctab, bondIds, newBond));
16870
- _context.next = 14;
17035
+ bonds = mapBondIdsToBonds(bondIds, molecule);
17036
+ _context.next = 8;
17037
+ return editor.event.bondEdit.dispatch(bonds);
17038
+ case 8:
17039
+ changeBondPromise = _context.sent;
17040
+ updateSelectedBonds({
17041
+ bonds: bondIds,
17042
+ changeBondPromise: changeBondPromise,
17043
+ editor: editor
17044
+ });
17045
+ _context.next = 15;
16871
17046
  break;
16872
- case 11:
16873
- _context.prev = 11;
17047
+ case 12:
17048
+ _context.prev = 12;
16874
17049
  _context.t0 = _context["catch"](4);
16875
- case 14:
17050
+ case 15:
16876
17051
  case "end":
16877
17052
  return _context.stop();
16878
17053
  }
16879
17054
  }
16880
- }, _callee, null, [[4, 11]]);
17055
+ }, _callee, null, [[4, 12]]);
16881
17056
  }));
16882
17057
  return function (_x) {
16883
17058
  return _ref2.apply(this, arguments);
@@ -17069,7 +17244,16 @@ var useFunctionalGroupEoc = function useFunctionalGroupEoc() {
17069
17244
  return toExpand ? functionalGroup.isExpanded : !functionalGroup.isExpanded;
17070
17245
  }));
17071
17246
  }, []);
17072
- return [handler, hidden];
17247
+ var disabled = React.useCallback(function (_ref3) {
17248
+ var _props$functionalGrou2;
17249
+ var props = _ref3.props;
17250
+ var editor = getKetcherInstance().editor;
17251
+ var molecule = editor.render.ctab.molecule;
17252
+ return Boolean(props === null || props === void 0 ? void 0 : (_props$functionalGrou2 = props.functionalGroups) === null || _props$functionalGrou2 === void 0 ? void 0 : _props$functionalGrou2.every(function (functionalGroup) {
17253
+ return ketcherCore.FunctionalGroup.getAttachmentPointCount(functionalGroup === null || functionalGroup === void 0 ? void 0 : functionalGroup.relatedSGroup, molecule) > 1;
17254
+ }));
17255
+ }, []);
17256
+ return [handler, hidden, disabled];
17073
17257
  };
17074
17258
 
17075
17259
  var useFunctionalGroupRemove = function useFunctionalGroupRemove() {
@@ -17097,12 +17281,16 @@ function ownKeys$G(object, enumerableOnly) { var keys = Object.keys(object); if
17097
17281
  function _objectSpread$G(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$G(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$G(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
17098
17282
  var FunctionalGroupMenuItems = function FunctionalGroupMenuItems(props) {
17099
17283
  var _useFunctionalGroupEo = useFunctionalGroupEoc(),
17100
- _useFunctionalGroupEo2 = _slicedToArray__default["default"](_useFunctionalGroupEo, 2),
17284
+ _useFunctionalGroupEo2 = _slicedToArray__default["default"](_useFunctionalGroupEo, 3),
17101
17285
  handleExpandOrContract = _useFunctionalGroupEo2[0],
17102
- ExpandOrContractHidden = _useFunctionalGroupEo2[1];
17286
+ ExpandOrContractHidden = _useFunctionalGroupEo2[1],
17287
+ ExpandOrContractDisabled = _useFunctionalGroupEo2[2];
17103
17288
  var handleRemove = useFunctionalGroupRemove();
17104
17289
  return jsxRuntime.jsxs(jsxRuntime.Fragment, {
17105
17290
  children: [jsxRuntime.jsx(reactContexify.Item, _objectSpread$G(_objectSpread$G({}, props), {}, {
17291
+ disabled: function disabled(params) {
17292
+ return ExpandOrContractDisabled(params);
17293
+ },
17106
17294
  hidden: function hidden(params) {
17107
17295
  return ExpandOrContractHidden(params, true);
17108
17296
  },
@@ -17111,6 +17299,9 @@ var FunctionalGroupMenuItems = function FunctionalGroupMenuItems(props) {
17111
17299
  },
17112
17300
  children: "Expand Abbreviation"
17113
17301
  })), jsxRuntime.jsx(reactContexify.Item, _objectSpread$G(_objectSpread$G({}, props), {}, {
17302
+ disabled: function disabled(params) {
17303
+ return ExpandOrContractDisabled(params);
17304
+ },
17114
17305
  hidden: function hidden(params) {
17115
17306
  return ExpandOrContractHidden(params, false);
17116
17307
  },
@@ -17405,7 +17596,7 @@ var StructRender = function (_Component) {
17405
17596
  return StructRender;
17406
17597
  }(React.Component);
17407
17598
 
17408
- var classes$C = {"infoPanel":"InfoPanel-module_infoPanel__irvZL"};
17599
+ var classes$D = {"infoPanel":"InfoPanel-module_infoPanel__irvZL"};
17409
17600
 
17410
17601
  var X_COORD_INDEX = 0;
17411
17602
  var Y_COORD_INDEX = 1;
@@ -17510,7 +17701,7 @@ var SGroupDataRender = function SGroupDataRender(props) {
17510
17701
  left: panelCoordinate.x + 'px',
17511
17702
  top: panelCoordinate.y + 'px'
17512
17703
  },
17513
- className: clsx__default["default"](classes$C.infoPanel, className),
17704
+ className: clsx__default["default"](classes$D.infoPanel, className),
17514
17705
  children: sGroupData
17515
17706
  }) : null;
17516
17707
  };
@@ -17586,11 +17777,9 @@ var InfoPanel = function InfoPanel(props) {
17586
17777
  var childRef = React.useRef(null);
17587
17778
  var groupName = sGroup === null || sGroup === void 0 ? void 0 : (_sGroup$data = sGroup.data) === null || _sGroup$data === void 0 ? void 0 : _sGroup$data.name;
17588
17779
  React.useEffect(function () {
17589
- var _sGroup$data2;
17590
- var CIP_FIELD_NAME = 'INDIGO_CIP_DESC';
17591
- if (!groupStruct && (sGroup === null || sGroup === void 0 ? void 0 : sGroup.type) === 'DAT' && ((_sGroup$data2 = sGroup.data) === null || _sGroup$data2 === void 0 ? void 0 : _sGroup$data2.fieldName) !== CIP_FIELD_NAME) {
17592
- var _sGroup$data3, _sGroup$data4;
17593
- setSGroupData("".concat((_sGroup$data3 = sGroup.data) === null || _sGroup$data3 === void 0 ? void 0 : _sGroup$data3.fieldName, "=").concat((_sGroup$data4 = sGroup.data) === null || _sGroup$data4 === void 0 ? void 0 : _sGroup$data4.fieldValue));
17780
+ if (!groupStruct && (sGroup === null || sGroup === void 0 ? void 0 : sGroup.type) === 'DAT') {
17781
+ var _sGroup$data2, _sGroup$data3;
17782
+ setSGroupData("".concat((_sGroup$data2 = sGroup.data) === null || _sGroup$data2 === void 0 ? void 0 : _sGroup$data2.fieldName, "=").concat((_sGroup$data3 = sGroup.data) === null || _sGroup$data3 === void 0 ? void 0 : _sGroup$data3.fieldValue));
17594
17783
  } else {
17595
17784
  setSGroupData(null);
17596
17785
  }
@@ -17614,7 +17803,7 @@ var InfoPanel = function InfoPanel(props) {
17614
17803
  left: x + 'px',
17615
17804
  top: y + 'px'
17616
17805
  },
17617
- className: clsx__default["default"](classes$C.infoPanel, className),
17806
+ className: clsx__default["default"](classes$D.infoPanel, className),
17618
17807
  children: jsxRuntime.jsx(StructRender, {
17619
17808
  struct: molecule,
17620
17809
  id: groupName,
@@ -17624,6 +17813,7 @@ var InfoPanel = function InfoPanel(props) {
17624
17813
  autoScaleMargin: 0,
17625
17814
  rescaleAmount: 1,
17626
17815
  cachePrefix: 'infoPanel',
17816
+ needCache: false,
17627
17817
  viewSz: new ketcherCore.Vec2(width, height),
17628
17818
  width: width,
17629
17819
  height: height
@@ -17731,15 +17921,15 @@ var StructEditor = function (_Component) {
17731
17921
  } catch (_unused) {
17732
17922
  el.innerHTML = msg.info;
17733
17923
  }
17734
- el.classList.add(classes$D.visible);
17924
+ el.classList.add(classes$E.visible);
17735
17925
  } else {
17736
- el.classList.remove(classes$D.visible);
17926
+ el.classList.remove(classes$E.visible);
17737
17927
  }
17738
17928
  });
17739
17929
  this.editor.event.cursor.add(function (csr) {
17740
17930
  switch (csr.status) {
17741
17931
  case 'enable':
17742
- _this2.editorRef.current.classList.add(classes$D.enableCursor);
17932
+ _this2.editorRef.current.classList.add(classes$E.enableCursor);
17743
17933
  var _this2$editorRef$curr = _this2.editorRef.current.getBoundingClientRect(),
17744
17934
  left = _this2$editorRef$curr.left,
17745
17935
  top = _this2$editorRef$curr.top,
@@ -17756,7 +17946,7 @@ var StructEditor = function (_Component) {
17756
17946
  }
17757
17947
  break;
17758
17948
  case 'move':
17759
- _this2.editorRef.current.classList.add(classes$D.enableCursor);
17949
+ _this2.editorRef.current.classList.add(classes$E.enableCursor);
17760
17950
  _this2.setState({
17761
17951
  enableCursor: true,
17762
17952
  clientX: clientX,
@@ -17764,19 +17954,19 @@ var StructEditor = function (_Component) {
17764
17954
  });
17765
17955
  break;
17766
17956
  case 'disable':
17767
- _this2.editorRef.current.classList.remove(classes$D.enableCursor);
17957
+ _this2.editorRef.current.classList.remove(classes$E.enableCursor);
17768
17958
  _this2.setState({
17769
17959
  enableCursor: false
17770
17960
  });
17771
17961
  break;
17772
17962
  case 'leave':
17773
- _this2.editorRef.current.classList.remove(classes$D.enableCursor);
17963
+ _this2.editorRef.current.classList.remove(classes$E.enableCursor);
17774
17964
  _this2.setState({
17775
17965
  enableCursor: false
17776
17966
  });
17777
17967
  break;
17778
17968
  case 'mouseover':
17779
- _this2.editorRef.current.classList.add(classes$D.enableCursor);
17969
+ _this2.editorRef.current.classList.add(classes$E.enableCursor);
17780
17970
  _this2.setState({
17781
17971
  enableCursor: true
17782
17972
  });
@@ -17829,22 +18019,22 @@ var StructEditor = function (_Component) {
17829
18019
  _this$state$clientY = _this$state.clientY,
17830
18020
  clientY = _this$state$clientY === void 0 ? 0 : _this$state$clientY;
17831
18021
  return jsxRuntime.jsxs(Tag, _objectSpread$B(_objectSpread$B({
17832
- className: clsx__default["default"](classes$D.canvas, className)
18022
+ className: clsx__default["default"](classes$E.canvas, className)
17833
18023
  }, props), {}, {
17834
18024
  children: [jsxRuntime.jsx(ContextMenuTrigger, {
17835
18025
  children: jsxRuntime.jsx("div", {
17836
18026
  ref: this.editorRef,
17837
- className: clsx__default["default"](classes$D.intermediateCanvas)
18027
+ className: clsx__default["default"](classes$E.intermediateCanvas)
17838
18028
  })
17839
18029
  }), jsxRuntime.jsx(Cursor, {
17840
18030
  Icon: SvgHand,
17841
18031
  PressedIcon: SvgCompressedHand,
17842
18032
  enableHandTool: this.state.enableCursor
17843
18033
  }), jsxRuntime.jsx("div", {
17844
- className: classes$D.measureLog,
18034
+ className: classes$E.measureLog,
17845
18035
  ref: this.logRef
17846
18036
  }), indigoVerification && jsxRuntime.jsx("div", {
17847
- className: "".concat(classes$D.spinnerOverlay, " loading-spinner"),
18037
+ className: "".concat(classes$E.spinnerOverlay, " loading-spinner"),
17848
18038
  children: jsxRuntime.jsx(LoadingCircles, {})
17849
18039
  }), jsxRuntime.jsx(InfoPanel$1, {
17850
18040
  clientX: clientX,
@@ -17909,35 +18099,35 @@ function SvgLogo(props) {
17909
18099
  })))));
17910
18100
  }
17911
18101
 
17912
- var classes$B = {"button-common-styles":"About-module_button-common-styles__XmSbT","scrollbar":"About-module_scrollbar__4-AeI","dialog_body":"About-module_dialog_body__ebQu-","about":"About-module_about__ZVesh","body":"About-module_body__8VOc3","versionName":"About-module_versionName__1gqJr","firstline":"About-module_firstline__h5XMW","links":"About-module_links__sMpyx","infoLinks":"About-module_infoLinks__4-Tot","indigoVersion":"About-module_indigoVersion__WKFlu","headerContent":"About-module_headerContent__YclOx","title":"About-module_title__k-6Zg","indigoFirstLine":"About-module_indigoFirstLine__-86rb","okButton":"About-module_okButton__FMcEk"};
18102
+ var classes$C = {"button-common-styles":"About-module_button-common-styles__XmSbT","scrollbar":"About-module_scrollbar__4-AeI","dialog_body":"About-module_dialog_body__ebQu-","about":"About-module_about__ZVesh","body":"About-module_body__8VOc3","versionName":"About-module_versionName__1gqJr","firstline":"About-module_firstline__h5XMW","links":"About-module_links__sMpyx","infoLinks":"About-module_infoLinks__4-Tot","indigoVersion":"About-module_indigoVersion__WKFlu","headerContent":"About-module_headerContent__YclOx","title":"About-module_title__k-6Zg","indigoFirstLine":"About-module_indigoFirstLine__-86rb","okButton":"About-module_okButton__FMcEk"};
17913
18103
 
17914
18104
  function AboutDialog(props) {
17915
18105
  var indigoInfo = props.indigoVersion && props.indigoVersion.split('.r');
17916
18106
  return jsxRuntime.jsxs(Dialog, {
17917
- className: "".concat(classes$B.about, " ").concat(classes$B.dialog_body),
18107
+ className: "".concat(classes$C.about, " ").concat(classes$C.dialog_body),
17918
18108
  params: props,
17919
18109
  buttons: [jsxRuntime.jsx("button", {
17920
18110
  onClick: props.onOk,
17921
- className: classes$B.okButton,
18111
+ className: classes$C.okButton,
17922
18112
  children: "Ok"
17923
18113
  }, "ok")],
17924
18114
  children: [jsxRuntime.jsx("div", {
17925
- className: classes$B.headerContent,
18115
+ className: classes$C.headerContent,
17926
18116
  children: jsxRuntime.jsxs("a", {
17927
18117
  href: props.overviewLink,
17928
18118
  target: "_blank",
17929
18119
  rel: "noopener noreferrer",
17930
18120
  children: [jsxRuntime.jsx(SvgLogo, {}), jsxRuntime.jsx("span", {
17931
- className: classes$B.title,
18121
+ className: classes$C.title,
17932
18122
  children: "Ketcher"
17933
18123
  })]
17934
18124
  })
17935
18125
  }), jsxRuntime.jsx("div", {
17936
- className: classes$B.body,
18126
+ className: classes$C.body,
17937
18127
  children: jsxRuntime.jsx("div", {
17938
- className: classes$B.verionsInfo,
18128
+ className: classes$C.verionsInfo,
17939
18129
  children: jsxRuntime.jsxs("dl", {
17940
- className: classes$B.ketcherVersionInfo,
18130
+ className: classes$C.ketcherVersionInfo,
17941
18131
  children: [jsxRuntime.jsx("dt", {
17942
18132
  children: jsxRuntime.jsxs("a", {
17943
18133
  href: props.overviewLink,
@@ -17950,7 +18140,7 @@ function AboutDialog(props) {
17950
18140
  children: props.date
17951
18141
  })]
17952
18142
  }), jsxRuntime.jsxs("div", {
17953
- className: classes$B.infoLinks,
18143
+ className: classes$C.infoLinks,
17954
18144
  children: [jsxRuntime.jsx("dt", {
17955
18145
  children: jsxRuntime.jsx("a", {
17956
18146
  href: props.feedbackLink,
@@ -17967,7 +18157,7 @@ function AboutDialog(props) {
17967
18157
  })
17968
18158
  })]
17969
18159
  }), jsxRuntime.jsx("br", {}), jsxRuntime.jsxs("div", {
17970
- className: classes$B.indigoVersion,
18160
+ className: classes$C.indigoVersion,
17971
18161
  children: [jsxRuntime.jsxs("a", {
17972
18162
  href: "http://lifescience.opensource.epam.com/indigo/",
17973
18163
  target: "_blank",
@@ -18045,7 +18235,7 @@ var ErrorPopover = function ErrorPopover(_ref) {
18045
18235
  });
18046
18236
  };
18047
18237
 
18048
- var classes$A = {"fieldSetLabel":"input-module_fieldSetLabel__DxKa5","input":"input-module_input__WzHgL","checkbox":"input-module_checkbox__CowSc","radioButton":"input-module_radioButton__2eHO0","slider":"input-module_slider__-Xsc0","select":"input-module_select__GhgBs","genericInput":"input-module_genericInput__XdZ2R"};
18238
+ var classes$B = {"fieldSetLabel":"input-module_fieldSetLabel__DxKa5","input":"input-module_input__WzHgL","checkbox":"input-module_checkbox__CowSc","radioButton":"input-module_radioButton__2eHO0","slider":"input-module_slider__-Xsc0","select":"input-module_select__GhgBs","genericInput":"input-module_genericInput__XdZ2R"};
18049
18239
 
18050
18240
  var _excluded$o = ["schema", "value", "onChange", "innerRef", "type", "isFocused"],
18051
18241
  _excluded2$4 = ["schema", "value", "onChange"],
@@ -18085,12 +18275,12 @@ function GenericInput(_ref) {
18085
18275
  value: value !== null && value !== void 0 ? value : '',
18086
18276
  onInput: onChange,
18087
18277
  onChange: onChange,
18088
- className: clsx__default["default"](classes$A.input, classes$A.genericInput),
18278
+ className: clsx__default["default"](classes$B.input, classes$B.genericInput),
18089
18279
  ref: inputRef
18090
18280
  }, props)), type === 'checkbox' && jsxRuntime.jsx("span", {
18091
- className: classes$A.checkbox
18281
+ className: classes$B.checkbox
18092
18282
  }), type === 'radio' && jsxRuntime.jsx("span", {
18093
- className: classes$A.radioButton
18283
+ className: classes$B.radioButton
18094
18284
  })]
18095
18285
  });
18096
18286
  }
@@ -18121,16 +18311,16 @@ function CheckBox(_ref3) {
18121
18311
  innerRef = _ref3.innerRef,
18122
18312
  rest = _objectWithoutProperties__default["default"](_ref3, _excluded3$1);
18123
18313
  return jsxRuntime.jsxs("div", {
18124
- className: classes$A.fieldSetItem,
18314
+ className: classes$B.fieldSetItem,
18125
18315
  children: [jsxRuntime.jsx("input", _objectSpread$A({
18126
18316
  type: "checkbox",
18127
18317
  checked: Boolean(value),
18128
18318
  onClick: onChange,
18129
18319
  onChange: onChange,
18130
- className: classes$A.input,
18320
+ className: classes$B.input,
18131
18321
  ref: innerRef
18132
18322
  }, rest)), jsxRuntime.jsx("span", {
18133
- className: classes$A.checkbox
18323
+ className: classes$B.checkbox
18134
18324
  })]
18135
18325
  });
18136
18326
  }
@@ -18151,7 +18341,7 @@ function Select$1(_ref4) {
18151
18341
  value: value,
18152
18342
  name: name,
18153
18343
  multiple: multiple,
18154
- className: clsx__default["default"](classes$A.select, className),
18344
+ className: clsx__default["default"](classes$B.select, className),
18155
18345
  children: enumSchema(schema, function (title, val) {
18156
18346
  return jsxRuntime.jsx("option", {
18157
18347
  value: val,
@@ -18181,18 +18371,18 @@ function FieldSet(_ref5) {
18181
18371
  onClick: onSelect,
18182
18372
  children: enumSchema(schema, function (title, val) {
18183
18373
  return jsxRuntime.jsx("li", {
18184
- className: classes$A.fieldSetItem,
18374
+ className: classes$B.fieldSetItem,
18185
18375
  children: jsxRuntime.jsxs("label", {
18186
- className: classes$A.fieldSetLabel,
18376
+ className: classes$B.fieldSetLabel,
18187
18377
  children: [jsxRuntime.jsx("input", _objectSpread$A({
18188
18378
  type: type,
18189
18379
  defaultChecked: type === 'radio' ? selected(val, checked) : selected(val, value),
18190
18380
  value: _typeof__default["default"](val) !== 'object' && val,
18191
- className: classes$A.input
18381
+ className: classes$B.input
18192
18382
  }, rest)), type === 'checkbox' && jsxRuntime.jsx("span", {
18193
- className: classes$A.checkbox
18383
+ className: classes$B.checkbox
18194
18384
  }), type === 'radio' && jsxRuntime.jsx("span", {
18195
- className: classes$A.radioButton
18385
+ className: classes$B.radioButton
18196
18386
  }), title]
18197
18387
  })
18198
18388
  }, title);
@@ -18222,7 +18412,7 @@ function Slider(_ref6) {
18222
18412
  name = _ref6.name,
18223
18413
  rest = _objectWithoutProperties__default["default"](_ref6, _excluded5$1);
18224
18414
  return jsxRuntime.jsxs("div", {
18225
- className: classes$A.slider,
18415
+ className: classes$B.slider,
18226
18416
  children: [jsxRuntime.jsx("input", _objectSpread$A({
18227
18417
  type: "checkbox",
18228
18418
  checked: value,
@@ -18409,7 +18599,7 @@ var Select = function Select(_ref2) {
18409
18599
  });
18410
18600
  };
18411
18601
 
18412
- var classes$z = {"button-common-styles":"form-module_button-common-styles__BvKSn","scrollbar":"form-module_scrollbar__MgLtc","dataError":"form-module_dataError__IXK1h","inputWrapper":"form-module_inputWrapper__sIDHH"};
18602
+ var classes$A = {"button-common-styles":"form-module_button-common-styles__BvKSn","scrollbar":"form-module_scrollbar__MgLtc","dataError":"form-module_dataError__IXK1h","inputWrapper":"form-module_inputWrapper__sIDHH"};
18413
18603
 
18414
18604
  var _excluded$n = ["schema", "result", "customValid"],
18415
18605
  _excluded2$3 = ["labelPos", "title", "children"],
@@ -18568,13 +18758,13 @@ function Field(props) {
18568
18758
  }, fieldOpts), rest));
18569
18759
  if (labelPos === false) return formField;
18570
18760
  return jsxRuntime.jsxs(Label, {
18571
- className: clsx__default["default"](_defineProperty__default["default"]({}, classes$z.dataError, dataError), className),
18761
+ className: clsx__default["default"](_defineProperty__default["default"]({}, classes$A.dataError, dataError), className),
18572
18762
  error: dataError,
18573
18763
  title: rest.title || desc.title,
18574
18764
  labelPos: labelPos,
18575
18765
  tooltip: rest === null || rest === void 0 ? void 0 : rest.tooltip,
18576
18766
  children: [jsxRuntime.jsx("span", {
18577
- className: classes$z.inputWrapper,
18767
+ className: classes$A.inputWrapper,
18578
18768
  onMouseEnter: handlePopoverOpen,
18579
18769
  onMouseLeave: handlePopoverClose,
18580
18770
  children: formField
@@ -18681,7 +18871,7 @@ function getErrorsObj(errors) {
18681
18871
  return errs;
18682
18872
  }
18683
18873
 
18684
- var classes$y = {"colorPickerInput":"ColorPicker-module_colorPickerInput__voi2r","selectedInput":"ColorPicker-module_selectedInput__Ykcjd","colorPickerWrap":"ColorPicker-module_colorPickerWrap__IAQVo","withPalette":"ColorPicker-module_withPalette__gTwNu","colorPicker":"ColorPicker-module_colorPicker__Uz3PM","colorPickerBtn":"ColorPicker-module_colorPickerBtn__nr6ph","colorPickerPreview":"ColorPicker-module_colorPickerPreview__-Rf-i","colorPickerOverlay":"ColorPicker-module_colorPickerOverlay__WzC-w","colorContainer":"ColorPicker-module_colorContainer__ib5up","hex":"ColorPicker-module_hex__mE9my","presetColors":"ColorPicker-module_presetColors__J-ysq","chooseColor":"ColorPicker-module_chooseColor__fdzt8","clicked":"ColorPicker-module_clicked__8BNoN","expandIcon":"ColorPicker-module_expandIcon__oH4ka","turnedIcon":"ColorPicker-module_turnedIcon__-zaq-","colorPickerWrapper":"ColorPicker-module_colorPickerWrapper__GJm87"};
18874
+ var classes$z = {"colorPickerInput":"ColorPicker-module_colorPickerInput__voi2r","selectedInput":"ColorPicker-module_selectedInput__Ykcjd","colorPickerWrap":"ColorPicker-module_colorPickerWrap__IAQVo","withPalette":"ColorPicker-module_withPalette__gTwNu","colorPicker":"ColorPicker-module_colorPicker__Uz3PM","colorPickerBtn":"ColorPicker-module_colorPickerBtn__nr6ph","colorPickerPreview":"ColorPicker-module_colorPickerPreview__-Rf-i","colorPickerOverlay":"ColorPicker-module_colorPickerOverlay__WzC-w","colorContainer":"ColorPicker-module_colorContainer__ib5up","hex":"ColorPicker-module_hex__mE9my","presetColors":"ColorPicker-module_presetColors__J-ysq","chooseColor":"ColorPicker-module_chooseColor__fdzt8","clicked":"ColorPicker-module_clicked__8BNoN","expandIcon":"ColorPicker-module_expandIcon__oH4ka","turnedIcon":"ColorPicker-module_turnedIcon__-zaq-","colorPickerWrapper":"ColorPicker-module_colorPickerWrapper__GJm87"};
18685
18875
 
18686
18876
  var presetColors = ['#FF4545', '#FFAD31', '#68D442', '#3ACACC', '#4434FF', '#9C9C9C', '#000000'];
18687
18877
  var ColorPicker = function ColorPicker(props) {
@@ -18730,32 +18920,32 @@ var ColorPicker = function ColorPicker(props) {
18730
18920
  }
18731
18921
  };
18732
18922
  return jsxRuntime.jsxs("div", {
18733
- className: classes$y.colorPickerWrapper,
18923
+ className: classes$z.colorPickerWrapper,
18734
18924
  "data-testid": isOpen ? 'color-picker-field-open' : 'color-picker-field',
18735
18925
  onClick: function onClick(e) {
18736
18926
  return e.preventDefault();
18737
18927
  },
18738
18928
  children: [jsxRuntime.jsxs("div", {
18739
- className: clsx__default["default"]((_clsx = {}, _defineProperty__default["default"](_clsx, classes$y.colorPickerInput, true), _defineProperty__default["default"](_clsx, classes$y.selectedInput, isOpen), _clsx)),
18929
+ className: clsx__default["default"]((_clsx = {}, _defineProperty__default["default"](_clsx, classes$z.colorPickerInput, true), _defineProperty__default["default"](_clsx, classes$z.selectedInput, isOpen), _clsx)),
18740
18930
  onClick: handleClick,
18741
18931
  children: [jsxRuntime.jsx("div", {
18742
- className: classes$y.colorPickerPreview,
18932
+ className: classes$z.colorPickerPreview,
18743
18933
  "data-testid": "color-picker-preview",
18744
18934
  style: {
18745
18935
  backgroundColor: value
18746
18936
  }
18747
18937
  }), jsxRuntime.jsx(Icon, {
18748
- className: clsx__default["default"]((_clsx2 = {}, _defineProperty__default["default"](_clsx2, classes$y.expandIcon, true), _defineProperty__default["default"](_clsx2, classes$y.turnedIcon, !isOpen), _clsx2)),
18938
+ className: clsx__default["default"]((_clsx2 = {}, _defineProperty__default["default"](_clsx2, classes$z.expandIcon, true), _defineProperty__default["default"](_clsx2, classes$z.turnedIcon, !isOpen), _clsx2)),
18749
18939
  name: "chevron"
18750
18940
  })]
18751
18941
  }), isOpen && jsxRuntime.jsxs("div", {
18752
- className: clsx__default["default"](classes$y.colorPickerWrap, isPaletteOpen && classes$y.withPalette),
18942
+ className: clsx__default["default"](classes$z.colorPickerWrap, isPaletteOpen && classes$z.withPalette),
18753
18943
  onBlur: handleBlur,
18754
18944
  "data-testid": "color-picker-preset",
18755
18945
  children: [jsxRuntime.jsxs("div", {
18756
- className: classes$y.presetColors,
18946
+ className: classes$z.presetColors,
18757
18947
  children: [jsxRuntime.jsx("button", {
18758
- className: clsx__default["default"](classes$y.chooseColor, isPaletteOpen && classes$y.clicked),
18948
+ className: clsx__default["default"](classes$z.chooseColor, isPaletteOpen && classes$z.clicked),
18759
18949
  onClick: handlePaletteOpen,
18760
18950
  autoFocus: true,
18761
18951
  "data-testid": "color-picker-btn"
@@ -18767,19 +18957,19 @@ var ColorPicker = function ColorPicker(props) {
18767
18957
  style: {
18768
18958
  backgroundColor: color
18769
18959
  },
18770
- className: classes$y.presetColor
18960
+ className: classes$z.presetColor
18771
18961
  }, color);
18772
18962
  })]
18773
18963
  }), isPaletteOpen && jsxRuntime.jsxs("div", {
18774
- className: classes$y.colorPicker,
18964
+ className: classes$z.colorPicker,
18775
18965
  "data-testid": "color-palette",
18776
18966
  children: [jsxRuntime.jsx(reactColorful.HexColorPicker, {
18777
18967
  color: value,
18778
18968
  onChange: handleChange
18779
18969
  }), jsxRuntime.jsxs("div", {
18780
- className: classes$y.colorContainer,
18970
+ className: classes$z.colorContainer,
18781
18971
  children: [jsxRuntime.jsx("span", {
18782
- className: classes$y.hex,
18972
+ className: classes$z.hex,
18783
18973
  children: "HEX"
18784
18974
  }), jsxRuntime.jsx(reactColorful.HexColorInput, {
18785
18975
  "data-testid": "color-picker-input",
@@ -18873,7 +19063,7 @@ function convertValue(value, measureFrom, measureTo) {
18873
19063
  return measureTo === 'px' || measureTo === 'pt' ? (value * measureMap[measureFrom] / measureMap[measureTo]).toFixed() - 0 : (value * measureMap[measureFrom] / measureMap[measureTo]).toFixed(3) - 0;
18874
19064
  }
18875
19065
 
18876
- var classes$x = {"button-common-styles":"buttons-module_button-common-styles__qWDOz","scrollbar":"buttons-module_scrollbar__SpaVV","openButton":"buttons-module_openButton__wErm9"};
19066
+ var classes$y = {"button-common-styles":"buttons-module_button-common-styles__qWDOz","scrollbar":"buttons-module_scrollbar__SpaVV","openButton":"buttons-module_openButton__wErm9"};
18877
19067
 
18878
19068
  var _excluded$l = ["children", "type", "server", "className"];
18879
19069
  function ownKeys$x(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; }
@@ -18927,7 +19117,7 @@ var OpenButton = function (_Component) {
18927
19117
  onClick: function onClick() {
18928
19118
  return _this2.btn.click();
18929
19119
  },
18930
- className: clsx__default["default"](classes$x.openButton, className)
19120
+ className: clsx__default["default"](classes$y.openButton, className)
18931
19121
  }, props), {}, {
18932
19122
  children: [jsxRuntime.jsx("input", {
18933
19123
  onChange: function onChange(ev) {
@@ -19029,7 +19219,7 @@ var fileSaver = function fileSaver(server) {
19029
19219
  });
19030
19220
  };
19031
19221
 
19032
- var classes$w = {"button-common-styles":"Accordion-module_button-common-styles__enTfZ","scrollbar":"Accordion-module_scrollbar__lJTa6","accordionWrapper":"Accordion-module_accordionWrapper__RKk00","expandIcon":"Accordion-module_expandIcon__ncUKv","turnedIcon":"Accordion-module_turnedIcon__v1sCA","accordionSummaryWrapper":"Accordion-module_accordionSummaryWrapper__roIRd","accordionSummary":"Accordion-module_accordionSummary__1Gq0d","accordionDetailsWrapper":"Accordion-module_accordionDetailsWrapper__fnSnc","hiddenAccordion":"Accordion-module_hiddenAccordion__WZFcJ","accordionDetails":"Accordion-module_accordionDetails__g2RM0","groupIcon":"Accordion-module_groupIcon__1g1lx","groupLabel":"Accordion-module_groupLabel__23y4U","changeMarker":"Accordion-module_changeMarker__UPtGx"};
19222
+ var classes$x = {"button-common-styles":"Accordion-module_button-common-styles__enTfZ","scrollbar":"Accordion-module_scrollbar__lJTa6","accordionWrapper":"Accordion-module_accordionWrapper__RKk00","expandIcon":"Accordion-module_expandIcon__ncUKv","turnedIcon":"Accordion-module_turnedIcon__v1sCA","accordionSummaryWrapper":"Accordion-module_accordionSummaryWrapper__roIRd","accordionSummary":"Accordion-module_accordionSummary__1Gq0d","accordionDetailsWrapper":"Accordion-module_accordionDetailsWrapper__fnSnc","hiddenAccordion":"Accordion-module_hiddenAccordion__WZFcJ","accordionDetails":"Accordion-module_accordionDetails__g2RM0","groupIcon":"Accordion-module_groupIcon__1g1lx","groupLabel":"Accordion-module_groupLabel__23y4U","changeMarker":"Accordion-module_changeMarker__UPtGx"};
19033
19223
 
19034
19224
  var Accordion = function Accordion(_ref) {
19035
19225
  var tabs = _ref.tabs,
@@ -19048,7 +19238,7 @@ var Accordion = function Accordion(_ref) {
19048
19238
  };
19049
19239
  };
19050
19240
  return jsxRuntime.jsx("div", {
19051
- className: clsx__default["default"](classes$w.accordionWrapper, className),
19241
+ className: clsx__default["default"](classes$x.accordionWrapper, className),
19052
19242
  children: tabs.map(function (_ref2) {
19053
19243
  var _clsx, _clsx2;
19054
19244
  var label = _ref2.label,
@@ -19058,28 +19248,28 @@ var Accordion = function Accordion(_ref) {
19058
19248
  return jsxRuntime.jsxs("div", {
19059
19249
  children: [jsxRuntime.jsx("div", {
19060
19250
  onClick: handleAccordionChange(label),
19061
- className: classes$w.accordionSummaryWrapper,
19251
+ className: classes$x.accordionSummaryWrapper,
19062
19252
  children: jsxRuntime.jsxs("div", {
19063
- className: classes$w.accordionSummary,
19253
+ className: classes$x.accordionSummary,
19064
19254
  children: [jsxRuntime.jsx(Icon, {
19065
- className: clsx__default["default"]((_clsx = {}, _defineProperty__default["default"](_clsx, classes$w.expandIcon, true), _defineProperty__default["default"](_clsx, classes$w.turnedIcon, !shouldGroupBeRended), _clsx)),
19255
+ className: clsx__default["default"]((_clsx = {}, _defineProperty__default["default"](_clsx, classes$x.expandIcon, true), _defineProperty__default["default"](_clsx, classes$x.turnedIcon, !shouldGroupBeRended), _clsx)),
19066
19256
  name: "chevron"
19067
19257
  }), jsxRuntime.jsxs("div", {
19068
- className: classes$w.groupLabel,
19258
+ className: classes$x.groupLabel,
19069
19259
  children: [jsxRuntime.jsx(Icon, {
19070
19260
  name: "elements-group",
19071
- className: classes$w.groupIcon
19261
+ className: classes$x.groupIcon
19072
19262
  }), jsxRuntime.jsx("span", {
19073
19263
  children: label
19074
19264
  })]
19075
19265
  }), changedGroups.has(label) && jsxRuntime.jsx("span", {
19076
- className: classes$w.changeMarker
19266
+ className: classes$x.changeMarker
19077
19267
  })]
19078
19268
  })
19079
19269
  }), jsxRuntime.jsx("div", {
19080
- className: clsx__default["default"]((_clsx2 = {}, _defineProperty__default["default"](_clsx2, classes$w.accordionDetailsWrapper, true), _defineProperty__default["default"](_clsx2, classes$w.hiddenAccordion, !shouldGroupBeRended), _clsx2)),
19270
+ className: clsx__default["default"]((_clsx2 = {}, _defineProperty__default["default"](_clsx2, classes$x.accordionDetailsWrapper, true), _defineProperty__default["default"](_clsx2, classes$x.hiddenAccordion, !shouldGroupBeRended), _clsx2)),
19081
19271
  children: jsxRuntime.jsx("div", {
19082
- className: classes$w.accordionDetails,
19272
+ className: classes$x.accordionDetails,
19083
19273
  children: content
19084
19274
  })
19085
19275
  })]
@@ -19137,7 +19327,7 @@ function SystemFonts(props) {
19137
19327
  });
19138
19328
  }
19139
19329
 
19140
- var classes$v = {"headerContent":"Settings-module_headerContent__wBYFf","title":"Settings-module_title__a6mod","button":"Settings-module_button__VZ2w7","accordion":"Settings-module_accordion__1uSYy","settings":"Settings-module_settings__Z5btc"};
19330
+ var classes$w = {"headerContent":"Settings-module_headerContent__wBYFf","title":"Settings-module_title__a6mod","button":"Settings-module_button__VZ2w7","accordion":"Settings-module_accordion__1uSYy","settings":"Settings-module_settings__Z5btc"};
19141
19331
 
19142
19332
  var fieldGroups = {
19143
19333
  resetToSelect: 'General',
@@ -19195,15 +19385,15 @@ var HeaderContent$1 = function HeaderContent(_ref) {
19195
19385
  if (formState.result.init) return _.isEqual(defaultSettings, initState);else return _.isEqual(defaultSettings, formState.result);
19196
19386
  };
19197
19387
  return jsxRuntime.jsxs("div", {
19198
- className: classes$v.headerContent,
19388
+ className: classes$w.headerContent,
19199
19389
  children: [jsxRuntime.jsx("span", {
19200
- className: classes$v.title,
19390
+ className: classes$w.title,
19201
19391
  children: " Settings"
19202
19392
  }), jsxRuntime.jsx(OpenButton, {
19203
19393
  title: "Open from File",
19204
19394
  server: server,
19205
19395
  onLoad: onOpenFile,
19206
- className: classes$v.button,
19396
+ className: classes$w.button,
19207
19397
  children: jsxRuntime.jsx(Icon, {
19208
19398
  name: "open-1"
19209
19399
  })
@@ -19211,14 +19401,14 @@ var HeaderContent$1 = function HeaderContent(_ref) {
19211
19401
  title: "Save to File",
19212
19402
  data: JSON.stringify(formState.result),
19213
19403
  filename: "ketcher-settings",
19214
- className: classes$v.button,
19404
+ className: classes$w.button,
19215
19405
  children: jsxRuntime.jsx(Icon, {
19216
19406
  name: "save-1"
19217
19407
  })
19218
19408
  }, "ketcher-settings"), jsxRuntime.jsx("button", {
19219
19409
  title: "Reset",
19220
19410
  onClick: onReset,
19221
- className: classes$v.button,
19411
+ className: classes$w.button,
19222
19412
  disabled: getIsResetDisabled(),
19223
19413
  children: jsxRuntime.jsx(Icon, {
19224
19414
  name: "reset"
@@ -19377,7 +19567,7 @@ var SettingsDialog = function SettingsDialog(props) {
19377
19567
  label: '3D Viewer',
19378
19568
  content:
19379
19569
  jsxRuntime.jsxs("fieldset", {
19380
- className: classes$v.viewer,
19570
+ className: classes$w.viewer,
19381
19571
  children: [jsxRuntime.jsx(Field, {
19382
19572
  name: "miewMode",
19383
19573
  component: Select,
@@ -19410,7 +19600,7 @@ var SettingsDialog = function SettingsDialog(props) {
19410
19600
  };
19411
19601
  var tabs = [generalTab, stereoTab, atomsTab, bondsTab, serverTab, threeDViewerTab, debuggingTab];
19412
19602
  return jsxRuntime.jsx(Dialog, {
19413
- className: classes$v.settings,
19603
+ className: classes$w.settings,
19414
19604
  result: function result() {
19415
19605
  return formState.result;
19416
19606
  },
@@ -19437,7 +19627,7 @@ var SettingsDialog = function SettingsDialog(props) {
19437
19627
  }, formState), {}, {
19438
19628
  children: jsxRuntime.jsx(Accordion, {
19439
19629
  tabs: tabs,
19440
- className: classes$v.accordion,
19630
+ className: classes$w.accordion,
19441
19631
  changedGroups: changedGroups
19442
19632
  })
19443
19633
  }))
@@ -19734,7 +19924,7 @@ function FrozenInput(_ref) {
19734
19924
  });
19735
19925
  }
19736
19926
 
19737
- var classes$u = {"button-common-styles":"Analyse-module_button-common-styles__8No07","scrollbar":"Analyse-module_scrollbar__UAaIN","analyse":"Analyse-module_analyse__MR-Tu","inputWrapper":"Analyse-module_inputWrapper__uR995","contentWrapper":"Analyse-module_contentWrapper__B4WCi","selectWrapper":"Analyse-module_selectWrapper__xEkKL","select":"Analyse-module_select__c6hFt"};
19927
+ var classes$v = {"button-common-styles":"Analyse-module_button-common-styles__8No07","scrollbar":"Analyse-module_scrollbar__UAaIN","analyse":"Analyse-module_analyse__MR-Tu","inputWrapper":"Analyse-module_inputWrapper__uR995","contentWrapper":"Analyse-module_contentWrapper__B4WCi","selectWrapper":"Analyse-module_selectWrapper__xEkKL","select":"Analyse-module_select__c6hFt"};
19738
19928
 
19739
19929
  var _excluded$i = ["values", "round", "loading", "onAnalyse", "onChangeRound"];
19740
19930
  function _createSuper$5(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$5(); return function _createSuperInternal() { var Super = _getPrototypeOf__default["default"](Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf__default["default"](this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn__default["default"](this, result); }; }
@@ -19772,7 +19962,7 @@ var AnalyseDialog = function (_Component) {
19772
19962
  props = _objectWithoutProperties__default["default"](_this$props, _excluded$i);
19773
19963
  return jsxRuntime.jsx(Dialog, {
19774
19964
  title: "Calculated Values",
19775
- className: classes$u.analyse,
19965
+ className: classes$v.analyse,
19776
19966
  withDivider: true,
19777
19967
  needMargin: true,
19778
19968
  valid: function valid() {
@@ -19805,9 +19995,9 @@ var AnalyseDialog = function (_Component) {
19805
19995
  withSelector: false
19806
19996
  }].map(function (item) {
19807
19997
  return jsxRuntime.jsxs("li", {
19808
- className: classes$u.contentWrapper,
19998
+ className: classes$v.contentWrapper,
19809
19999
  children: [jsxRuntime.jsxs("div", {
19810
- className: classes$u.inputWrapper,
20000
+ className: classes$v.inputWrapper,
19811
20001
  children: [jsxRuntime.jsxs("label", {
19812
20002
  children: [item.name, ":"]
19813
20003
  }), item.key === 'gross' ? jsxRuntime.jsx(FormulaInput, {
@@ -19820,7 +20010,7 @@ var AnalyseDialog = function (_Component) {
19820
20010
  value: values && !loading ? roundOff(values[item.key], round[item.round]) : 0
19821
20011
  })]
19822
20012
  }), item.withSelector ? jsxRuntime.jsxs("div", {
19823
- className: classes$u.selectWrapper,
20013
+ className: classes$v.selectWrapper,
19824
20014
  children: [jsxRuntime.jsx("span", {
19825
20015
  children: "Decimal places"
19826
20016
  }), jsxRuntime.jsx(Select, {
@@ -19829,7 +20019,7 @@ var AnalyseDialog = function (_Component) {
19829
20019
  onChange: function onChange(val) {
19830
20020
  return onChangeRound(item.round, val);
19831
20021
  },
19832
- className: classes$u.select
20022
+ className: classes$v.select
19833
20023
  })]
19834
20024
  }) : null]
19835
20025
  }, item.key);
@@ -19864,7 +20054,7 @@ var mapDispatchToProps$9 = function mapDispatchToProps(dispatch) {
19864
20054
  };
19865
20055
  var Analyse = reactRedux.connect(mapStateToProps$c, mapDispatchToProps$9)(AnalyseDialog);
19866
20056
 
19867
- var classes$t = {"button-common-styles":"Recognize-module_button-common-styles__B04E6","scrollbar":"Recognize-module_scrollbar__rohcP","recognize":"Recognize-module_recognize__66jG2","footerContent":"Recognize-module_footerContent__0MAC7","imagoVersion":"Recognize-module_imagoVersion__nBIj6","openButton":"Recognize-module_openButton__H-j5I","imagesContainer":"Recognize-module_imagesContainer__rXWWk","topBody":"Recognize-module_topBody__ZCCjN","output":"Recognize-module_output__WgRnP","picture":"Recognize-module_picture__x2Y7S","filename":"Recognize-module_filename__-1HIU","messageContainer":"Recognize-module_messageContainer__tMvyb","primaryButton":"Recognize-module_primaryButton__rzm03","secondaryButton":"Recognize-module_secondaryButton__H1Q28","struct":"Recognize-module_struct__W55TL"};
20057
+ var classes$u = {"button-common-styles":"Recognize-module_button-common-styles__B04E6","scrollbar":"Recognize-module_scrollbar__rohcP","recognize":"Recognize-module_recognize__66jG2","footerContent":"Recognize-module_footerContent__0MAC7","imagoVersion":"Recognize-module_imagoVersion__nBIj6","openButton":"Recognize-module_openButton__H-j5I","imagesContainer":"Recognize-module_imagesContainer__rXWWk","topBody":"Recognize-module_topBody__ZCCjN","output":"Recognize-module_output__WgRnP","picture":"Recognize-module_picture__x2Y7S","filename":"Recognize-module_filename__-1HIU","messageContainer":"Recognize-module_messageContainer__tMvyb","primaryButton":"Recognize-module_primaryButton__rzm03","secondaryButton":"Recognize-module_secondaryButton__H1Q28","struct":"Recognize-module_struct__W55TL"};
19868
20058
 
19869
20059
  var DialogActionButton = function DialogActionButton(_ref) {
19870
20060
  var clickHandler = _ref.clickHandler,
@@ -19896,11 +20086,11 @@ function FooterContent$3(_ref) {
19896
20086
  openHandler = _ref.openHandler,
19897
20087
  copyHandler = _ref.copyHandler;
19898
20088
  return jsxRuntime.jsxs("div", {
19899
- className: classes$t.footerContent,
20089
+ className: classes$u.footerContent,
19900
20090
  children: [jsxRuntime.jsxs(OpenButton, {
19901
20091
  onLoad: onImage,
19902
20092
  type: "image/*",
19903
- className: classes$t.openButton,
20093
+ className: classes$u.openButton,
19904
20094
  children: [jsxRuntime.jsx(Icon, {
19905
20095
  name: "open"
19906
20096
  }), jsxRuntime.jsx("span", {
@@ -19910,12 +20100,12 @@ function FooterContent$3(_ref) {
19910
20100
  children: [jsxRuntime.jsx(DialogActionButton, {
19911
20101
  disabled: !structStr,
19912
20102
  clickHandler: openHandler,
19913
- styles: classes$t.secondaryButton,
20103
+ styles: classes$u.secondaryButton,
19914
20104
  label: "Open as new Project"
19915
20105
  }, "openButton"), jsxRuntime.jsx(DialogActionButton, {
19916
20106
  disabled: !structStr,
19917
20107
  clickHandler: copyHandler,
19918
- styles: classes$t.primaryButton,
20108
+ styles: classes$u.primaryButton,
19919
20109
  label: "Add to Canvas",
19920
20110
  title: "Structure will be loaded as fragment and added to Clipboard"
19921
20111
  }, "copyButton")]
@@ -19966,7 +20156,7 @@ function RecognizeDialog(prop) {
19966
20156
  };
19967
20157
  return jsxRuntime.jsxs(Dialog, {
19968
20158
  title: "Import Structure from Image",
19969
- className: classes$t.recognize,
20159
+ className: classes$u.recognize,
19970
20160
  params: _objectSpread$u(_objectSpread$u({}, props), {}, {
19971
20161
  onOk: onOk
19972
20162
  }),
@@ -19983,9 +20173,9 @@ function RecognizeDialog(prop) {
19983
20173
  }),
19984
20174
  buttons: [],
19985
20175
  children: [jsxRuntime.jsxs("div", {
19986
- className: classes$t.topBody,
20176
+ className: classes$u.topBody,
19987
20177
  children: [jsxRuntime.jsxs("label", {
19988
- className: classes$t.imagoVersion,
20178
+ className: classes$u.imagoVersion,
19989
20179
  children: ["Imago version", jsxRuntime.jsx(Input$1, {
19990
20180
  schema: {
19991
20181
  "enum": imagoVersions,
@@ -20002,9 +20192,9 @@ function RecognizeDialog(prop) {
20002
20192
  children: "Recognized structure preview"
20003
20193
  })]
20004
20194
  }), jsxRuntime.jsxs("div", {
20005
- className: classes$t.imagesContainer,
20195
+ className: classes$u.imagesContainer,
20006
20196
  children: [jsxRuntime.jsxs("div", {
20007
- className: classes$t.picture,
20197
+ className: classes$u.picture,
20008
20198
  children: [file && isImage(file) && canPreviewImage && jsxRuntime.jsx("img", {
20009
20199
  alt: "",
20010
20200
  id: "pic",
@@ -20013,27 +20203,27 @@ function RecognizeDialog(prop) {
20013
20203
  setCanPreviewImage(false);
20014
20204
  }
20015
20205
  }), jsxRuntime.jsxs("span", {
20016
- className: classes$t.filename,
20206
+ className: classes$u.filename,
20017
20207
  children: [" ", file ? file.name : null, " "]
20018
20208
  }), file && isImage(file) && !canPreviewImage && jsxRuntime.jsx("div", {
20019
- className: classes$t.messageContainer,
20209
+ className: classes$u.messageContainer,
20020
20210
  children: jsxRuntime.jsxs("p", {
20021
20211
  children: ["Preview of '", file.type, "' MIME type is not supported by current browser"]
20022
20212
  })
20023
20213
  }), (!file || !isImage(file) && clearFile()) && jsxRuntime.jsx("div", {
20024
- className: classes$t.messageContainer,
20214
+ className: classes$u.messageContainer,
20025
20215
  children: jsxRuntime.jsx("p", {
20026
20216
  children: "Please choose image"
20027
20217
  })
20028
20218
  })]
20029
20219
  }), jsxRuntime.jsx("div", {
20030
- className: classes$t.output,
20220
+ className: classes$u.output,
20031
20221
  children: structStr && (
20032
20222
  structStr instanceof Promise || typeof structStr !== 'string' ? jsxRuntime.jsx("div", {
20033
- className: classes$t.messageContainer,
20223
+ className: classes$u.messageContainer,
20034
20224
  children: jsxRuntime.jsx(LoadingCircles, {})
20035
20225
  }) : jsxRuntime.jsx(StructRender, {
20036
- className: classes$t.struct,
20226
+ className: classes$u.struct,
20037
20227
  struct: structStr
20038
20228
  }))
20039
20229
  })]
@@ -20079,7 +20269,7 @@ var mapDispatchToProps$8 = function mapDispatchToProps(dispatch) {
20079
20269
  };
20080
20270
  var Recognize = reactRedux.connect(mapStateToProps$b, mapDispatchToProps$8)(RecognizeDialog);
20081
20271
 
20082
- var classes$s = {"button-common-styles":"Miew-module_button-common-styles__8FE-p","scrollbar":"Miew-module_scrollbar__ZMWH-","warning":"Miew-module_warning__IDl5F","applyButton":"Miew-module_applyButton__ZDE-i","miewDialog":"Miew-module_miewDialog__gHvYc","miewContainer":"Miew-module_miewContainer__2SNw3","miewDarkTheme":"Miew-module_miewDarkTheme__kMFzc"};
20272
+ var classes$t = {"button-common-styles":"Miew-module_button-common-styles__8FE-p","scrollbar":"Miew-module_scrollbar__ZMWH-","warning":"Miew-module_warning__IDl5F","applyButton":"Miew-module_applyButton__ZDE-i","miewDialog":"Miew-module_miewDialog__gHvYc","miewContainer":"Miew-module_miewContainer__2SNw3","miewDarkTheme":"Miew-module_miewDarkTheme__kMFzc"};
20083
20273
 
20084
20274
  var _excluded$g = ["miewOpts", "server", "struct", "onExportCML", "miewTheme"];
20085
20275
  var BACKGROUND_COLOR = {
@@ -20137,7 +20327,7 @@ function createMiewOptions(userOpts) {
20137
20327
  var CHANGING_WARNING = 'Stereocenters can be changed after the strong 3D rotation';
20138
20328
  var FooterContent$2 = function FooterContent() {
20139
20329
  return jsxRuntime.jsx("div", {
20140
- className: classes$s.warning,
20330
+ className: classes$t.warning,
20141
20331
  children: CHANGING_WARNING
20142
20332
  });
20143
20333
  };
@@ -20179,14 +20369,14 @@ var MiewDialog = function MiewDialog(_ref) {
20179
20369
  params: prop,
20180
20370
  buttons: ['Cancel', jsxRuntime.jsx("button", {
20181
20371
  onClick: exportCML,
20182
- className: classes$s.applyButton,
20372
+ className: classes$t.applyButton,
20183
20373
  children: "Apply"
20184
20374
  }, "apply")],
20185
20375
  footerContent: jsxRuntime.jsx(FooterContent$2, {}),
20186
- className: classes$s.miewDialog,
20376
+ className: classes$t.miewDialog,
20187
20377
  children: jsxRuntime.jsx("div", {
20188
20378
  children: jsxRuntime.jsx("div", {
20189
- className: "".concat(classes$s.miewContainer, " ").concat(miewTheme === 'dark' ? classes$s.miewDarkTheme : ''),
20379
+ className: "".concat(classes$t.miewContainer, " ").concat(miewTheme === 'dark' ? classes$t.miewDarkTheme : ''),
20190
20380
  children: jsxRuntime.jsx(Viewer__default["default"], {
20191
20381
  onInit: onMiewInit
20192
20382
  })
@@ -20226,7 +20416,7 @@ var ElementNumber = function ElementNumber(props) {
20226
20416
  });
20227
20417
  };
20228
20418
 
20229
- var classes$r = {"button-common-styles":"Atom-module_button-common-styles__ipWaI","scrollbar":"Atom-module_scrollbar__z5cVx","atomProps":"Atom-module_atomProps__pqBjY","accordionWrapper":"Atom-module_accordionWrapper__MSuU7","expandIcon":"Atom-module_expandIcon__mPszC","turnedIcon":"Atom-module_turnedIcon__0Kzwy","accordionSummaryWrapper":"Atom-module_accordionSummaryWrapper__MGqsq","accordionSummary":"Atom-module_accordionSummary__HMKzl","accordionDetailsWrapper":"Atom-module_accordionDetailsWrapper__p6EI7","hiddenAccordion":"Atom-module_hiddenAccordion__pDNdM","accordionDetails":"Atom-module_accordionDetails__-B3jK","checkbox":"Atom-module_checkbox__Vup40","reactionFlags":"Atom-module_reactionFlags__gdNb1","querySpecific":"Atom-module_querySpecific__7XxMr"};
20419
+ var classes$s = {"button-common-styles":"Atom-module_button-common-styles__ipWaI","scrollbar":"Atom-module_scrollbar__z5cVx","atomProps":"Atom-module_atomProps__pqBjY","accordionWrapper":"Atom-module_accordionWrapper__MSuU7","expandIcon":"Atom-module_expandIcon__mPszC","turnedIcon":"Atom-module_turnedIcon__0Kzwy","accordionSummaryWrapper":"Atom-module_accordionSummaryWrapper__MGqsq","accordionSummary":"Atom-module_accordionSummary__HMKzl","accordionDetailsWrapper":"Atom-module_accordionDetailsWrapper__p6EI7","hiddenAccordion":"Atom-module_hiddenAccordion__pDNdM","accordionDetails":"Atom-module_accordionDetails__-B3jK","checkbox":"Atom-module_checkbox__Vup40","reactionFlags":"Atom-module_reactionFlags__gdNb1","querySpecific":"Atom-module_querySpecific__7XxMr"};
20230
20420
 
20231
20421
  var _excluded$f = ["formState", "stereoParity", "isMultipleAtoms"];
20232
20422
  function ownKeys$t(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; }
@@ -20286,7 +20476,7 @@ var Atom = function Atom(props) {
20286
20476
  }, {
20287
20477
  groupName: 'Query specific',
20288
20478
  component: jsxRuntime.jsxs("div", {
20289
- className: classes$r.querySpecific,
20479
+ className: classes$s.querySpecific,
20290
20480
  children: [jsxRuntime.jsx(Field, {
20291
20481
  name: "ringBondCount",
20292
20482
  component: Select,
@@ -20302,13 +20492,13 @@ var Atom = function Atom(props) {
20302
20492
  }), jsxRuntime.jsx(Field, {
20303
20493
  name: "unsaturatedAtom",
20304
20494
  labelPos: "before",
20305
- className: classes$r.checkbox
20495
+ className: classes$s.checkbox
20306
20496
  })]
20307
20497
  })
20308
20498
  }, {
20309
20499
  groupName: 'Reaction flags',
20310
20500
  component: jsxRuntime.jsxs("div", {
20311
- className: classes$r.reactionFlags,
20501
+ className: classes$s.reactionFlags,
20312
20502
  children: [jsxRuntime.jsx(Field, {
20313
20503
  name: "invRet",
20314
20504
  component: Select,
@@ -20316,13 +20506,13 @@ var Atom = function Atom(props) {
20316
20506
  }), jsxRuntime.jsx(Field, {
20317
20507
  name: "exactChangeFlag",
20318
20508
  labelPos: "before",
20319
- className: classes$r.checkbox
20509
+ className: classes$s.checkbox
20320
20510
  })]
20321
20511
  })
20322
20512
  }];
20323
20513
  return jsxRuntime.jsx(Dialog, {
20324
20514
  title: "Atom Properties",
20325
- className: classes$r.atomProps,
20515
+ className: classes$s.atomProps,
20326
20516
  result: function result() {
20327
20517
  return formState.result;
20328
20518
  },
@@ -20348,7 +20538,7 @@ var Atom = function Atom(props) {
20348
20538
  init: rest
20349
20539
  }, formState), {}, {
20350
20540
  children: jsxRuntime.jsx("div", {
20351
- className: classes$r.accordionWrapper,
20541
+ className: classes$s.accordionWrapper,
20352
20542
  children: itemGroups.map(function (_ref) {
20353
20543
  var _clsx, _clsx2;
20354
20544
  var groupName = _ref.groupName,
@@ -20357,20 +20547,20 @@ var Atom = function Atom(props) {
20357
20547
  return jsxRuntime.jsxs("div", {
20358
20548
  children: [jsxRuntime.jsx("div", {
20359
20549
  onClick: handleAccordionChange(groupName),
20360
- className: classes$r.accordionSummaryWrapper,
20550
+ className: classes$s.accordionSummaryWrapper,
20361
20551
  children: jsxRuntime.jsxs("div", {
20362
- className: classes$r.accordionSummary,
20552
+ className: classes$s.accordionSummary,
20363
20553
  children: [jsxRuntime.jsx("span", {
20364
20554
  children: groupName
20365
20555
  }), jsxRuntime.jsx(Icon, {
20366
- className: clsx__default["default"]((_clsx = {}, _defineProperty__default["default"](_clsx, classes$r.expandIcon, true), _defineProperty__default["default"](_clsx, classes$r.turnedIcon, !shouldGroupBeRended), _clsx)),
20556
+ className: clsx__default["default"]((_clsx = {}, _defineProperty__default["default"](_clsx, classes$s.expandIcon, true), _defineProperty__default["default"](_clsx, classes$s.turnedIcon, !shouldGroupBeRended), _clsx)),
20367
20557
  name: "chevron"
20368
20558
  })]
20369
20559
  })
20370
20560
  }), jsxRuntime.jsx("div", {
20371
- className: clsx__default["default"]((_clsx2 = {}, _defineProperty__default["default"](_clsx2, classes$r.accordionDetailsWrapper, true), _defineProperty__default["default"](_clsx2, classes$r.hiddenAccordion, !shouldGroupBeRended), _clsx2)),
20561
+ className: clsx__default["default"]((_clsx2 = {}, _defineProperty__default["default"](_clsx2, classes$s.accordionDetailsWrapper, true), _defineProperty__default["default"](_clsx2, classes$s.hiddenAccordion, !shouldGroupBeRended), _clsx2)),
20372
20562
  children: jsxRuntime.jsx("div", {
20373
- className: classes$r.accordionDetails,
20563
+ className: classes$s.accordionDetails,
20374
20564
  children: component
20375
20565
  })
20376
20566
  })]
@@ -20404,7 +20594,7 @@ var mapStateToProps$9 = function mapStateToProps(state) {
20404
20594
  };
20405
20595
  var AtomContainer = reactRedux.connect(mapStateToProps$9)(Atom);
20406
20596
 
20407
- var classes$q = {"attachPoints":"Attach-module_attachPoints__5QEAv"};
20597
+ var classes$r = {"attachPoints":"Attach-module_attachPoints__5QEAv"};
20408
20598
 
20409
20599
  var _excluded$e = ["formState"];
20410
20600
  function ownKeys$s(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; }
@@ -20414,7 +20604,7 @@ var AttachPoints = function AttachPoints(props) {
20414
20604
  rest = _objectWithoutProperties__default["default"](props, _excluded$e);
20415
20605
  return jsxRuntime.jsx(Dialog, {
20416
20606
  title: "Attachment Points",
20417
- className: classes$q.attachPoints,
20607
+ className: classes$r.attachPoints,
20418
20608
  result: function result() {
20419
20609
  return formState.result;
20420
20610
  },
@@ -20447,7 +20637,7 @@ var mapStateToProps$8 = function mapStateToProps(state) {
20447
20637
  };
20448
20638
  var AttachPointsContainer = reactRedux.connect(mapStateToProps$8)(AttachPoints);
20449
20639
 
20450
- var classes$p = {"automap":"Automap-module_automap__531ko"};
20640
+ var classes$q = {"automap":"Automap-module_automap__531ko"};
20451
20641
 
20452
20642
  var _excluded$d = ["formState"];
20453
20643
  function ownKeys$r(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; }
@@ -20470,7 +20660,7 @@ var Automap = function Automap(props) {
20470
20660
  rest = _objectWithoutProperties__default["default"](props, _excluded$d);
20471
20661
  return jsxRuntime.jsx(Dialog, {
20472
20662
  title: "Reaction Auto-Mapping",
20473
- className: classes$p.automap,
20663
+ className: classes$q.automap,
20474
20664
  result: function result() {
20475
20665
  return formState.result;
20476
20666
  },
@@ -20511,7 +20701,7 @@ var mapDispatchToProps$6 = function mapDispatchToProps(dispatch, ownProps) {
20511
20701
  };
20512
20702
  var AutomapContainer = reactRedux.connect(mapStateToProps$7, mapDispatchToProps$6)(Automap);
20513
20703
 
20514
- var classes$o = {"bond":"Bond-module_bond__EDfLY"};
20704
+ var classes$p = {"bond":"Bond-module_bond__EDfLY"};
20515
20705
 
20516
20706
  var _excluded$c = ["formState"];
20517
20707
  function ownKeys$q(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; }
@@ -20522,7 +20712,7 @@ var Bond = function Bond(props) {
20522
20712
  var bondProps = bond.properties;
20523
20713
  return jsxRuntime.jsx(Dialog, {
20524
20714
  title: "Bond Properties",
20525
- className: classes$o.bond,
20715
+ className: classes$p.bond,
20526
20716
  result: function result() {
20527
20717
  return formState.result;
20528
20718
  },
@@ -20563,7 +20753,7 @@ var mapStateToProps$6 = function mapStateToProps(state) {
20563
20753
  };
20564
20754
  var BondContainer = reactRedux.connect(mapStateToProps$6)(Bond);
20565
20755
 
20566
- var classes$n = {"field":"IfThenSelect-module_field__9YaPA"};
20756
+ var classes$o = {"field":"IfThenSelect-module_field__9YaPA"};
20567
20757
 
20568
20758
  function ownKeys$p(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; }
20569
20759
  function _objectSpread$p(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$p(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$p(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -20586,14 +20776,14 @@ var IfThenSelect = function IfThenSelect(props) {
20586
20776
  });
20587
20777
  return jsxRuntime.jsx(Field, _objectSpread$p(_objectSpread$p({
20588
20778
  schema: desc,
20589
- className: classes$n.field
20779
+ className: classes$o.field
20590
20780
  }, props), {}, {
20591
20781
  component: Select,
20592
20782
  options: getSelectOptionsFromSchema(desc)
20593
20783
  }));
20594
20784
  };
20595
20785
 
20596
- var classes$m = {"button-common-styles":"RgroupLogic-module_button-common-styles__P-ABP","scrollbar":"RgroupLogic-module_scrollbar__gDniy","rgroupLogic":"RgroupLogic-module_rgroupLogic__q4RTy","resth":"RgroupLogic-module_resth__RL2qE"};
20786
+ var classes$n = {"button-common-styles":"RgroupLogic-module_button-common-styles__P-ABP","scrollbar":"RgroupLogic-module_scrollbar__gDniy","rgroupLogic":"RgroupLogic-module_rgroupLogic__q4RTy","resth":"RgroupLogic-module_resth__RL2qE"};
20597
20787
 
20598
20788
  var _excluded$b = ["formState", "label", "rgroupLabels"];
20599
20789
  function ownKeys$o(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; }
@@ -20605,7 +20795,7 @@ var RgroupLogic = function RgroupLogic(props) {
20605
20795
  rest = _objectWithoutProperties__default["default"](props, _excluded$b);
20606
20796
  return jsxRuntime.jsx(Dialog, {
20607
20797
  title: "R-Group Logic Condition",
20608
- className: classes$m.rgroupLogic,
20798
+ className: classes$n.rgroupLogic,
20609
20799
  result: function result() {
20610
20800
  return formState.result;
20611
20801
  },
@@ -20632,7 +20822,7 @@ var RgroupLogic = function RgroupLogic(props) {
20632
20822
  }), jsxRuntime.jsx(Field, {
20633
20823
  name: "resth",
20634
20824
  labelPos: "after",
20635
- className: classes$m.resth
20825
+ className: classes$n.resth
20636
20826
  }), jsxRuntime.jsx(IfThenSelect, {
20637
20827
  name: "ifthen",
20638
20828
  label: label,
@@ -20655,7 +20845,7 @@ var mapStateToProps$5 = function mapStateToProps(state) {
20655
20845
  };
20656
20846
  var RgroupLogicContainer = reactRedux.connect(mapStateToProps$5)(RgroupLogic);
20657
20847
 
20658
- var classes$l = {"button-common-styles":"Open-module_button-common-styles__NBSQP","scrollbar":"Open-module_scrollbar__sRvYM","open":"Open-module_open__m8V9g","textareaEditor":"Open-module_textareaEditor__ZbEVj","footerContent":"Open-module_footerContent__Q0hTw","buttonsContainer":"Open-module_buttonsContainer__L1HqU","openButton":"Open-module_openButton__cj3oU","cancelButton":"Open-module_cancelButton__0TQzA","copyButton":"Open-module_copyButton__KlXKd"};
20848
+ var classes$m = {"button-common-styles":"Open-module_button-common-styles__NBSQP","scrollbar":"Open-module_scrollbar__sRvYM","open":"Open-module_open__m8V9g","textareaEditor":"Open-module_textareaEditor__ZbEVj","footerContent":"Open-module_footerContent__Q0hTw","buttonsContainer":"Open-module_buttonsContainer__L1HqU","openButton":"Open-module_openButton__cj3oU","cancelButton":"Open-module_cancelButton__0TQzA","copyButton":"Open-module_copyButton__KlXKd"};
20659
20849
 
20660
20850
  var styles$8 = {"analyzingFileWrapper":"AnalyzingFile-module_analyzingFileWrapper__j0Ltf","fileBox":"AnalyzingFile-module_fileBox__ywFIh"};
20661
20851
 
@@ -20792,7 +20982,7 @@ var TextEditor = function TextEditor(_ref) {
20792
20982
  autoFocus = _ref$autoFocus === void 0 ? false : _ref$autoFocus;
20793
20983
  return jsxRuntime.jsx(jsxRuntime.Fragment, {
20794
20984
  children: jsxRuntime.jsx("textarea", {
20795
- className: classes$l.textareaEditor,
20985
+ className: classes$m.textareaEditor,
20796
20986
  value: structStr,
20797
20987
  onChange: function onChange(event) {
20798
20988
  return inputHandler(event.target.value);
@@ -20835,22 +21025,22 @@ var FooterContent$1 = function FooterContent(_ref) {
20835
21025
  copyHandler = _ref.copyHandler,
20836
21026
  onCancel = _ref.onCancel;
20837
21027
  return jsxRuntime.jsxs("div", {
20838
- className: classes$l.footerContent,
21028
+ className: classes$m.footerContent,
20839
21029
  children: [jsxRuntime.jsx("button", {
20840
21030
  onClick: onCancel,
20841
- className: classes$l.cancelButton,
21031
+ className: classes$m.cancelButton,
20842
21032
  children: "Cancel"
20843
21033
  }), jsxRuntime.jsxs("div", {
20844
- className: classes$l.buttonsContainer,
21034
+ className: classes$m.buttonsContainer,
20845
21035
  children: [jsxRuntime.jsx(DialogActionButton, {
20846
21036
  disabled: !structStr,
20847
21037
  clickHandler: openHandler,
20848
- styles: classes$l.openButton,
21038
+ styles: classes$m.openButton,
20849
21039
  label: "Open as New Project"
20850
21040
  }, "openButton"), jsxRuntime.jsx(DialogActionButton, {
20851
21041
  disabled: !structStr,
20852
21042
  clickHandler: copyHandler,
20853
- styles: classes$l.copyButton,
21043
+ styles: classes$m.copyButton,
20854
21044
  label: "Add to Canvas",
20855
21045
  title: "Structure will be loaded as fragment and added to Clipboard"
20856
21046
  }, "copyButton")]
@@ -20924,7 +21114,7 @@ var Open = function Open(props) {
20924
21114
  }
20925
21115
  return jsxRuntime.jsx(Dialog, {
20926
21116
  title: "Open structure",
20927
- className: classes$l.open,
21117
+ className: classes$m.open,
20928
21118
  params: rest,
20929
21119
  result: function result() {
20930
21120
  return null;
@@ -21048,7 +21238,7 @@ function couldBeSaved(struct, format) {
21048
21238
  return null;
21049
21239
  }
21050
21240
 
21051
- var classes$k = {"tabs":"Tabs-module_tabs__PuztJ","active":"Tabs-module_active__eeyNd"};
21241
+ var classes$l = {"tabs":"Tabs-module_tabs__PuztJ","active":"Tabs-module_active__eeyNd"};
21052
21242
 
21053
21243
  function ownKeys$k(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; }
21054
21244
  function _objectSpread$k(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$k(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$k(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -21100,10 +21290,10 @@ var Tabs = function (_Component) {
21100
21290
  className: className,
21101
21291
  tabIndex: tabIndex,
21102
21292
  children: jsxRuntime.jsx("li", {
21103
- className: classes$k.tabs,
21293
+ className: classes$l.tabs,
21104
21294
  children: tabs.map(function (tabPanel, index) {
21105
21295
  return jsxRuntime.jsx("a", {
21106
- className: clsx__default["default"](_defineProperty__default["default"]({}, classes$k.active, _this2.state.tabIndex === index)),
21296
+ className: clsx__default["default"](_defineProperty__default["default"]({}, classes$l.active, _this2.state.tabIndex === index)),
21107
21297
  onClick: function onClick(ev) {
21108
21298
  return _this2.changeTab(ev, index);
21109
21299
  },
@@ -21121,7 +21311,7 @@ var Tabs = function (_Component) {
21121
21311
  return Tabs;
21122
21312
  }(React.Component);
21123
21313
 
21124
- var classes$j = {"button-common-styles":"Save-module_button-common-styles__mpLS8","scrollbar":"Save-module_scrollbar__XMf7I","dialog":"Save-module_dialog__of-0M","formContainer":"Save-module_formContainer__v1pIq","tabs":"Save-module_tabs__TOB-R","warnings":"Save-module_warnings__1PxJT","warningsContainer":"Save-module_warningsContainer__-3yVy","warningsArr":"Save-module_warningsArr__bKUFY","previewBackground":"Save-module_previewBackground__AbaUf","previewArea":"Save-module_previewArea__-0SLb","loadingCirclesContainer":"Save-module_loadingCirclesContainer__COUKN","imageContainer":"Save-module_imageContainer__gFELk","previewMessage":"Save-module_previewMessage__CZfZB","ok":"Save-module_ok__SgeCM","cancel":"Save-module_cancel__SMkEV","saveTmpl":"Save-module_saveTmpl__O-d0T"};
21314
+ var classes$k = {"button-common-styles":"Save-module_button-common-styles__mpLS8","scrollbar":"Save-module_scrollbar__XMf7I","dialog":"Save-module_dialog__of-0M","formContainer":"Save-module_formContainer__v1pIq","tabs":"Save-module_tabs__TOB-R","warnings":"Save-module_warnings__1PxJT","warningsContainer":"Save-module_warningsContainer__-3yVy","warningsArr":"Save-module_warningsArr__bKUFY","previewBackground":"Save-module_previewBackground__AbaUf","previewArea":"Save-module_previewArea__-0SLb","loadingCirclesContainer":"Save-module_loadingCirclesContainer__COUKN","imageContainer":"Save-module_imageContainer__gFELk","previewMessage":"Save-module_previewMessage__CZfZB","ok":"Save-module_ok__SgeCM","cancel":"Save-module_cancel__SMkEV","saveTmpl":"Save-module_saveTmpl__O-d0T"};
21125
21315
 
21126
21316
  function ownKeys$j(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; }
21127
21317
  function _objectSpread$j(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$j(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$j(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -21273,7 +21463,7 @@ var SaveDialog = function (_Component) {
21273
21463
  tabIndex: 1
21274
21464
  }];
21275
21465
  return jsxRuntime.jsxs("div", {
21276
- className: classes$j.formContainer,
21466
+ className: classes$k.formContainer,
21277
21467
  children: [jsxRuntime.jsxs(Form$1, _objectSpread$j(_objectSpread$j({
21278
21468
  schema: _this.saveSchema,
21279
21469
  init: {
@@ -21290,7 +21480,7 @@ var SaveDialog = function (_Component) {
21290
21480
  component: Select
21291
21481
  })]
21292
21482
  })), jsxRuntime.jsx(Tabs, {
21293
- className: classes$j.tabs,
21483
+ className: classes$k.tabs,
21294
21484
  captions: tabs,
21295
21485
  tabIndex: _this.state.tabIndex,
21296
21486
  changeTab: _this.changeTab,
@@ -21311,13 +21501,13 @@ var SaveDialog = function (_Component) {
21311
21501
  var isCleanStruct = _this.props.struct.isBlank();
21312
21502
  var LoadingState = function LoadingState() {
21313
21503
  return jsxRuntime.jsx("div", {
21314
- className: classes$j.loadingCirclesContainer,
21504
+ className: classes$k.loadingCirclesContainer,
21315
21505
  children: jsxRuntime.jsx(LoadingCircles, {})
21316
21506
  });
21317
21507
  };
21318
21508
  var ImageContent = function ImageContent() {
21319
21509
  return jsxRuntime.jsx("div", {
21320
- className: classes$j.imageContainer,
21510
+ className: classes$k.imageContainer,
21321
21511
  children: !isCleanStruct && jsxRuntime.jsx("img", {
21322
21512
  src: "data:image/".concat(format, "+xml;base64,").concat(imageSrc),
21323
21513
  alt: "".concat(format, " preview")
@@ -21326,10 +21516,10 @@ var SaveDialog = function (_Component) {
21326
21516
  };
21327
21517
  var BinaryContent = function BinaryContent() {
21328
21518
  return jsxRuntime.jsx("div", {
21329
- className: classes$j.previewBackground,
21519
+ className: classes$k.previewBackground,
21330
21520
  children: jsxRuntime.jsx("textarea", {
21331
21521
  value: "Can not display binary content",
21332
- className: classes$j.previewArea,
21522
+ className: classes$k.previewArea,
21333
21523
  readOnly: true,
21334
21524
  ref: _this.textAreaRef
21335
21525
  })
@@ -21337,10 +21527,10 @@ var SaveDialog = function (_Component) {
21337
21527
  };
21338
21528
  var PreviewContent = function PreviewContent() {
21339
21529
  return jsxRuntime.jsx("div", {
21340
- className: classes$j.previewBackground,
21530
+ className: classes$k.previewBackground,
21341
21531
  children: jsxRuntime.jsx("textarea", {
21342
21532
  value: structStr,
21343
- className: classes$j.previewArea,
21533
+ className: classes$k.previewArea,
21344
21534
  readOnly: true,
21345
21535
  ref: _this.textAreaRef
21346
21536
  })
@@ -21363,12 +21553,12 @@ var SaveDialog = function (_Component) {
21363
21553
  var format = _formState$result3.format;
21364
21554
  var warnings = _this.getWarnings(format);
21365
21555
  return warnings.length ? jsxRuntime.jsx("div", {
21366
- className: classes$j.warnings,
21556
+ className: classes$k.warnings,
21367
21557
  children: warnings.map(function (warning) {
21368
21558
  return jsxRuntime.jsx("div", {
21369
- className: classes$j.warningsContainer,
21559
+ className: classes$k.warningsContainer,
21370
21560
  children: jsxRuntime.jsx("span", {
21371
- className: classes$j.warningsArr,
21561
+ className: classes$k.warningsArr,
21372
21562
  children: warning
21373
21563
  })
21374
21564
  });
@@ -21389,7 +21579,7 @@ var SaveDialog = function (_Component) {
21389
21579
  var savingStruct = _this.isBinaryCdxFormat(format) && !isLoading ? ketcherCore.b64toBlob(structStr) : structStr;
21390
21580
  var isMoleculeContain = _this.props.struct.atoms.size && _this.props.struct.bonds.size;
21391
21581
  var buttons = [jsxRuntime.jsx("button", {
21392
- className: classes$j.saveTmpl,
21582
+ className: classes$k.saveTmpl,
21393
21583
  disabled: disableControls || isCleanStruct || !isMoleculeContain,
21394
21584
  onClick: function onClick() {
21395
21585
  return _this.props.onTmplSave(_this.props.struct);
@@ -21398,7 +21588,7 @@ var SaveDialog = function (_Component) {
21398
21588
  }, "save-tmpl")];
21399
21589
  buttons.push( jsxRuntime.jsx("button", {
21400
21590
  mode: "onCancel",
21401
- className: classes$j.cancel,
21591
+ className: classes$k.cancel,
21402
21592
  onClick: function onClick() {
21403
21593
  return _this.props.onOk({});
21404
21594
  },
@@ -21414,7 +21604,7 @@ var SaveDialog = function (_Component) {
21414
21604
  type: "image/".concat(format, "+xml"),
21415
21605
  onSave: _this.props.onOk,
21416
21606
  disabled: disableControls || !formState.valid || isCleanStruct || !_this.props.server,
21417
- className: classes$j.ok,
21607
+ className: classes$k.ok,
21418
21608
  children: "Save"
21419
21609
  }, "save-image-button"));
21420
21610
  } else {
@@ -21426,7 +21616,7 @@ var SaveDialog = function (_Component) {
21426
21616
  server: _this.props.server,
21427
21617
  onSave: _this.props.onOk,
21428
21618
  disabled: disableControls || !formState.valid || isCleanStruct,
21429
- className: classes$j.ok,
21619
+ className: classes$k.ok,
21430
21620
  children: "Save"
21431
21621
  }, "save-file-button"));
21432
21622
  }
@@ -21470,7 +21660,7 @@ var SaveDialog = function (_Component) {
21470
21660
  key: "render",
21471
21661
  value: function render() {
21472
21662
  return jsxRuntime.jsx(Dialog, {
21473
- className: classes$j.dialog,
21663
+ className: classes$k.dialog,
21474
21664
  title: "Save Structure",
21475
21665
  params: this.props,
21476
21666
  buttons: this.getButtons(),
@@ -21509,7 +21699,7 @@ var mapDispatchToProps$4 = function mapDispatchToProps(dispatch) {
21509
21699
  };
21510
21700
  var Save = reactRedux.connect(mapStateToProps$3, mapDispatchToProps$4)(SaveDialog);
21511
21701
 
21512
- var classes$i = {"enhancedStereo":"enhancedStereo-module_enhancedStereo__8FLSY","stereoLabelItem":"enhancedStereo-module_stereoLabelItem__lEf-0","labelGroupSelect":"enhancedStereo-module_labelGroupSelect__K7TYC"};
21702
+ var classes$j = {"enhancedStereo":"enhancedStereo-module_enhancedStereo__8FLSY","stereoLabelItem":"enhancedStereo-module_stereoLabelItem__lEf-0","labelGroupSelect":"enhancedStereo-module_labelGroupSelect__K7TYC"};
21513
21703
 
21514
21704
  var _excluded$8 = ["struct", "formState", "init"];
21515
21705
  function ownKeys$i(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; }
@@ -21541,7 +21731,7 @@ var EnhancedStereo = function EnhancedStereo(props) {
21541
21731
  };
21542
21732
  return jsxRuntime.jsx(Dialog, {
21543
21733
  title: "Enhanced Stereochemistry",
21544
- className: classes$i.enhancedStereo,
21734
+ className: classes$j.enhancedStereo,
21545
21735
  params: rest,
21546
21736
  result: function result() {
21547
21737
  return _result;
@@ -21578,7 +21768,7 @@ var EnhancedStereo = function EnhancedStereo(props) {
21578
21768
  name: "andNumber",
21579
21769
  schema: _.range(1, maxAnd + 1),
21580
21770
  type: "text",
21581
- className: classes$i.labelGroupSelect
21771
+ className: classes$j.labelGroupSelect
21582
21772
  }), "Group"]
21583
21773
  }), maxOr !== 0 && jsxRuntime.jsxs("label", {
21584
21774
  children: [jsxRuntime.jsx(Field, {
@@ -21591,7 +21781,7 @@ var EnhancedStereo = function EnhancedStereo(props) {
21591
21781
  name: "orNumber",
21592
21782
  schema: _.range(1, maxOr + 1),
21593
21783
  type: "text",
21594
- className: classes$i.labelGroupSelect
21784
+ className: classes$j.labelGroupSelect
21595
21785
  }), "Group"]
21596
21786
  }), jsxRuntime.jsxs("label", {
21597
21787
  children: [jsxRuntime.jsx(Field, {
@@ -21736,7 +21926,7 @@ var LabelEdit$1 = reactRedux.connect(function (store) {
21736
21926
  };
21737
21927
  })(LabelEdit);
21738
21928
 
21739
- var classes$h = {"button-common-styles":"AtomInfo-module_button-common-styles__x3ucv","scrollbar":"AtomInfo-module_scrollbar__8GiyC","ket_atom_info":"AtomInfo-module_ket_atom_info__GOuZ6","none":"AtomInfo-module_none__PRuzx"};
21929
+ var classes$i = {"button-common-styles":"AtomInfo-module_button-common-styles__x3ucv","scrollbar":"AtomInfo-module_scrollbar__8GiyC","ket_atom_info":"AtomInfo-module_ket_atom_info__GOuZ6","none":"AtomInfo-module_none__PRuzx"};
21740
21930
 
21741
21931
  function AtomInfo(_ref) {
21742
21932
  var el = _ref.el,
@@ -21751,7 +21941,7 @@ function AtomInfo(_ref) {
21751
21941
  fontSize: '18px'
21752
21942
  };
21753
21943
  return jsxRuntime.jsxs("div", {
21754
- className: clsx__default["default"](classes$h.ket_atom_info, !isInfo && classes$h.none),
21944
+ className: clsx__default["default"](classes$i.ket_atom_info, !isInfo && classes$i.none),
21755
21945
  children: [jsxRuntime.jsx("div", {
21756
21946
  style: numberStyle,
21757
21947
  children: el.number
@@ -21984,13 +22174,35 @@ var VerticalBoxWithLines = function VerticalBoxWithLines() {
21984
22174
  });
21985
22175
  };
21986
22176
 
21987
- var classes$g = {"button-common-styles":"GenSet-module_button-common-styles__0Ro-U","scrollbar":"GenSet-module_scrollbar__Ev8Uz","genGroupLegendBox":"GenSet-module_genGroupLegendBox__CSTQr","legendBox":"GenSet-module_legendBox__0zIAk","SpecialNodes":"GenSet-module_SpecialNodes__oFKp3","AtomGenerics":"GenSet-module_AtomGenerics__MoQCf","GroupGenerics":"GenSet-module_GroupGenerics__pFPtX","Cyclic":"GenSet-module_Cyclic__VJRtt","Acyclic":"GenSet-module_Acyclic__R97MM","CyclicCarbo":"GenSet-module_CyclicCarbo__Aanb0","AcyclicCarbo":"GenSet-module_AcyclicCarbo__nowGn","CyclicHetero":"GenSet-module_CyclicHetero__bbOnT","AcyclicHetero":"GenSet-module_AcyclicHetero__hnr4G","button":"GenSet-module_button__TCbeM","selected":"GenSet-module_selected__58d2u"};
22177
+ var classes$h = {"button-common-styles":"GenSet-module_button-common-styles__0Ro-U","scrollbar":"GenSet-module_scrollbar__Ev8Uz","genGroupLegendBox":"GenSet-module_genGroupLegendBox__CSTQr","legendBox":"GenSet-module_legendBox__0zIAk","SpecialNodes":"GenSet-module_SpecialNodes__oFKp3","AtomGenerics":"GenSet-module_AtomGenerics__MoQCf","GroupGenerics":"GenSet-module_GroupGenerics__pFPtX","Cyclic":"GenSet-module_Cyclic__VJRtt","Acyclic":"GenSet-module_Acyclic__R97MM","CyclicCarbo":"GenSet-module_CyclicCarbo__Aanb0","AcyclicCarbo":"GenSet-module_AcyclicCarbo__nowGn","CyclicHetero":"GenSet-module_CyclicHetero__bbOnT","AcyclicHetero":"GenSet-module_AcyclicHetero__hnr4G"};
21988
22178
 
21989
22179
  var isGenericGroup = function isGenericGroup(group) {
21990
22180
  var cyclicGroups = ['Acyclic', 'Cyclic', 'Acyclic Carbo', 'Cyclic Carbo', 'Acyclic Hetero', 'Cyclic Hetero'];
21991
22181
  return cyclicGroups.includes(group);
21992
22182
  };
21993
22183
 
22184
+ var classes$g = {"button-common-styles":"ButtonGenSet-module_button-common-styles__3bEj7","scrollbar":"ButtonGenSet-module_scrollbar__CKIcM","button":"ButtonGenSet-module_button__hBoCQ","selected":"ButtonGenSet-module_selected__XAfYj"};
22185
+
22186
+ var ButtonGenSet = function ButtonGenSet(_ref) {
22187
+ var button = _ref.button,
22188
+ onAtomSelect = _ref.onAtomSelect,
22189
+ selected = _ref.selected,
22190
+ disabled = _ref.disabled;
22191
+ var titleText = disabled ? "".concat(button.label, " is disabled") : button.description || button.label;
22192
+ return jsxRuntime.jsx("button", {
22193
+ onClick: function onClick() {
22194
+ return onAtomSelect(button.label, false);
22195
+ },
22196
+ onDoubleClick: function onDoubleClick() {
22197
+ return onAtomSelect(button.label, true);
22198
+ },
22199
+ title: titleText,
22200
+ disabled: disabled,
22201
+ className: clsx__default["default"](_defineProperty__default["default"]({}, classes$g.selected, selected(button.label)), classes$g.button),
22202
+ children: button.label
22203
+ });
22204
+ };
22205
+
21994
22206
  var getGroupClassName = function getGroupClassName(groupName) {
21995
22207
  return groupName.replaceAll(' ', '');
21996
22208
  };
@@ -21999,7 +22211,8 @@ function GenSet(_ref) {
21999
22211
  selected = _ref.selected,
22000
22212
  onAtomSelect = _ref.onAtomSelect,
22001
22213
  className = _ref.className,
22002
- group = _ref.group;
22214
+ group = _ref.group,
22215
+ disabledQueryElements = _ref.disabledQueryElements;
22003
22216
  return jsxRuntime.jsx(jsxRuntime.Fragment, {
22004
22217
  children: labels.map(function (item, index) {
22005
22218
  var buttons = item.items;
@@ -22007,29 +22220,24 @@ function GenSet(_ref) {
22007
22220
  return jsxRuntime.jsxs("fieldset", {
22008
22221
  className: className,
22009
22222
  children: [jsxRuntime.jsx("div", {
22010
- className: classes$g[getGroupClassName(group)],
22223
+ className: classes$h[getGroupClassName(group)],
22011
22224
  children: buttons.map(function (button, index) {
22012
- return jsxRuntime.jsx("button", {
22013
- onClick: function onClick() {
22014
- return onAtomSelect(button.label, false);
22015
- },
22016
- onDoubleClick: function onDoubleClick() {
22017
- return onAtomSelect(button.label, true);
22018
- },
22019
- title: button.description || button.label,
22020
- className: clsx__default["default"](_defineProperty__default["default"]({}, classes$g.selected, selected(button.label)), classes$g.button),
22021
- children: button.label
22225
+ return jsxRuntime.jsx(ButtonGenSet, {
22226
+ button: button,
22227
+ onAtomSelect: onAtomSelect,
22228
+ selected: selected,
22229
+ disabled: Boolean(disabledQueryElements === null || disabledQueryElements === void 0 ? void 0 : disabledQueryElements.includes(button.label))
22022
22230
  }, index);
22023
22231
  })
22024
22232
  }), !isGenericGroup(group) && caption && jsxRuntime.jsx("div", {
22025
- className: classes$g.legendBox,
22233
+ className: classes$h.legendBox,
22026
22234
  children: jsxRuntime.jsx("legend", {
22027
22235
  children: caption
22028
22236
  })
22029
22237
  }), isGenericGroup(group) && caption && jsxRuntime.jsx("div", {
22030
- className: classes$g.genGroupLegendBox,
22238
+ className: classes$h.genGroupLegendBox,
22031
22239
  children: jsxRuntime.jsx("legend", {
22032
- className: classes$g.genGroupLegend,
22240
+ className: classes$h.genGroupLegend,
22033
22241
  children: caption
22034
22242
  })
22035
22243
  })]
@@ -22048,7 +22256,8 @@ var getLegendClassname = function getLegendClassname(title) {
22048
22256
  var GenGroup = function GenGroup(_ref) {
22049
22257
  var group = _ref.group,
22050
22258
  onAtomSelect = _ref.onAtomSelect,
22051
- selected = _ref.selected;
22259
+ selected = _ref.selected,
22260
+ disabledQueryElements = _ref.disabledQueryElements;
22052
22261
  return jsxRuntime.jsx("div", {
22053
22262
  className: styles$2.fieldFlexWrapper,
22054
22263
  children: jsxRuntime.jsxs("fieldset", {
@@ -22063,7 +22272,8 @@ var GenGroup = function GenGroup(_ref) {
22063
22272
  selected: selected,
22064
22273
  onAtomSelect: onAtomSelect,
22065
22274
  className: styles$2.subGroup,
22066
- group: group.title
22275
+ group: group.title,
22276
+ disabledQueryElements: disabledQueryElements
22067
22277
  })
22068
22278
  })]
22069
22279
  })
@@ -22086,36 +22296,38 @@ var getGenericsGroupsMap = function getGenericsGroupsMap(tree) {
22086
22296
  }
22087
22297
  return newGroups;
22088
22298
  };
22089
- var renderGenGroupComponent = function renderGenGroupComponent(group, selected, onAtomSelect) {
22299
+ var renderGenGroupComponent = function renderGenGroupComponent(group, selected, onAtomSelect, disabledQueryElements) {
22090
22300
  return jsxRuntime.jsx(GenGroup, {
22091
22301
  group: groupsMap[group],
22092
22302
  selected: selected,
22093
- onAtomSelect: onAtomSelect
22303
+ onAtomSelect: onAtomSelect,
22304
+ disabledQueryElements: disabledQueryElements
22094
22305
  });
22095
22306
  };
22096
22307
  var groupsMap = getGenericsGroupsMap(ketcherCore.Generics);
22097
22308
  function GenericGroups(_ref) {
22098
22309
  var selected = _ref.selected,
22099
- onAtomSelect = _ref.onAtomSelect;
22310
+ onAtomSelect = _ref.onAtomSelect,
22311
+ disabledQueryElements = _ref.disabledQueryElements;
22100
22312
  return jsxRuntime.jsxs("div", {
22101
22313
  className: classes$f.genericGroups,
22102
22314
  children: [jsxRuntime.jsxs("div", {
22103
22315
  className: classes$f.topGroupsContainer,
22104
- children: [renderGenGroupComponent(groupNames.atomsGen, selected, onAtomSelect), renderGenGroupComponent(groupNames.specialNodes, selected, onAtomSelect)]
22105
- }), renderGenGroupComponent(groupNames.groupGen, selected, onAtomSelect), jsxRuntime.jsx(HorizontalBoxWithLines, {}), jsxRuntime.jsxs("div", {
22316
+ children: [renderGenGroupComponent(groupNames.atomsGen, selected, onAtomSelect, disabledQueryElements), renderGenGroupComponent(groupNames.specialNodes, selected, onAtomSelect, disabledQueryElements)]
22317
+ }), renderGenGroupComponent(groupNames.groupGen, selected, onAtomSelect, disabledQueryElements), jsxRuntime.jsx(HorizontalBoxWithLines, {}), jsxRuntime.jsxs("div", {
22106
22318
  className: classes$f.groupGenerics,
22107
22319
  children: [jsxRuntime.jsxs("div", {
22108
- children: [renderGenGroupComponent(groupNames.groupAcyclic, selected, onAtomSelect), jsxRuntime.jsxs("div", {
22320
+ children: [renderGenGroupComponent(groupNames.groupAcyclic, selected, onAtomSelect, disabledQueryElements), jsxRuntime.jsxs("div", {
22109
22321
  className: classes$f.subgroupContainer,
22110
22322
  children: [jsxRuntime.jsx(VerticalBoxWithLines, {}), jsxRuntime.jsxs("div", {
22111
- children: [renderGenGroupComponent(groupNames.acyclicCarbo, selected, onAtomSelect), renderGenGroupComponent(groupNames.acyclicHetero, selected, onAtomSelect)]
22323
+ children: [renderGenGroupComponent(groupNames.acyclicCarbo, selected, onAtomSelect, disabledQueryElements), renderGenGroupComponent(groupNames.acyclicHetero, selected, onAtomSelect, disabledQueryElements)]
22112
22324
  })]
22113
22325
  })]
22114
22326
  }), jsxRuntime.jsxs("div", {
22115
- children: [renderGenGroupComponent(groupNames.groupCyclic, selected, onAtomSelect), jsxRuntime.jsxs("div", {
22327
+ children: [renderGenGroupComponent(groupNames.groupCyclic, selected, onAtomSelect, disabledQueryElements), jsxRuntime.jsxs("div", {
22116
22328
  className: classes$f.subgroupContainer,
22117
22329
  children: [jsxRuntime.jsx(VerticalBoxWithLines, {}), jsxRuntime.jsxs("div", {
22118
- children: [renderGenGroupComponent(groupNames.cyclicCarbo, selected, onAtomSelect), renderGenGroupComponent(groupNames.cyclicHetero, selected, onAtomSelect)]
22330
+ children: [renderGenGroupComponent(groupNames.cyclicCarbo, selected, onAtomSelect, disabledQueryElements), renderGenGroupComponent(groupNames.cyclicHetero, selected, onAtomSelect, disabledQueryElements)]
22119
22331
  })]
22120
22332
  })]
22121
22333
  })]
@@ -22396,7 +22608,8 @@ var Table = function Table(props) {
22396
22608
  needMargin: false,
22397
22609
  children: jsxRuntime.jsx(GenericGroups, {
22398
22610
  selected: selected,
22399
- onAtomSelect: onAtomSelect
22611
+ onAtomSelect: onAtomSelect,
22612
+ disabledQueryElements: props.disabledQueryElements
22400
22613
  })
22401
22614
  });
22402
22615
  };
@@ -22411,10 +22624,14 @@ function mapSelectionToProps(editor) {
22411
22624
  return {};
22412
22625
  }
22413
22626
  var mapStateToProps$1 = function mapStateToProps(state, ownProps) {
22627
+ var editor = state.editor;
22414
22628
  if (ownProps.values || ownProps.label) {
22415
22629
  return {};
22416
22630
  }
22417
- return mapSelectionToProps(state.editor);
22631
+ var disabledQueryElements = editor.render.options.disableQueryElements;
22632
+ return _objectSpread$a({
22633
+ disabledQueryElements: disabledQueryElements
22634
+ }, mapSelectionToProps(editor));
22418
22635
  };
22419
22636
  var mapDispatchToProps$2 = function mapDispatchToProps(dispatch, ownProps) {
22420
22637
  return {
@@ -22713,7 +22930,7 @@ var classes$8 = {"button-common-styles":"template-lib-module_button-common-style
22713
22930
 
22714
22931
  var _excluded$3 = ["onInit"],
22715
22932
  _excluded2$1 = ["name", "onNameEdit", "onAttachEdit"];
22716
- var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11;
22933
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12;
22717
22934
  function ownKeys$6(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; }
22718
22935
  function _objectSpread$6(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$6(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$6(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
22719
22936
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf__default["default"](Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf__default["default"](this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn__default["default"](this, result); }; }
@@ -22721,14 +22938,15 @@ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Re
22721
22938
  var TemplateEditDialog = styled__default["default"](Dialog)(_templateObject || (_templateObject = _taggedTemplateLiteral__default["default"](["\n background-color: #fff;\n\n & header {\n text-transform: none;\n border-bottom: 1px solid #e1e5ea;\n margin: 0;\n padding: 12px;\n }\n\n & form {\n display: flex;\n\n & label::after {\n top: 92px;\n margin-right: 12px;\n }\n }\n"])));
22722
22939
  var Editor$2 = styled__default["default"]('div')(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral__default["default"](["\n border: 1px solid #b4b9d6;\n background-color: #ffff;\n border-radius: 5px;\n position: relative;\n height: 300px;\n width: 330px;\n overflow: hidden;\n\n & .structEditor {\n height: 100%;\n width: 100%;\n border: none;\n }\n"])));
22723
22940
  var Warning = styled__default["default"]('div')(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral__default["default"](["\n padding: 0 5px;\n"])));
22724
- var LeftColumn = styled__default["default"]('div')(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral__default["default"](["\n padding: 12px;\n border-radius: 0 0 0 8px;\n background-color: #eff2f5;\n"])));
22725
- var RightColumn = styled__default["default"]('div')(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral__default["default"](["\n width: 40%;\n min-width: 200px;\n box-sizing: border-box;\n padding: 12px;\n display: flex;\n flex-direction: column;\n"])));
22726
- var NameInput = styled__default["default"](Field)(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral__default["default"](["\n display: flex;\n flex-direction: column;\n margin-bottom: 12px;\n\n & > input[type='text'] {\n display: block;\n width: 100%;\n box-sizing: border-box;\n padding: 4px 16px 4px 8px;\n border: 1px solid #cad3dd;\n border-radius: 4px;\n line-height: 16px;\n font-size: 14px;\n margin-top: 2px;\n\n &:hover {\n border-color: #43b5c0;\n }\n\n &:hover,\n :focus {\n box-shadow: none;\n }\n }\n\n & span {\n display: block;\n width: 100%;\n }\n"])));
22727
- var AttachmentOutput = styled__default["default"]('span')(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral__default["default"](["\n display: block;\n width: 100%;\n height: 24px;\n box-sizing: border-box;\n padding: 4px 8px;\n border: 1px solid #cad3dd;\n border-radius: 4px;\n line-height: 14px;\n font-size: 14px;\n background-color: #eff2f5;\n margin-top: 2px;\n"])));
22728
- var Buttons = styled__default["default"]('div')(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral__default["default"](["\n display: flex;\n flex-direction: row;\n margin-top: auto;\n justify-content: flex-end;\n gap: 8px;\n"])));
22729
- var buttonCommonStyles = react.css(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral__default["default"](["\n width: fit-content;\n padding: 5px 8px;\n text-transform: none;\n font-size: 12px;\n line-height: 14px;\n box-shadow: none;\n"])));
22730
- var SaveButton = styled__default["default"](material.Button)(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral__default["default"](["\n ", "\n background-color: #167782;\n\n &:hover {\n background-color: #43b5c0;\n box-shadow: none;\n }\n\n &:disabled {\n background-color: #e1e5ea;\n color: #333333;\n }\n"])), buttonCommonStyles);
22731
- var CancelButton = styled__default["default"](material.Button)(_templateObject11 || (_templateObject11 = _taggedTemplateLiteral__default["default"](["\n ", "\n border-color: #585858;\n color: #585858;\n\n &:hover {\n border-color: #333333;\n color: #333333;\n box-shadow: none;\n }\n"])), buttonCommonStyles);
22941
+ var Message = styled__default["default"]('div')(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral__default["default"](["\n background-color: #e1e5ea;\n color: #333333;\n padding: 10px 12px;\n border-top: 1px solid #cad3dd;\n border-bottom: 1px solid #cad3dd;\n"])));
22942
+ var LeftColumn = styled__default["default"]('div')(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral__default["default"](["\n padding: 12px;\n border-radius: 0 0 0 8px;\n background-color: #eff2f5;\n"])));
22943
+ var RightColumn = styled__default["default"]('div')(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral__default["default"](["\n width: 40%;\n min-width: 200px;\n box-sizing: border-box;\n padding: 12px;\n display: flex;\n flex-direction: column;\n"])));
22944
+ var NameInput = styled__default["default"](Field)(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral__default["default"](["\n display: flex;\n flex-direction: column;\n margin-bottom: 12px;\n\n & input[type='text'] {\n display: block;\n width: 100%;\n box-sizing: border-box;\n border: 1px solid #cad3dd;\n border-radius: 4px;\n line-height: 16px;\n font-size: 14px;\n margin-top: 4px;\n\n &:hover {\n border-color: #43b5c0;\n }\n\n &:hover,\n :focus {\n box-shadow: none;\n }\n }\n\n & span {\n display: block;\n width: 100%;\n }\n"])));
22945
+ var AttachmentOutput = styled__default["default"]('span')(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral__default["default"](["\n display: block;\n width: 100%;\n height: 24px;\n box-sizing: border-box;\n padding: 4px 8px;\n border: 1px solid #cad3dd;\n border-radius: 4px;\n line-height: 14px;\n font-size: 14px;\n background-color: #eff2f5;\n margin-top: 4px;\n"])));
22946
+ var Buttons = styled__default["default"]('div')(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral__default["default"](["\n display: flex;\n flex-direction: row;\n margin-top: auto;\n justify-content: flex-end;\n gap: 8px;\n"])));
22947
+ var buttonCommonStyles = react.css(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral__default["default"](["\n width: fit-content;\n padding: 5px 8px;\n text-transform: none;\n font-size: 12px;\n line-height: 14px;\n box-shadow: none;\n"])));
22948
+ var SaveButton = styled__default["default"](material.Button)(_templateObject11 || (_templateObject11 = _taggedTemplateLiteral__default["default"](["\n ", "\n background-color: #167782;\n\n &:hover {\n background-color: #43b5c0;\n box-shadow: none;\n }\n\n &:disabled {\n background-color: #e1e5ea;\n color: #333333;\n }\n"])), buttonCommonStyles);
22949
+ var CancelButton = styled__default["default"](material.Button)(_templateObject12 || (_templateObject12 = _taggedTemplateLiteral__default["default"](["\n ", "\n border-color: #585858;\n color: #585858;\n\n &:hover {\n border-color: #333333;\n color: #333333;\n box-shadow: none;\n }\n"])), buttonCommonStyles);
22732
22950
  var editorStyles = {
22733
22951
  selectionStyle: {
22734
22952
  fill: '#167782',
@@ -22752,6 +22970,11 @@ var Attach = function (_Component) {
22752
22970
  props = _objectWithoutProperties__default["default"](_ref, _excluded$3);
22753
22971
  _classCallCheck__default["default"](this, Attach);
22754
22972
  _this = _super.call(this);
22973
+ _defineProperty__default["default"](_assertThisInitialized__default["default"](_this), "MODES", {
22974
+ SAVE: 'save',
22975
+ EDIT: 'edit'
22976
+ });
22977
+ _this.mode = _.isEmpty(props.tmpl.props) ? _this.MODES.SAVE : _this.MODES.EDIT;
22755
22978
  _this.tmpl = initTmpl(props.tmpl);
22756
22979
  onInit(_this.tmpl.struct.name, _this.tmpl.props);
22757
22980
  _this.onResult = _this.onResult.bind(_assertThisInitialized__default["default"](_this));
@@ -22795,8 +23018,10 @@ var Attach = function (_Component) {
22795
23018
  var options = Object.assign(editorStyles, this.props.globalSettings, {
22796
23019
  scale: getScale(struct)
22797
23020
  });
22798
- return jsxRuntime.jsx(TemplateEditDialog, {
22799
- title: "Template edit",
23021
+ var dialogTitle = this.mode === this.MODES.SAVE ? 'Save to Templates' : 'Template Edit';
23022
+ var warningObject = this.mode === this.MODES.SAVE ? 'Templates' : 'Edited templates';
23023
+ return jsxRuntime.jsxs(TemplateEditDialog, {
23024
+ title: dialogTitle,
22800
23025
  result: this.onResult,
22801
23026
  valid: function valid() {
22802
23027
  return _this2.props.formState.valid && name;
@@ -22804,7 +23029,13 @@ var Attach = function (_Component) {
22804
23029
  params: prop,
22805
23030
  buttons: [],
22806
23031
  needMargin: false,
22807
- children: jsxRuntime.jsxs(Form$1, _objectSpread$6(_objectSpread$6({
23032
+ children: [jsxRuntime.jsxs(Message, {
23033
+ children: [jsxRuntime.jsxs("div", {
23034
+ children: [warningObject, " are saved locally and cannot be accessed on different browsers or computers."]
23035
+ }), jsxRuntime.jsx("div", {
23036
+ children: "Be aware that other users of the same computer and browser can access them as well."
23037
+ })]
23038
+ }), jsxRuntime.jsxs(Form$1, _objectSpread$6(_objectSpread$6({
22808
23039
  schema: attachSchema,
22809
23040
  customValid: {
22810
23041
  name: function name(_name) {
@@ -22856,11 +23087,11 @@ var Attach = function (_Component) {
22856
23087
  },
22857
23088
  className: classes$8.button,
22858
23089
  disabled: !this.checkIsValidName(name),
22859
- children: "Apply"
23090
+ children: this.mode === this.MODES.SAVE ? 'Save' : 'Edit'
22860
23091
  })]
22861
23092
  })]
22862
23093
  })]
22863
- }))
23094
+ }))]
22864
23095
  });
22865
23096
  }
22866
23097
  }]);
@@ -23755,10 +23986,10 @@ function Modal(props) {
23755
23986
  var Component = modals[modal.name];
23756
23987
  if (!Component) throw new Error("There is no modal window named ".concat(modal.name));
23757
23988
  return jsxRuntime.jsx("div", {
23758
- className: clsx__default["default"](classes$E.modalOverlay, selectClasses.selectContainer),
23989
+ className: clsx__default["default"](classes$F.modalOverlay, selectClasses.selectContainer),
23759
23990
  ref: containerRef,
23760
23991
  children: jsxRuntime.jsx(Component, _objectSpread$3({
23761
- className: clsx__default["default"](_defineProperty__default["default"]({}, classes$E.smallScreen, height && height <= mediaSizes$1.smallHeight || width && width <= mediaSizes$1.smallWidth))
23992
+ className: clsx__default["default"](_defineProperty__default["default"]({}, classes$F.smallScreen, height && height <= mediaSizes$1.smallHeight || width && width <= mediaSizes$1.smallWidth))
23762
23993
  }, rest))
23763
23994
  });
23764
23995
  }
@@ -23802,6 +24033,24 @@ var mergeProps = function mergeProps(stateProps, dispatchProps) {
23802
24033
  };
23803
24034
  var ModalContainer = reactRedux.connect(mapStateToProps, mapDispatchToProps$1, mergeProps)(Modal);
23804
24035
 
24036
+ function generateCommonProperties(selectedElements, normalizedElement) {
24037
+ var properties = Object.getOwnPropertyNames(normalizedElement);
24038
+ var resultElementAttributes = {};
24039
+ properties.forEach(function (property) {
24040
+ var uniqueValues = new Set();
24041
+ selectedElements.forEach(function (element) {
24042
+ uniqueValues.add(element[property]);
24043
+ });
24044
+ var allElementsHaveTheSameValue = uniqueValues.size === 1;
24045
+ if (allElementsHaveTheSameValue) {
24046
+ resultElementAttributes[property] = normalizedElement[property];
24047
+ } else {
24048
+ resultElementAttributes[property] = '';
24049
+ }
24050
+ });
24051
+ return resultElementAttributes;
24052
+ }
24053
+
23805
24054
  function ownKeys$1(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; }
23806
24055
  function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$1(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
23807
24056
  function initEditor(dispatch, getState) {
@@ -23845,7 +24094,7 @@ function initEditor(dispatch, getState) {
23845
24094
  },
23846
24095
  onElementEdit: function onElementEdit(selem) {
23847
24096
  if (isAtomsArray(selem)) {
23848
- var atomAttributes = generateCommonProperties(selem);
24097
+ var atomAttributes = generateCommonProperties(selem, fromAtom(selem[0]));
23849
24098
  return openDialog(dispatch, 'atomProps', _objectSpread$1(_objectSpread$1({}, atomAttributes), {}, {
23850
24099
  isMultipleAtoms: true
23851
24100
  })).then(toElement);
@@ -23908,8 +24157,9 @@ function initEditor(dispatch, getState) {
23908
24157
  onQuickEdit: function onQuickEdit(atom) {
23909
24158
  return openDialog(dispatch, 'labelEdit', atom);
23910
24159
  },
23911
- onBondEdit: function onBondEdit(bond) {
23912
- return openDialog(dispatch, 'bondProps', fromBond(bond)).then(toBond);
24160
+ onBondEdit: function onBondEdit(bonds) {
24161
+ var bondsAttributes = generateCommonProperties(bonds, bonds[0]);
24162
+ return openDialog(dispatch, 'bondProps', fromBond(bondsAttributes)).then(toBond);
23913
24163
  },
23914
24164
  onRgroupEdit: function onRgroupEdit(rgroup) {
23915
24165
  var struct = getState().editor.struct();
@@ -24123,8 +24373,8 @@ var KetcherBuilder = function () {
24123
24373
  initApp(element, staticResourcesUrl, {
24124
24374
  buttons: buttons || {},
24125
24375
  errorHandler: errorHandler || null,
24126
- version: "2.9.0-rc.9" ,
24127
- buildDate: "2023-04-24T13:05:42" ,
24376
+ version: "2.10.0-rc.2" ,
24377
+ buildDate: "2023-05-03T14:52:11" ,
24128
24378
  buildNumber: ''
24129
24379
  }, structService, resolve);
24130
24380
  });
@@ -24238,4 +24488,5 @@ exports.Editor = Editor;
24238
24488
  exports.KETCHER_INIT_EVENT_NAME = KETCHER_INIT_EVENT_NAME;
24239
24489
  exports.KETCHER_SAVED_SETTINGS_KEY = KETCHER_SAVED_SETTINGS_KEY;
24240
24490
  exports.MODES = MODES;
24491
+ exports.STRUCT_TYPE = STRUCT_TYPE;
24241
24492
  //# sourceMappingURL=index.js.map