diff --git a/ketcher-autotests/playwright.config.ts b/ketcher-autotests/playwright.config.ts index 80ea617695..28eedacfe9 100644 --- a/ketcher-autotests/playwright.config.ts +++ b/ketcher-autotests/playwright.config.ts @@ -63,7 +63,7 @@ function baseURL(): string { const MAX_NUMBER_OF_RETRIES = 2; // const MAX_NUMBER_OF_FAILURES = 3; const isCI = process.env.CI_ENVIRONMENT === 'true'; -var numWorkers = os.cpus().length; +let numWorkers = os.cpus().length; if (process.env.NUM_WORKERS) { numWorkers = Number(process.env.NUM_WORKERS); } diff --git a/ketcher-autotests/tests/Macromolecule-editor/Copy-And-Paste/sequence-mode-copy-paste.spec.ts-snapshots/Sequence-edit-mode-After-pasting-between-two-n-4b8dc-pasted-fragment-is-merged-with-existing-chain-1-chromium-linux.png b/ketcher-autotests/tests/Macromolecule-editor/Copy-And-Paste/sequence-mode-copy-paste.spec.ts-snapshots/Sequence-edit-mode-After-pasting-between-two-n-4b8dc-pasted-fragment-is-merged-with-existing-chain-1-chromium-linux.png index ffc07ff24c..01e4dff69c 100644 Binary files a/ketcher-autotests/tests/Macromolecule-editor/Copy-And-Paste/sequence-mode-copy-paste.spec.ts-snapshots/Sequence-edit-mode-After-pasting-between-two-n-4b8dc-pasted-fragment-is-merged-with-existing-chain-1-chromium-linux.png and b/ketcher-autotests/tests/Macromolecule-editor/Copy-And-Paste/sequence-mode-copy-paste.spec.ts-snapshots/Sequence-edit-mode-After-pasting-between-two-n-4b8dc-pasted-fragment-is-merged-with-existing-chain-1-chromium-linux.png differ diff --git a/ketcher-autotests/tests/Macromolecule-editor/Copy-And-Paste/sequence-mode-copy-paste.spec.ts-snapshots/Sequence-mode-copy-paste-for-edit-mode-Copy-paste-selection-with-LClick-drag-and-undo-2-chromium-linux.png b/ketcher-autotests/tests/Macromolecule-editor/Copy-And-Paste/sequence-mode-copy-paste.spec.ts-snapshots/Sequence-mode-copy-paste-for-edit-mode-Copy-paste-selection-with-LClick-drag-and-undo-2-chromium-linux.png index f1ef6d1ae1..1088f1fbff 100644 Binary files a/ketcher-autotests/tests/Macromolecule-editor/Copy-And-Paste/sequence-mode-copy-paste.spec.ts-snapshots/Sequence-mode-copy-paste-for-edit-mode-Copy-paste-selection-with-LClick-drag-and-undo-2-chromium-linux.png and b/ketcher-autotests/tests/Macromolecule-editor/Copy-And-Paste/sequence-mode-copy-paste.spec.ts-snapshots/Sequence-mode-copy-paste-for-edit-mode-Copy-paste-selection-with-LClick-drag-and-undo-2-chromium-linux.png differ diff --git a/packages/ketcher-core/src/application/editor/modes/SequenceMode.ts b/packages/ketcher-core/src/application/editor/modes/SequenceMode.ts index afebe22d5c..24ea7d2018 100644 --- a/packages/ketcher-core/src/application/editor/modes/SequenceMode.ts +++ b/packages/ketcher-core/src/application/editor/modes/SequenceMode.ts @@ -1040,8 +1040,7 @@ export class SequenceMode extends BaseMode { const currentSequence = SequenceRenderer.currentChain; const currentSequenceHasPhosphate = - currentSequence?.lastNonEmptyNode?.monomer?.monomerItem?.props?.Name === - 'Phosphate'; + currentSequence?.lastNonEmptyNode?.monomer?.isPhosphate; let nextCaretPosition = SequenceRenderer.caretPosition + chainsCollection.length; @@ -1050,6 +1049,13 @@ export class SequenceMode extends BaseMode { nextCaretPosition -= 1; } + const hasPhosphateAtChainEnd = + chainsCollection?.lastNode?.monomer?.isPhosphate; + + if (!SequenceRenderer.isCaretAtChainEnd && hasPhosphateAtChainEnd) { + nextCaretPosition -= 1; + } + const modelChanges = this.insertNewSequenceFragment(chainsCollection); modelChanges.addOperation(new ReinitializeModeOperation()); diff --git a/packages/ketcher-core/src/application/render/renderers/sequence/SequenceRenderer.ts b/packages/ketcher-core/src/application/render/renderers/sequence/SequenceRenderer.ts index 48f9448f73..02de9ed942 100644 --- a/packages/ketcher-core/src/application/render/renderers/sequence/SequenceRenderer.ts +++ b/packages/ketcher-core/src/application/render/renderers/sequence/SequenceRenderer.ts @@ -945,4 +945,8 @@ export class SequenceRenderer { SequenceRenderer.chainsCollection.firstNode instanceof EmptySequenceNode ); } + + public static get isCaretAtChainEnd() { + return SequenceRenderer.currentEdittingNode instanceof EmptySequenceNode; + } } diff --git a/packages/ketcher-core/src/domain/entities/BaseMonomer.ts b/packages/ketcher-core/src/domain/entities/BaseMonomer.ts index 6b9f4ede91..1c686bee69 100644 --- a/packages/ketcher-core/src/domain/entities/BaseMonomer.ts +++ b/packages/ketcher-core/src/domain/entities/BaseMonomer.ts @@ -13,6 +13,7 @@ import assert from 'assert'; import { IKetAttachmentPoint, IKetAttachmentPointType, + KetMonomerClass, } from 'application/formatters/types/ket'; import { RnaSubChain } from 'domain/entities/monomer-chains/RnaSubChain'; import { ChemSubChain } from 'domain/entities/monomer-chains/ChemSubChain'; @@ -329,6 +330,10 @@ export abstract class BaseMonomer extends DrawingEntity { return this.attachmentPointsToBonds[attachmentPointName] !== undefined; } + public get isPhosphate() { + return this.monomerItem?.props?.MonomerClass === KetMonomerClass.Phosphate; + } + public get usedAttachmentPointsNamesList() { const list: AttachmentPointName[] = [];