ketcher-macromolecules 2.21.0-rc.2 → 2.21.0

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
@@ -497,10 +497,12 @@ var initialState = {
497
497
  sequenceSelectionName: undefined,
498
498
  isSequenceFirstsOnlyNucleotidesSelected: undefined,
499
499
  activePresetMonomerGroup: null,
500
+ groupItemValidations: _defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"]({}, exports.MonomerGroups.BASES, []), exports.MonomerGroups.SUGARS, []), exports.MonomerGroups.PHOSPHATES, []),
500
501
  presets: [],
501
502
  activeRnaBuilderItem: null,
502
503
  isEditMode: false,
503
504
  uniqueNameError: '',
505
+ invalidPresetError: '',
504
506
  activePresetForContextMenu: null
505
507
  };
506
508
  var monomerGroupToPresetGroup = _defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"]({}, exports.MonomerGroups.BASES, 'base'), exports.MonomerGroups.SUGARS, 'sugar'), exports.MonomerGroups.PHOSPHATES, 'phosphate');
@@ -539,6 +541,15 @@ var rnaBuilderSlice = toolkit.createSlice({
539
541
  setActiveRnaBuilderItem: function setActiveRnaBuilderItem(state, action) {
540
542
  state.activeRnaBuilderItem = action.payload;
541
543
  },
544
+ setSugarValidations: function setSugarValidations(state, action) {
545
+ state.groupItemValidations[exports.MonomerGroups.SUGARS] = action.payload;
546
+ },
547
+ setBaseValidations: function setBaseValidations(state, action) {
548
+ state.groupItemValidations[exports.MonomerGroups.BASES] = action.payload;
549
+ },
550
+ setPhosphateValidations: function setPhosphateValidations(state, action) {
551
+ state.groupItemValidations[exports.MonomerGroups.PHOSPHATES] = action.payload;
552
+ },
542
553
  setActivePresetMonomerGroup: function setActivePresetMonomerGroup(state, action) {
543
554
  state.activePresetMonomerGroup = action.payload;
544
555
  },
@@ -573,6 +584,9 @@ var rnaBuilderSlice = toolkit.createSlice({
573
584
  setUniqueNameError: function setUniqueNameError(state, action) {
574
585
  state.uniqueNameError = action.payload;
575
586
  },
587
+ setInvalidPresetError: function setInvalidPresetError(state, action) {
588
+ state.invalidPresetError = action.payload;
589
+ },
576
590
  setDefaultPresets: function setDefaultPresets(state, action) {
577
591
  var defaultNucleotide = action.payload[0];
578
592
  if (!defaultNucleotide) {
@@ -634,6 +648,9 @@ var rnaBuilderSlice = toolkit.createSlice({
634
648
  var selectActiveRnaBuilderItem = function selectActiveRnaBuilderItem(state) {
635
649
  return state.rnaBuilder.activeRnaBuilderItem;
636
650
  };
651
+ var selectGroupItemValidations = function selectGroupItemValidations(state) {
652
+ return state.rnaBuilder.groupItemValidations;
653
+ };
637
654
  var selectActivePreset = function selectActivePreset(state) {
638
655
  return state.rnaBuilder.activePreset;
639
656
  };
@@ -657,7 +674,7 @@ var selectActivePresetMonomerGroup = function selectActivePresetMonomerGroup(sta
657
674
  return state.rnaBuilder.activePresetMonomerGroup;
658
675
  };
659
676
  var selectIsPresetReadyToSave = function selectIsPresetReadyToSave(preset) {
660
- return Boolean((preset.phosphate || preset.sugar || preset.base) && preset.name);
677
+ return Boolean(preset.name && preset.sugar && (preset.base || preset.phosphate));
661
678
  };
662
679
  var selectIsEditMode = function selectIsEditMode(state) {
663
680
  return state.rnaBuilder.isEditMode;
@@ -682,6 +699,9 @@ var selectPresetFullName = function selectPresetFullName(preset) {
682
699
  var selectUniqueNameError = function selectUniqueNameError(state) {
683
700
  return state.rnaBuilder.uniqueNameError;
684
701
  };
702
+ var selectInvalidPresetError = function selectInvalidPresetError(state) {
703
+ return state.rnaBuilder.invalidPresetError;
704
+ };
685
705
  var selectIsActivePresetNewAndEmpty = function selectIsActivePresetNewAndEmpty(state) {
686
706
  var activePreset = state.rnaBuilder.activePreset;
687
707
  return activePreset && !activePreset.presetInList && !activePreset.name && !activePreset.sugar && !activePreset.base && !activePreset.phosphate;
@@ -715,12 +735,16 @@ var _rnaBuilderSlice$acti = rnaBuilderSlice.actions,
715
735
  setIsSequenceFirstsOnlyNucleotidesSelected = _rnaBuilderSlice$acti.setIsSequenceFirstsOnlyNucleotidesSelected;
716
736
  _rnaBuilderSlice$acti.setActivePresetName;
717
737
  var setActiveRnaBuilderItem = _rnaBuilderSlice$acti.setActiveRnaBuilderItem,
738
+ setSugarValidations = _rnaBuilderSlice$acti.setSugarValidations,
739
+ setBaseValidations = _rnaBuilderSlice$acti.setBaseValidations,
740
+ setPhosphateValidations = _rnaBuilderSlice$acti.setPhosphateValidations,
718
741
  setActivePresetMonomerGroup = _rnaBuilderSlice$acti.setActivePresetMonomerGroup,
719
742
  savePreset = _rnaBuilderSlice$acti.savePreset,
720
743
  deletePreset = _rnaBuilderSlice$acti.deletePreset,
721
744
  createNewPreset = _rnaBuilderSlice$acti.createNewPreset,
722
745
  setIsEditMode = _rnaBuilderSlice$acti.setIsEditMode,
723
746
  setUniqueNameError = _rnaBuilderSlice$acti.setUniqueNameError,
747
+ setInvalidPresetError = _rnaBuilderSlice$acti.setInvalidPresetError,
724
748
  setDefaultPresets = _rnaBuilderSlice$acti.setDefaultPresets,
725
749
  setActivePresetForContextMenu = _rnaBuilderSlice$acti.setActivePresetForContextMenu,
726
750
  togglePresetFavorites = _rnaBuilderSlice$acti.togglePresetFavorites,
@@ -1733,6 +1757,23 @@ var MonomerGroup = function MonomerGroup(_ref) {
1733
1757
  var preview = useAppSelector(selectShowPreview);
1734
1758
  var editor = useAppSelector(selectEditor);
1735
1759
  var activeMonomerGroup = useAppSelector(selectActiveRnaBuilderItem);
1760
+ var activeGroupItemValidations = useAppSelector(selectGroupItemValidations);
1761
+ var isMonomerDisabled = function isMonomerDisabled(monomer) {
1762
+ var monomerDisabled = false;
1763
+ if (disabled) {
1764
+ monomerDisabled = disabled;
1765
+ } else {
1766
+ var monomerValidations = activeGroupItemValidations["".concat(monomer.props.MonomerClass, "s")];
1767
+ if ((monomerValidations === null || monomerValidations === void 0 ? void 0 : monomerValidations.length) > 0 && monomer.props.MonomerCaps) {
1768
+ for (var i = 0; i < monomerValidations.length; i++) {
1769
+ if (!(monomerValidations[i] in monomer.props.MonomerCaps)) {
1770
+ monomerDisabled = true;
1771
+ }
1772
+ }
1773
+ }
1774
+ }
1775
+ return monomerDisabled;
1776
+ };
1736
1777
  var _useState = React.useState(null),
1737
1778
  _useState2 = _slicedToArray__default["default"](_useState, 2),
1738
1779
  selectedItemInGroup = _useState2[0],
@@ -1788,7 +1829,7 @@ var MonomerGroup = function MonomerGroup(_ref) {
1788
1829
  children: items.map(function (monomer) {
1789
1830
  var key = monomer.props ? "".concat(monomer.props.MonomerName + monomer.props.Name) : monomer.label;
1790
1831
  return jsxRuntime.jsx(MonomerItem, {
1791
- disabled: disabled,
1832
+ disabled: isMonomerDisabled(monomer),
1792
1833
  item: monomer,
1793
1834
  groupName: groupName,
1794
1835
  isSelected: isMonomerSelected(monomer),
@@ -2027,8 +2068,36 @@ var RnaPresetGroup = function RnaPresetGroup(_ref) {
2027
2068
  }),
2028
2069
  show = _useContextMenu.show;
2029
2070
  var dispatch = reactRedux.useDispatch();
2071
+ var validatePreset = function validatePreset(preset) {
2072
+ var _preset$base, _preset$sugar, _preset$phosphate;
2073
+ var isBaseValid = true;
2074
+ var isSugarValid = true;
2075
+ var isPhosphateValid = true;
2076
+ if (preset !== null && preset !== void 0 && (_preset$base = preset.base) !== null && _preset$base !== void 0 && (_preset$base = _preset$base.props) !== null && _preset$base !== void 0 && _preset$base.MonomerCaps) {
2077
+ isBaseValid = 'R1' in preset.base.props.MonomerCaps;
2078
+ }
2079
+ if (preset !== null && preset !== void 0 && (_preset$sugar = preset.sugar) !== null && _preset$sugar !== void 0 && (_preset$sugar = _preset$sugar.props) !== null && _preset$sugar !== void 0 && _preset$sugar.MonomerCaps) {
2080
+ var _preset$base2;
2081
+ if (isBaseValid && preset !== null && preset !== void 0 && (_preset$base2 = preset.base) !== null && _preset$base2 !== void 0 && (_preset$base2 = _preset$base2.props) !== null && _preset$base2 !== void 0 && _preset$base2.MonomerCaps) {
2082
+ isSugarValid = 'R3' in preset.sugar.props.MonomerCaps;
2083
+ }
2084
+ }
2085
+ if (preset !== null && preset !== void 0 && (_preset$phosphate = preset.phosphate) !== null && _preset$phosphate !== void 0 && (_preset$phosphate = _preset$phosphate.props) !== null && _preset$phosphate !== void 0 && _preset$phosphate.MonomerCaps) {
2086
+ var _preset$sugar2;
2087
+ isPhosphateValid = 'R1' in preset.phosphate.props.MonomerCaps;
2088
+ if (isSugarValid && preset !== null && preset !== void 0 && (_preset$sugar2 = preset.sugar) !== null && _preset$sugar2 !== void 0 && (_preset$sugar2 = _preset$sugar2.props) !== null && _preset$sugar2 !== void 0 && _preset$sugar2.MonomerCaps) {
2089
+ isSugarValid = 'R2' in preset.sugar.props.MonomerCaps;
2090
+ }
2091
+ }
2092
+ return isBaseValid && isSugarValid && isPhosphateValid;
2093
+ };
2030
2094
  var selectPreset = function selectPreset(preset) {
2031
2095
  return function () {
2096
+ var isPresetValid = validatePreset(preset);
2097
+ if (!isPresetValid && preset.name) {
2098
+ dispatch(setInvalidPresetError(preset.name));
2099
+ return;
2100
+ }
2032
2101
  dispatch(setActivePreset(preset));
2033
2102
  editor.events.selectPreset.dispatch(preset);
2034
2103
  if (preset === (activePreset === null || activePreset === void 0 ? void 0 : activePreset.presetInList)) return;
@@ -2815,11 +2884,39 @@ var RnaEditorExpanded = function RnaEditorExpanded(_ref) {
2815
2884
  var selectGroup = function selectGroup(selectedGroup) {
2816
2885
  return function () {
2817
2886
  var selectedRNAPartMonomer = selectCurrentMonomerGroup(newPreset, selectedGroup);
2887
+ var sugarValidaions = [];
2888
+ var phosphateValidaions = [];
2889
+ var baseValidaions = [];
2818
2890
  if (selectedRNAPartMonomer) {
2819
2891
  editor.events.selectMonomer.dispatch(selectedRNAPartMonomer);
2820
2892
  }
2893
+ if (selectedGroup === exports.MonomerGroups.SUGARS) {
2894
+ if (newPreset.phosphate) {
2895
+ sugarValidaions.push('R2');
2896
+ }
2897
+ if (newPreset.base) {
2898
+ sugarValidaions.push('R3');
2899
+ }
2900
+ }
2901
+ if (selectedGroup === exports.MonomerGroups.BASES) {
2902
+ var _newPreset$sugar;
2903
+ baseValidaions.push('R1');
2904
+ if (newPreset !== null && newPreset !== void 0 && (_newPreset$sugar = newPreset.sugar) !== null && _newPreset$sugar !== void 0 && (_newPreset$sugar = _newPreset$sugar.props) !== null && _newPreset$sugar !== void 0 && _newPreset$sugar.MonomerCaps && !('R3' in newPreset.sugar.props.MonomerCaps)) {
2905
+ baseValidaions.push('DISABLED');
2906
+ }
2907
+ }
2908
+ if (selectedGroup === exports.MonomerGroups.PHOSPHATES) {
2909
+ var _newPreset$sugar2;
2910
+ phosphateValidaions.push('R1');
2911
+ if (newPreset !== null && newPreset !== void 0 && (_newPreset$sugar2 = newPreset.sugar) !== null && _newPreset$sugar2 !== void 0 && (_newPreset$sugar2 = _newPreset$sugar2.props) !== null && _newPreset$sugar2 !== void 0 && _newPreset$sugar2.MonomerCaps && !('R2' in newPreset.sugar.props.MonomerCaps)) {
2912
+ phosphateValidaions.push('DISABLED');
2913
+ }
2914
+ }
2821
2915
  scrollToActiveItemInLibrary(selectedGroup);
2822
2916
  dispatch(setActiveRnaBuilderItem(selectedGroup));
2917
+ dispatch(setSugarValidations(sugarValidaions));
2918
+ dispatch(setPhosphateValidations(phosphateValidaions));
2919
+ dispatch(setBaseValidations(baseValidaions));
2823
2920
  };
2824
2921
  };
2825
2922
  var onChangeName = function onChangeName(event) {
@@ -3287,8 +3384,14 @@ var RnaBuilder = function RnaBuilder(_ref) {
3287
3384
  editPreset = _ref.editPreset;
3288
3385
  var dispatch = useAppDispatch();
3289
3386
  var uniqueNameError = useAppSelector(selectUniqueNameError);
3387
+ var invalidPresetError = useAppSelector(selectInvalidPresetError);
3290
3388
  var closeErrorModal = function closeErrorModal() {
3291
- dispatch(setUniqueNameError(''));
3389
+ if (uniqueNameError.length > 0) {
3390
+ dispatch(setUniqueNameError(''));
3391
+ }
3392
+ if (invalidPresetError.length > 0) {
3393
+ dispatch(setInvalidPresetError(''));
3394
+ }
3292
3395
  };
3293
3396
  return jsxRuntime.jsxs(RnaBuilderContainer, {
3294
3397
  children: [jsxRuntime.jsx(RnaEditor, {
@@ -3298,11 +3401,16 @@ var RnaBuilder = function RnaBuilder(_ref) {
3298
3401
  duplicatePreset: duplicatePreset,
3299
3402
  editPreset: editPreset
3300
3403
  }), jsxRuntime.jsxs(Modal, {
3301
- isOpen: !!uniqueNameError,
3404
+ isOpen: !!uniqueNameError || !!invalidPresetError,
3302
3405
  title: "Error Message",
3303
3406
  onClose: closeErrorModal,
3304
- children: [jsxRuntime.jsxs(Modal.Content, {
3305
- children: ["Preset with name \"", uniqueNameError, "\" already exists. Please choose another name."]
3407
+ children: [jsxRuntime.jsx(Modal.Content, {
3408
+ children: jsxRuntime.jsxs("div", {
3409
+ style: {
3410
+ padding: '12px'
3411
+ },
3412
+ children: [uniqueNameError && "Preset with name \"".concat(uniqueNameError, "\" already exists. Please choose another name."), invalidPresetError && "Preset with name \"".concat(invalidPresetError, "\" can't be used. Because it is impossible to establish bonds between monomers. Edit it's structure or choose another one.")]
3413
+ })
3306
3414
  }), jsxRuntime.jsx(Modal.Footer, {
3307
3415
  children: jsxRuntime.jsx(StyledButton$1, {
3308
3416
  onClick: closeErrorModal,