ketcher-react 2.26.0-rc.6 → 2.27.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -3798,7 +3798,7 @@ var zoom = {
3798
3798
 
3799
3799
  var openHelpLink = function openHelpLink() {
3800
3800
  var _window$open;
3801
- return (_window$open = window.open("https://github.com/epam/ketcher/blob/".concat("v2.26.0-rc.6\n", "/documentation/help.md#ketcher-overview"))) === null || _window$open === void 0 ? void 0 : _window$open.focus();
3801
+ return (_window$open = window.open("https://github.com/epam/ketcher/blob/".concat("v2.27.0-rc.1\n", "/documentation/help.md#ketcher-overview"))) === null || _window$open === void 0 ? void 0 : _window$open.focus();
3802
3802
  };
3803
3803
  var help = {
3804
3804
  help: {
@@ -8315,11 +8315,6 @@ var DetailsContainer = styled__default["default"].div({
8315
8315
  overflowX: 'hidden',
8316
8316
  overflowY: 'auto',
8317
8317
  transition: 'all .3s'
8318
- }, function (_ref) {
8319
- var expanded = _ref.expanded;
8320
- return {
8321
- maxHeight: expanded ? '9999px' : '0'
8322
- };
8323
8318
  });
8324
8319
 
8325
8320
  var Accordion$1 = function Accordion(_ref) {
@@ -8334,7 +8329,7 @@ var Accordion$1 = function Accordion(_ref) {
8334
8329
  children: [jsxRuntime.jsx(SummaryContainer, {
8335
8330
  onClick: onSummaryClick,
8336
8331
  children: summary
8337
- }), jsxRuntime.jsx(DetailsContainer, {
8332
+ }), expanded && jsxRuntime.jsx(DetailsContainer, {
8338
8333
  "data-testid": dataTestIdDetails,
8339
8334
  expanded: expanded,
8340
8335
  children: details
@@ -8501,7 +8496,8 @@ var MonomerName = styled__default["default"].div(_templateObject6$2 || (_templat
8501
8496
 
8502
8497
  var AmbiguousMonomerPreview = function AmbiguousMonomerPreview(_ref) {
8503
8498
  var className = _ref.className,
8504
- preview = _ref.preview;
8499
+ preview = _ref.preview,
8500
+ style = _ref.style;
8505
8501
  var monomer = preview.monomer,
8506
8502
  presetMonomers = preview.presetMonomers;
8507
8503
  var isAlternatives = monomer.subtype === 'alternatives';
@@ -8559,6 +8555,7 @@ var AmbiguousMonomerPreview = function AmbiguousMonomerPreview(_ref) {
8559
8555
  return sortedData.slice(0, 5);
8560
8556
  }, [previewData, isAlternatives]);
8561
8557
  return jsxRuntime.jsxs(Container, {
8558
+ style: style,
8562
8559
  className: className,
8563
8560
  "data-testid": "polymer-library-preview",
8564
8561
  children: [jsxRuntime.jsx(Header$1, {
@@ -14625,7 +14622,7 @@ var groupDescriptors = groups.reduce(function (accum, group, index) {
14625
14622
  var rGroupOptions = makeItems(['rgroup-label', 'rgroup-fragment', 'rgroup-attpoints']);
14626
14623
  var shapeOptions = makeItems(['shape-ellipse', 'shape-rectangle', 'shape-line']);
14627
14624
  var selectOptions$2 = makeItems(['select-rectangle', 'select-lasso', 'select-fragment']);
14628
- 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-retrosynthetic', '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-open-angle', 'reaction-arrow-elliptical-arc-arrow-filled-triangle', 'reaction-arrow-elliptical-arc-arrow-filled-bow', 'reaction-arrow-elliptical-arc-arrow-open-half-angle', ketcherCore.MULTITAIL_ARROW_TOOL_NAME]);
14625
+ 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-retrosynthetic', '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', ketcherCore.MULTITAIL_ARROW_TOOL_NAME]);
14629
14626
  var mappingOptions = makeItems(['reaction-map', 'reaction-unmap', 'reaction-automap']);
14630
14627
 
14631
14628
  var classes$M = {"scroll":"ArrowScroll-module_scroll__h9kCx","button":"ArrowScroll-module_button__ygMgL","down":"ArrowScroll-module_down__yDzZX","up":"ArrowScroll-module_up__Q1ubd"};
@@ -15410,14 +15407,16 @@ var UndoRedo = function UndoRedo(_ref) {
15410
15407
  iconName: "undo",
15411
15408
  disabled: disabledButtons.includes('undo'),
15412
15409
  isHidden: hiddenButtons.includes('undo'),
15413
- shortcut: shortcuts.undo
15410
+ shortcut: shortcuts.undo,
15411
+ testId: "undo"
15414
15412
  }), jsxRuntime.jsx(TopToolbarIconButton, {
15415
15413
  title: "Redo",
15416
15414
  onClick: onRedo,
15417
15415
  iconName: "redo",
15418
15416
  disabled: disabledButtons.includes('redo'),
15419
15417
  isHidden: hiddenButtons.includes('redo'),
15420
- shortcut: shortcuts.redo
15418
+ shortcut: shortcuts.redo,
15419
+ testId: "redo"
15421
15420
  }), jsxRuntime.jsx(Divider$1, {})]
15422
15421
  });
15423
15422
  };
@@ -16215,22 +16214,34 @@ function getElementsInRectangle(restruct, p0, p1) {
16215
16214
  var bottomLeftPosition = new ketcherCore.Vec2(x0, y1);
16216
16215
  var polygon = [topLeftPosition, topRightPosition, bottomRightPosition, bottomLeftPosition];
16217
16216
  restruct.bonds.forEach(function (bond, bid) {
16218
- if (struct.isBondFromMacromolecule(bid)) {
16217
+ if (ketcherCore.FunctionalGroup.isBondInContractedFunctionalGroup(bond.b, sGroups, functionalGroups)) {
16219
16218
  return;
16220
16219
  }
16221
- var centre = ketcherCore.Vec2.lc2(
16222
- restruct.atoms.get(bond.b.begin).a.pp, 0.5,
16223
- restruct.atoms.get(bond.b.end).a.pp, 0.5);
16224
- if (centre.x > x0 && centre.x < x1 && centre.y > y0 && centre.y < y1 && !ketcherCore.FunctionalGroup.isBondInContractedFunctionalGroup(bond.b, sGroups, functionalGroups)) {
16220
+ var center;
16221
+ if (bond.b.isExternalBondBetweenMonomers(struct)) {
16222
+ var firstMonomer = struct.getGroupFromAtomId(bond.b.begin);
16223
+ var secondMonomer = struct.getGroupFromAtomId(bond.b.end);
16224
+ assert_1(firstMonomer);
16225
+ assert_1(secondMonomer);
16226
+ center = firstMonomer.pp && secondMonomer.pp ? ketcherCore.Vec2.centre(firstMonomer.pp, secondMonomer.pp) : bond.b.center;
16227
+ } else {
16228
+ center = bond.b.center;
16229
+ }
16230
+ if (center.x > x0 && center.x < x1 && center.y > y0 && center.y < y1) {
16225
16231
  bondList.push(bid);
16226
16232
  }
16227
16233
  });
16228
16234
  restruct.atoms.forEach(function (atom, aid) {
16229
16235
  var relatedFGId = ketcherCore.FunctionalGroup.findFunctionalGroupByAtom(functionalGroups, aid);
16230
- var reSGroup = restruct.sgroups.get(relatedFGId);
16231
- if (atom.a.pp.x > x0 && atom.a.pp.x < x1 && atom.a.pp.y > y0 && atom.a.pp.y < y1 && (!ketcherCore.FunctionalGroup.isAtomInContractedFunctionalGroup(atom.a, sGroups, functionalGroups, true) ||
16232
- aid === reSGroup.item.atoms[0])) {
16233
- atomList.push(aid);
16236
+ var sGroup = struct.sgroups.get(relatedFGId);
16237
+ if (struct.isAtomFromMacromolecule(aid)) {
16238
+ if (sGroup && sGroup.pp && sGroup.pp.x > x0 && sGroup.pp.x < x1 && sGroup.pp.y > y0 && sGroup.pp.y < y1) {
16239
+ atomList.push(aid);
16240
+ }
16241
+ } else {
16242
+ if (atom.a.pp.x > x0 && atom.a.pp.x < x1 && atom.a.pp.y > y0 && atom.a.pp.y < y1 && (!ketcherCore.FunctionalGroup.isAtomInContractedFunctionalGroup(atom.a, sGroups, functionalGroups, true) || aid === (sGroup === null || sGroup === void 0 ? void 0 : sGroup.atoms[0]))) {
16243
+ atomList.push(aid);
16244
+ }
16234
16245
  }
16235
16246
  });
16236
16247
  var rxnArrowsList = [];
@@ -16325,22 +16336,34 @@ function getElementsInPolygon(restruct, rr) {
16325
16336
  r[i] = new ketcherCore.Vec2(rr[i].x, rr[i].y);
16326
16337
  }
16327
16338
  restruct.bonds.forEach(function (bond, bid) {
16328
- if (struct.isAtomFromMacromolecule(bond.b.begin) || struct.isAtomFromMacromolecule(bond.b.end)) {
16339
+ if (ketcherCore.FunctionalGroup.isBondInContractedFunctionalGroup(bond.b, sGroups, functionalGroups)) {
16329
16340
  return;
16330
16341
  }
16331
- var centre = ketcherCore.Vec2.lc2(
16332
- restruct.atoms.get(bond.b.begin).a.pp, 0.5,
16333
- restruct.atoms.get(bond.b.end).a.pp, 0.5);
16334
- if (isPointInPolygon(r, centre) && !ketcherCore.FunctionalGroup.isBondInContractedFunctionalGroup(bond.b, sGroups, functionalGroups)) {
16342
+ var center;
16343
+ if (bond.b.isExternalBondBetweenMonomers(struct)) {
16344
+ var firstMonomer = struct.getGroupFromAtomId(bond.b.begin);
16345
+ var secondMonomer = struct.getGroupFromAtomId(bond.b.end);
16346
+ assert_1(firstMonomer);
16347
+ assert_1(secondMonomer);
16348
+ center = firstMonomer !== null && firstMonomer !== void 0 && firstMonomer.pp && secondMonomer !== null && secondMonomer !== void 0 && secondMonomer.pp ? ketcherCore.Vec2.centre(firstMonomer.pp, secondMonomer.pp) : bond.b.center;
16349
+ } else {
16350
+ center = bond.b.center;
16351
+ }
16352
+ if (isPointInPolygon(r, center)) {
16335
16353
  bondList.push(bid);
16336
16354
  }
16337
16355
  });
16338
16356
  restruct.atoms.forEach(function (atom, aid) {
16339
16357
  var relatedFGId = ketcherCore.FunctionalGroup.findFunctionalGroupByAtom(functionalGroups, aid);
16340
- var reSGroup = restruct.sgroups.get(relatedFGId);
16341
- if (isPointInPolygon(r, atom.a.pp) && (!ketcherCore.FunctionalGroup.isAtomInContractedFunctionalGroup(atom.a, sGroups, functionalGroups, true) ||
16342
- aid === reSGroup.item.atoms[0])) {
16343
- atomList.push(aid);
16358
+ var sGroup = struct.sgroups.get(relatedFGId);
16359
+ if (struct.isAtomFromMacromolecule(aid)) {
16360
+ if (sGroup && sGroup.pp && isPointInPolygon(r, sGroup.pp)) {
16361
+ atomList.push(aid);
16362
+ }
16363
+ } else {
16364
+ if (isPointInPolygon(r, atom.a.pp) && (!ketcherCore.FunctionalGroup.isAtomInContractedFunctionalGroup(atom.a, sGroups, functionalGroups, true) || aid === (sGroup === null || sGroup === void 0 ? void 0 : sGroup.atoms[0]))) {
16365
+ atomList.push(aid);
16366
+ }
16344
16367
  }
16345
16368
  });
16346
16369
  var rxnArrowsList = [];
@@ -21527,7 +21550,12 @@ var EnhancedStereoTool = function () {
21527
21550
  }
21528
21551
  var action = stereoAtoms.reduce(function (acc, stereoAtom) {
21529
21552
  var _struct$atoms$get;
21530
- return acc.mergeWith(ketcherCore.fromStereoFlagUpdate(restruct, (_struct$atoms$get = struct.atoms.get(stereoAtom)) === null || _struct$atoms$get === void 0 ? void 0 : _struct$atoms$get.fragment));
21553
+ var frid = (_struct$atoms$get = struct.atoms.get(stereoAtom)) === null || _struct$atoms$get === void 0 ? void 0 : _struct$atoms$get.fragment;
21554
+ var frag = frid !== undefined ? restruct.molecule.frags.get(frid) : null;
21555
+ if (frag && frag.stereoAtoms) {
21556
+ return acc.mergeWith(ketcherCore.fromStereoFlagUpdate(restruct, frid));
21557
+ }
21558
+ return acc;
21531
21559
  }, ketcherCore.fromAtomsAttrs(restruct, stereoAtoms, {
21532
21560
  stereoLabel: stereoLabel
21533
21561
  }, false));
@@ -23563,23 +23591,26 @@ var Highlighter = function () {
23563
23591
  args.forEach(function (arg) {
23564
23592
  var atoms = arg.atoms,
23565
23593
  bonds = arg.bonds,
23594
+ rgroupAttachmentPoints = arg.rgroupAttachmentPoints,
23566
23595
  color = arg.color;
23567
23596
  if (typeof color !== 'string') {
23568
23597
  return;
23569
23598
  }
23570
- if (!atoms && !bonds) {
23599
+ if (!atoms && !bonds && !rgroupAttachmentPoints) {
23571
23600
  return;
23572
23601
  }
23573
23602
  var restruct = _this.editor.render.ctab;
23574
- var _getValidInputOnly = getValidInputOnly(restruct.molecule, atoms, bonds),
23603
+ var _getValidInputOnly = getValidInputOnly(restruct.molecule, atoms, bonds, rgroupAttachmentPoints),
23575
23604
  validAtoms = _getValidInputOnly.validAtoms,
23576
- validBonds = _getValidInputOnly.validBonds;
23577
- if (validAtoms.length === 0 && validBonds.length === 0) {
23605
+ validBonds = _getValidInputOnly.validBonds,
23606
+ validRgroupAttachmentPoints = _getValidInputOnly.validRgroupAttachmentPoints;
23607
+ if (validAtoms.length === 0 && validBonds.length === 0 && validRgroupAttachmentPoints.length === 0) {
23578
23608
  return;
23579
23609
  }
23580
23610
  createdHighlights.push({
23581
23611
  atoms: validAtoms,
23582
23612
  bonds: validBonds,
23613
+ rgroupAttachmentPoints: validRgroupAttachmentPoints,
23583
23614
  color: color
23584
23615
  });
23585
23616
  });
@@ -23595,15 +23626,19 @@ var Highlighter = function () {
23595
23626
  }]);
23596
23627
  return Highlighter;
23597
23628
  }();
23598
- function getValidInputOnly(struct, atoms, bonds) {
23629
+ function getValidInputOnly(struct, atoms, bonds, rgroupAttachmentPoints) {
23599
23630
  if (!Array.isArray(atoms)) {
23600
23631
  atoms = [];
23601
23632
  }
23602
23633
  if (!Array.isArray(bonds)) {
23603
23634
  bonds = [];
23604
23635
  }
23636
+ if (!Array.isArray(rgroupAttachmentPoints)) {
23637
+ rgroupAttachmentPoints = [];
23638
+ }
23605
23639
  var structAtoms = struct.atoms,
23606
- structBonds = struct.bonds;
23640
+ structBonds = struct.bonds,
23641
+ structRgroupAttachmentPoints = struct.rgroupAttachmentPoints;
23607
23642
  if (atoms.length > 0) {
23608
23643
  atoms = atoms.filter(function (aid) {
23609
23644
  return structAtoms.has(aid);
@@ -23614,9 +23649,15 @@ function getValidInputOnly(struct, atoms, bonds) {
23614
23649
  return structBonds.has(bid);
23615
23650
  });
23616
23651
  }
23652
+ if (rgroupAttachmentPoints.length > 0) {
23653
+ rgroupAttachmentPoints = rgroupAttachmentPoints.filter(function (rgroupAPId) {
23654
+ return structRgroupAttachmentPoints.has(rgroupAPId);
23655
+ });
23656
+ }
23617
23657
  return {
23618
23658
  validAtoms: atoms,
23619
- validBonds: bonds
23659
+ validBonds: bonds,
23660
+ validRgroupAttachmentPoints: rgroupAttachmentPoints
23620
23661
  };
23621
23662
  }
23622
23663
 
@@ -24402,7 +24443,7 @@ function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedec
24402
24443
  function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
24403
24444
  var SCALE = ketcherCore.provideEditorSettings().microModeScale;
24404
24445
  var HISTORY_SIZE = 32;
24405
- var structObjects = ['atoms', 'bonds', 'frags', 'sgroups', 'sgroupData', 'rgroups', 'rxnArrows', 'rxnPluses', 'enhancedFlags', 'simpleObjects', 'texts', ketcherCore.IMAGE_KEY, ketcherCore.MULTITAIL_ARROW_KEY];
24446
+ var structObjects = ['atoms', 'bonds', 'frags', 'sgroups', 'sgroupData', 'rgroups', 'rxnArrows', 'rxnPluses', 'enhancedFlags', 'simpleObjects', 'texts', 'rgroupAttachmentPoints', ketcherCore.IMAGE_KEY, ketcherCore.MULTITAIL_ARROW_KEY];
24406
24447
  var highlightTargets = ['atoms', 'bonds', 'rxnArrows', 'rxnPluses', 'functionalGroups', 'frags', 'merge', 'rgroups', 'rgroupAttachmentPoints', 'sgroups', 'sgroupData', 'enhancedFlags', 'simpleObjects', 'texts', ketcherCore.IMAGE_KEY, ketcherCore.MULTITAIL_ARROW_KEY];
24407
24448
  function selectStereoFlagsIfNecessary(atoms, expAtoms) {
24408
24449
  var atomsOfFragments = {};
@@ -24646,21 +24687,13 @@ var Editor$3 = function () {
24646
24687
  if (arguments.length === 0) {
24647
24688
  return this._selection;
24648
24689
  }
24649
- var struct = this.struct();
24650
24690
  var ReStruct = this.render.ctab;
24651
24691
  var selectAll = false;
24652
24692
  this._selection = null;
24653
24693
  if (ci === 'all') {
24654
24694
  selectAll = true;
24655
24695
  ci = structObjects.reduce(function (res, key) {
24656
- var restructItemsIds = Array.from(ReStruct[key].keys());
24657
- restructItemsIds = restructItemsIds.filter(function (restructItemId) {
24658
- return !struct.isTargetFromMacromolecule({
24659
- map: key,
24660
- id: restructItemId
24661
- });
24662
- });
24663
- res[key] = restructItemsIds;
24696
+ res[key] = Array.from(ReStruct[key].keys());
24664
24697
  return res;
24665
24698
  }, {});
24666
24699
  }
@@ -25583,15 +25616,20 @@ var AtomMenuItems = function AtomMenuItems(props) {
25583
25616
  var atomIds = ((_props$propsFromTrigg6 = props.propsFromTrigger) === null || _props$propsFromTrigg6 === void 0 ? void 0 : _props$propsFromTrigg6.atomIds) || [];
25584
25617
  editor.highlights.create({
25585
25618
  atoms: atomIds,
25619
+ rgroupAttachmentPoints: [],
25586
25620
  bonds: [],
25587
25621
  color: color === '' ? 'transparent' : color
25588
25622
  });
25589
25623
  };
25590
25624
  if (isAtomSuperatomLeavingGroup && onlyOneAtomSelected) {
25591
- return jsxRuntime.jsx(reactContexify.Item, _objectSpread$O(_objectSpread$O({}, props), {}, {
25592
- onClick: handleDelete,
25593
- children: "Delete"
25594
- }));
25625
+ return jsxRuntime.jsxs(jsxRuntime.Fragment, {
25626
+ children: [jsxRuntime.jsx(HighlightMenu, {
25627
+ onHighlight: highlightAtomWithColor
25628
+ }), jsxRuntime.jsx(reactContexify.Item, _objectSpread$O(_objectSpread$O({}, props), {}, {
25629
+ onClick: handleDelete,
25630
+ children: "Delete"
25631
+ }))]
25632
+ });
25595
25633
  }
25596
25634
  return jsxRuntime.jsxs(jsxRuntime.Fragment, {
25597
25635
  children: [jsxRuntime.jsx(reactContexify.Item, _objectSpread$O(_objectSpread$O({}, props), {}, {
@@ -25705,6 +25743,7 @@ var useBondSGroupAttach = function useBondSGroupAttach() {
25705
25743
  SGroupTool.sgroupDialog(editor, null);
25706
25744
  }, [getKetcherInstance]);
25707
25745
  var hidden = React.useCallback(function (_ref2) {
25746
+ var _struct$sgroups$get;
25708
25747
  var props = _ref2.props;
25709
25748
  var editor = getKetcherInstance().editor;
25710
25749
  var struct = editor.render.ctab;
@@ -25714,6 +25753,12 @@ var useBondSGroupAttach = function useBondSGroupAttach() {
25714
25753
  }
25715
25754
  var bond = struct.bonds.get(bondIds[0]);
25716
25755
  var attachedSGroups = bond.b.getAttachedSGroups(struct.molecule);
25756
+ var _attachedSGroups = _slicedToArray__default["default"](attachedSGroups, 1),
25757
+ sgGroupId = _attachedSGroups[0];
25758
+ var sgroup = (_struct$sgroups$get = struct.sgroups.get(sgGroupId)) === null || _struct$sgroups$get === void 0 ? void 0 : _struct$sgroups$get.item;
25759
+ if (sgroup !== null && sgroup !== void 0 && sgroup.isSuperatomWithoutLabel) {
25760
+ return false;
25761
+ }
25717
25762
  return attachedSGroups.size > 0;
25718
25763
  }, [getKetcherInstance]);
25719
25764
  return [handler, hidden];
@@ -25741,8 +25786,17 @@ var useBondSGroupEdit = function useBondSGroupEdit() {
25741
25786
  return sGroupsRef.current.size > 1;
25742
25787
  }, [getKetcherInstance]);
25743
25788
  var hidden = React.useCallback(function () {
25789
+ var _struct$sgroups$get;
25790
+ var editor = getKetcherInstance().editor;
25791
+ var struct = editor.render.ctab;
25792
+ var _sGroupsRef$current = _slicedToArray__default["default"](sGroupsRef.current, 1),
25793
+ sgGroupId = _sGroupsRef$current[0];
25794
+ var sgroup = (_struct$sgroups$get = struct.sgroups.get(sgGroupId)) === null || _struct$sgroups$get === void 0 ? void 0 : _struct$sgroups$get.item;
25795
+ if (sgroup !== null && sgroup !== void 0 && sgroup.isSuperatomWithoutLabel) {
25796
+ return true;
25797
+ }
25744
25798
  return sGroupsRef.current.size === 0;
25745
- }, []);
25799
+ }, [getKetcherInstance]);
25746
25800
  return [handler, disabled, hidden];
25747
25801
  };
25748
25802
 
@@ -25858,6 +25912,7 @@ var BondMenuItems = function BondMenuItems(props) {
25858
25912
  editor.highlights.create({
25859
25913
  atoms: [],
25860
25914
  bonds: bondIds,
25915
+ rgroupAttachmentPoints: [],
25861
25916
  color: color === '' ? 'transparent' : color
25862
25917
  });
25863
25918
  };
@@ -26048,12 +26103,14 @@ var SelectionMenuItems = function SelectionMenuItems(props) {
26048
26103
  atomStereoDisabled = _useAtomStereo2[1];
26049
26104
  var handleDelete = useDelete$1();
26050
26105
  var highlightBondWithColor = function highlightBondWithColor(color) {
26051
- var _props$propsFromTrigg, _props$propsFromTrigg2;
26106
+ var _props$propsFromTrigg, _props$propsFromTrigg2, _props$propsFromTrigg3;
26052
26107
  var bondIds = ((_props$propsFromTrigg = props.propsFromTrigger) === null || _props$propsFromTrigg === void 0 ? void 0 : _props$propsFromTrigg.bondIds) || [];
26053
26108
  var atomIds = ((_props$propsFromTrigg2 = props.propsFromTrigger) === null || _props$propsFromTrigg2 === void 0 ? void 0 : _props$propsFromTrigg2.atomIds) || [];
26109
+ var rgroupAttachmentPoints = ((_props$propsFromTrigg3 = props.propsFromTrigger) === null || _props$propsFromTrigg3 === void 0 ? void 0 : _props$propsFromTrigg3.rgroupAttachmentPoints) || [];
26054
26110
  editor.highlights.create({
26055
26111
  atoms: atomIds,
26056
26112
  bonds: bondIds,
26113
+ rgroupAttachmentPoints: rgroupAttachmentPoints,
26057
26114
  color: color === '' ? 'transparent' : color
26058
26115
  });
26059
26116
  };
@@ -26175,19 +26232,34 @@ var useRGroupAttachmentPointEdit = function useRGroupAttachmentPointEdit() {
26175
26232
  function ownKeys$K(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
26176
26233
  function _objectSpread$K(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$K(Object(t), !0).forEach(function (r) { _defineProperty__default["default"](e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$K(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
26177
26234
  var RGroupAttachmentPointMenuItems = function RGroupAttachmentPointMenuItems(props) {
26235
+ var _useAppContext = useAppContext(),
26236
+ getKetcherInstance = _useAppContext.getKetcherInstance;
26178
26237
  var handleRemove = useDelete();
26179
26238
  var _useRGroupAttachmentP = useRGroupAttachmentPointEdit(),
26180
26239
  _useRGroupAttachmentP2 = _slicedToArray__default["default"](_useRGroupAttachmentP, 3),
26181
26240
  handleEditRGroupAttachmentPoint = _useRGroupAttachmentP2[0],
26182
26241
  rgroupAttachmentPointDisabled = _useRGroupAttachmentP2[1],
26183
26242
  rgroupAttachmentPointHidden = _useRGroupAttachmentP2[2];
26243
+ var editor = getKetcherInstance().editor;
26244
+ var highlight = function highlight(color) {
26245
+ var _props$propsFromTrigg;
26246
+ var rgroupAttachmentPoints = ((_props$propsFromTrigg = props.propsFromTrigger) === null || _props$propsFromTrigg === void 0 ? void 0 : _props$propsFromTrigg.rgroupAttachmentPoints) || [];
26247
+ editor.highlights.create({
26248
+ rgroupAttachmentPoints: rgroupAttachmentPoints,
26249
+ atoms: [],
26250
+ bonds: [],
26251
+ color: color === '' ? 'transparent' : color
26252
+ });
26253
+ };
26184
26254
  return jsxRuntime.jsxs(jsxRuntime.Fragment, {
26185
26255
  children: [jsxRuntime.jsx(reactContexify.Item, _objectSpread$K(_objectSpread$K({}, props), {}, {
26186
26256
  disabled: rgroupAttachmentPointDisabled,
26187
26257
  hidden: rgroupAttachmentPointHidden,
26188
26258
  onClick: handleEditRGroupAttachmentPoint,
26189
26259
  children: "Edit..."
26190
- })), jsxRuntime.jsx(reactContexify.Item, _objectSpread$K(_objectSpread$K({}, props), {}, {
26260
+ })), jsxRuntime.jsx(HighlightMenu, {
26261
+ onHighlight: highlight
26262
+ }), jsxRuntime.jsx(reactContexify.Item, _objectSpread$K(_objectSpread$K({}, props), {}, {
26191
26263
  onClick: handleRemove,
26192
26264
  children: "Remove"
26193
26265
  }))]
@@ -26291,10 +26363,14 @@ var useMonomerExpansionHandlers = function useMonomerExpansionHandlers() {
26291
26363
  function ownKeys$I(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
26292
26364
  function _objectSpread$I(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$I(Object(t), !0).forEach(function (r) { _defineProperty__default["default"](e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$I(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
26293
26365
  var MacromoleculeMenuItems = function MacromoleculeMenuItems(props) {
26366
+ var _props$propsFromTrigg;
26294
26367
  var _useMonomerExpansionH = useMonomerExpansionHandlers(),
26295
26368
  _useMonomerExpansionH2 = _slicedToArray__default["default"](_useMonomerExpansionH, 2),
26296
26369
  action = _useMonomerExpansionH2[0],
26297
26370
  _hidden = _useMonomerExpansionH2[1];
26371
+ var multipleMonomersSelected = (props === null || props === void 0 || (_props$propsFromTrigg = props.propsFromTrigger) === null || _props$propsFromTrigg === void 0 ? void 0 : _props$propsFromTrigg.functionalGroups) && props.propsFromTrigger.functionalGroups.length > 1;
26372
+ var expandText = multipleMonomersSelected ? 'Expand monomers' : 'Expand monomer';
26373
+ var collapseText = multipleMonomersSelected ? 'Collapse monomers' : 'Collapse monomer';
26298
26374
  return jsxRuntime.jsxs(jsxRuntime.Fragment, {
26299
26375
  children: [jsxRuntime.jsx(reactContexify.Item, _objectSpread$I(_objectSpread$I({}, props), {}, {
26300
26376
  hidden: function hidden(params) {
@@ -26303,7 +26379,7 @@ var MacromoleculeMenuItems = function MacromoleculeMenuItems(props) {
26303
26379
  onClick: function onClick(params) {
26304
26380
  return action(params, true);
26305
26381
  },
26306
- children: "Expand monomer"
26382
+ children: expandText
26307
26383
  })), jsxRuntime.jsx(reactContexify.Item, _objectSpread$I(_objectSpread$I({}, props), {}, {
26308
26384
  hidden: function hidden(params) {
26309
26385
  return _hidden(params, false);
@@ -26311,7 +26387,7 @@ var MacromoleculeMenuItems = function MacromoleculeMenuItems(props) {
26311
26387
  onClick: function onClick(params) {
26312
26388
  return action(params, false);
26313
26389
  },
26314
- children: "Collapse monomer"
26390
+ children: collapseText
26315
26391
  }))]
26316
26392
  });
26317
26393
  };
@@ -26474,24 +26550,46 @@ function getMenuPropsForClosestItem(editor, closestItem) {
26474
26550
  case 'bonds':
26475
26551
  {
26476
26552
  var functionalGroup = ketcherCore.FunctionalGroup.findFunctionalGroupByBond(struct, struct.functionalGroups, closestItem.id, true);
26477
- return functionalGroup === null || functionalGroup !== null && functionalGroup !== void 0 && functionalGroup.relatedSGroup.isSuperatomWithoutLabel ? {
26478
- id: CONTEXT_MENU_ID.FOR_BONDS,
26479
- bondIds: [closestItem.id]
26480
- } : {
26481
- id: CONTEXT_MENU_ID.FOR_FUNCTIONAL_GROUPS,
26482
- functionalGroups: [functionalGroup]
26483
- };
26553
+ var noFunctionalGroup = functionalGroup === null || (functionalGroup === null || functionalGroup === void 0 ? void 0 : functionalGroup.relatedSGroup.isSuperatomWithoutLabel);
26554
+ var isMonomer = (functionalGroup === null || functionalGroup === void 0 ? void 0 : functionalGroup.relatedSGroup) instanceof ketcherCore.MonomerMicromolecule;
26555
+ if (noFunctionalGroup) {
26556
+ return {
26557
+ id: CONTEXT_MENU_ID.FOR_BONDS,
26558
+ bondIds: [closestItem.id]
26559
+ };
26560
+ } else if (isMonomer) {
26561
+ return {
26562
+ id: CONTEXT_MENU_ID.FOR_MACROMOLECULE,
26563
+ functionalGroups: [functionalGroup]
26564
+ };
26565
+ } else {
26566
+ return {
26567
+ id: CONTEXT_MENU_ID.FOR_FUNCTIONAL_GROUPS,
26568
+ functionalGroups: [functionalGroup]
26569
+ };
26570
+ }
26484
26571
  }
26485
26572
  case 'atoms':
26486
26573
  {
26487
26574
  var _functionalGroup = ketcherCore.FunctionalGroup.findFunctionalGroupByAtom(struct.functionalGroups, closestItem.id, true);
26488
- return _functionalGroup === null || _functionalGroup !== null && _functionalGroup !== void 0 && _functionalGroup.relatedSGroup.isSuperatomWithoutLabel ? {
26489
- id: CONTEXT_MENU_ID.FOR_ATOMS,
26490
- atomIds: [closestItem.id]
26491
- } : {
26492
- id: CONTEXT_MENU_ID.FOR_FUNCTIONAL_GROUPS,
26493
- functionalGroups: [_functionalGroup]
26494
- };
26575
+ var _noFunctionalGroup = _functionalGroup === null || (_functionalGroup === null || _functionalGroup === void 0 ? void 0 : _functionalGroup.relatedSGroup.isSuperatomWithoutLabel);
26576
+ var _isMonomer = (_functionalGroup === null || _functionalGroup === void 0 ? void 0 : _functionalGroup.relatedSGroup) instanceof ketcherCore.MonomerMicromolecule;
26577
+ if (_noFunctionalGroup) {
26578
+ return {
26579
+ id: CONTEXT_MENU_ID.FOR_ATOMS,
26580
+ atomIds: [closestItem.id]
26581
+ };
26582
+ } else if (_isMonomer) {
26583
+ return {
26584
+ id: CONTEXT_MENU_ID.FOR_MACROMOLECULE,
26585
+ functionalGroups: [_functionalGroup]
26586
+ };
26587
+ } else {
26588
+ return {
26589
+ id: CONTEXT_MENU_ID.FOR_FUNCTIONAL_GROUPS,
26590
+ functionalGroups: [_functionalGroup]
26591
+ };
26592
+ }
26495
26593
  }
26496
26594
  case 'sgroups':
26497
26595
  case 'functionalGroups':
@@ -26572,7 +26670,8 @@ function getMenuPropsForSelection(selection, selectedFunctionalGroups) {
26572
26670
  return {
26573
26671
  id: CONTEXT_MENU_ID.FOR_SELECTION,
26574
26672
  bondIds: bonds,
26575
- atomIds: atoms
26673
+ atomIds: atoms,
26674
+ rgroupAttachmentPoints: rgroupAttachmentPoints
26576
26675
  };
26577
26676
  }
26578
26677
  }
@@ -26873,16 +26972,17 @@ var InfoPanel = function InfoPanel(props) {
26873
26972
  return isAmbiguousMonomer ? jsxRuntime.jsx(AmbiguousMonomerPreview, {
26874
26973
  preview: {
26875
26974
  type: exports.PreviewType.AmbiguousMonomer,
26876
- monomer: sGroup.monomer.variantMonomerItem,
26877
- style: {
26878
- left: "".concat(clientX - 50, "px"),
26879
- top: calculateAmbiguousMonomerPreviewTop(sGroup.monomer.variantMonomerItem)({
26880
- left: clientX - 50,
26881
- top: clientY - 65,
26882
- bottom: clientY - 25
26883
- }),
26884
- transform: 'translate(-50%, 0)'
26885
- }
26975
+ monomer: sGroup.monomer.variantMonomerItem
26976
+ },
26977
+ style: {
26978
+ position: 'absolute',
26979
+ left: "".concat(clientX - 50, "px"),
26980
+ top: calculateAmbiguousMonomerPreviewTop(sGroup.monomer.variantMonomerItem)({
26981
+ left: clientX - 50,
26982
+ top: clientY - 65,
26983
+ bottom: clientY - 25
26984
+ }),
26985
+ transform: 'translate(-50%, 0)'
26886
26986
  }
26887
26987
  }) : showMolecule ? jsxRuntime.jsx("div", {
26888
26988
  style: {
@@ -34849,8 +34949,8 @@ var KetcherBuilder = function () {
34849
34949
  cleanup = initApp(element, appRoot, staticResourcesUrl, {
34850
34950
  buttons: buttons || {},
34851
34951
  errorHandler: errorHandler || null,
34852
- version: "2.26.0-rc.6" ,
34853
- buildDate: "2024-10-25T09:50:21" ,
34952
+ version: "2.27.0-rc.1" ,
34953
+ buildDate: "2024-11-05T14:46:09" ,
34854
34954
  buildNumber: '',
34855
34955
  customButtons: customButtons || []
34856
34956
  }, structService, resolve, togglerComponent);