From 4e5df658616ae336307f00d85641c17c026ae2b1 Mon Sep 17 00:00:00 2001 From: Daniil Sloboda Date: Wed, 2 Oct 2024 17:14:08 +0400 Subject: [PATCH] #5296 - Save Support for RDF Format (#5608) * #5296 - Implemented save to rdf, fixed view only 3d mode * #5296 - reverted indigo version * #5296 - updated test snapshot --- .../multi-tailed-arrow-tool.spec.ts | 2 +- ...te-button-is-disabled-1-chromium-linux.png | Bin 22013 -> 22067 bytes .../formatters/formatProperties.ts | 12 +++++++++++ .../formatters/structFormatter.types.ts | 2 ++ .../src/domain/entities/struct.ts | 4 ++++ .../services/struct/structService.types.ts | 1 + .../src/script/ui/action/server.js | 1 + .../modal/components/document/Save/Save.jsx | 5 ++++- .../document/Save/Save.test.utils.tsx | 1 + .../Save/__snapshots__/Save.test.tsx.snap | 20 ++++++++++++++++++ .../modal/components/process/Miew/Miew.tsx | 12 +++++++++-- .../services/struct/indigoWorker.types.ts | 1 + .../struct/standaloneStructService.ts | 3 +++ 13 files changed, 60 insertions(+), 4 deletions(-) diff --git a/ketcher-autotests/tests/Reactions/Reaction-tools/Multi-Tailed-Arrow-Tool/multi-tailed-arrow-tool.spec.ts b/ketcher-autotests/tests/Reactions/Reaction-tools/Multi-Tailed-Arrow-Tool/multi-tailed-arrow-tool.spec.ts index d27690d4b7..8072e05f0a 100644 --- a/ketcher-autotests/tests/Reactions/Reaction-tools/Multi-Tailed-Arrow-Tool/multi-tailed-arrow-tool.spec.ts +++ b/ketcher-autotests/tests/Reactions/Reaction-tools/Multi-Tailed-Arrow-Tool/multi-tailed-arrow-tool.spec.ts @@ -996,7 +996,7 @@ test.describe('Multi-Tailed Arrow Tool', () => { await selectTopPanelButton(TopPanelButton.Save, page); await expect(page.getByText('Save to Templates')).toBeDisabled(); await takeEditorScreenshot(page, { - masks: [page.getByTestId('mol-preview-area-text')], + masks: [page.getByTestId('rxn-preview-area-text')], }); }); diff --git a/ketcher-autotests/tests/Reactions/Reaction-tools/Multi-Tailed-Arrow-Tool/multi-tailed-arrow-tool.spec.ts-snapshots/Multi-Tailed-Arrow-Tool-Verify-that-Multi-Tail-ee4f5-plate---Save-to-Template-button-is-disabled-1-chromium-linux.png b/ketcher-autotests/tests/Reactions/Reaction-tools/Multi-Tailed-Arrow-Tool/multi-tailed-arrow-tool.spec.ts-snapshots/Multi-Tailed-Arrow-Tool-Verify-that-Multi-Tail-ee4f5-plate---Save-to-Template-button-is-disabled-1-chromium-linux.png index 6a664d6ec14cde52dda1453c5486d162eb8f41df..b41ced9d145175659e4c9b25edb1b6351220e453 100644 GIT binary patch literal 22067 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 diff --git a/packages/ketcher-core/src/application/formatters/formatProperties.ts b/packages/ketcher-core/src/application/formatters/formatProperties.ts index 263adea110..63bdd10af9 100644 --- a/packages/ketcher-core/src/application/formatters/formatProperties.ts +++ b/packages/ketcher-core/src/application/formatters/formatProperties.ts @@ -157,6 +157,18 @@ const formatProperties: FormatPropertiesMap = { ['.'], true, ), + rdf: new SupportedFormatProperties( + 'RDF V2000', + ChemicalMimeType.RDF, + ['.rdf'], + true, + ), + rdfV3000: new SupportedFormatProperties( + 'RDF V3000', + ChemicalMimeType.RDF, + ['.rdf'], + true, + ), }; const imgFormatProperties = { diff --git a/packages/ketcher-core/src/application/formatters/structFormatter.types.ts b/packages/ketcher-core/src/application/formatters/structFormatter.types.ts index be8e91fff0..13429edb00 100644 --- a/packages/ketcher-core/src/application/formatters/structFormatter.types.ts +++ b/packages/ketcher-core/src/application/formatters/structFormatter.types.ts @@ -54,6 +54,8 @@ export enum SupportedFormat { idt = 'idt', helm = 'helm', unknown = 'unknown', + rdf = 'rdf', + rdfV3000 = 'rdfV3000', } export type FormatterFactoryOptions = Partial< diff --git a/packages/ketcher-core/src/domain/entities/struct.ts b/packages/ketcher-core/src/domain/entities/struct.ts index 03a22380d0..cdfeaa10a3 100644 --- a/packages/ketcher-core/src/domain/entities/struct.ts +++ b/packages/ketcher-core/src/domain/entities/struct.ts @@ -114,6 +114,10 @@ export class Struct { return this.rxnArrows.size >= 1; } + hasMultitailArrow(): boolean { + return this.multitailArrows.size >= 1; + } + hasRxnPluses(): boolean { return this.rxnPluses.size > 0; } diff --git a/packages/ketcher-core/src/domain/services/struct/structService.types.ts b/packages/ketcher-core/src/domain/services/struct/structService.types.ts index 31e6acce45..691935cc06 100644 --- a/packages/ketcher-core/src/domain/services/struct/structService.types.ts +++ b/packages/ketcher-core/src/domain/services/struct/structService.types.ts @@ -36,6 +36,7 @@ export enum ChemicalMimeType { PEPTIDE = 'chemical/x-peptide-sequence', IDT = 'chemical/x-idt', HELM = 'chemical/x-helm', + RDF = 'chemical/x-rdf', } export interface WithStruct { diff --git a/packages/ketcher-react/src/script/ui/action/server.js b/packages/ketcher-react/src/script/ui/action/server.js index 669aaded0d..f63743e4af 100644 --- a/packages/ketcher-react/src/script/ui/action/server.js +++ b/packages/ketcher-react/src/script/ui/action/server.js @@ -89,6 +89,7 @@ const config = { }, miew: { title: '3D Viewer', + enabledInViewOnly: true, action: { dialog: 'miew' }, hidden: (options) => isHidden(options, 'miew'), }, diff --git a/packages/ketcher-react/src/script/ui/views/modal/components/document/Save/Save.jsx b/packages/ketcher-react/src/script/ui/views/modal/components/document/Save/Save.jsx index b07a06520e..dcc4bc89fc 100644 --- a/packages/ketcher-react/src/script/ui/views/modal/components/document/Save/Save.jsx +++ b/packages/ketcher-react/src/script/ui/views/modal/components/document/Save/Save.jsx @@ -78,7 +78,8 @@ class SaveDialog extends Component { tabIndex: 0, isLoading: true, }; - this.isRxn = this.props.struct.hasRxnArrow(); + this.isRxn = + this.props.struct.hasRxnArrow() || this.props.struct.hasMultitailArrow(); this.textAreaRef = createRef(); const formats = !this.props.server @@ -89,6 +90,8 @@ class SaveDialog extends Component { this.isRxn ? 'rxnV3000' : 'molV3000', 'sdf', 'sdfV3000', + 'rdf', + 'rdfV3000', 'smarts', 'smiles', 'smilesExt', diff --git a/packages/ketcher-react/src/script/ui/views/modal/components/document/Save/Save.test.utils.tsx b/packages/ketcher-react/src/script/ui/views/modal/components/document/Save/Save.test.utils.tsx index 5e314edbf7..fb7133cf69 100644 --- a/packages/ketcher-react/src/script/ui/views/modal/components/document/Save/Save.test.utils.tsx +++ b/packages/ketcher-react/src/script/ui/views/modal/components/document/Save/Save.test.utils.tsx @@ -20,6 +20,7 @@ const initialState = { editor: { struct: () => ({ hasRxnArrow: () => false, + hasMultitailArrow: () => false, isBlank: () => true, atoms: { size: 0 }, bonds: { size: 0 }, diff --git a/packages/ketcher-react/src/script/ui/views/modal/components/document/Save/__snapshots__/Save.test.tsx.snap b/packages/ketcher-react/src/script/ui/views/modal/components/document/Save/__snapshots__/Save.test.tsx.snap index b489eb67fe..fa47c74c78 100644 --- a/packages/ketcher-react/src/script/ui/views/modal/components/document/Save/__snapshots__/Save.test.tsx.snap +++ b/packages/ketcher-react/src/script/ui/views/modal/components/document/Save/__snapshots__/Save.test.tsx.snap @@ -242,6 +242,26 @@ Object { > SDF V3000 +
  • + RDF V2000 +
  • +
  • + RDF V3000 +
  • { const miewRef = useRef(); const [isInitialized, setIsIsInitialized] = useState(false); + const ketcher = ketcherProvider.getKetcher(); + + const isDisabled = useMemo(() => { + return ( + !isInitialized || ketcher?.editor.render.options.viewOnlyMode === true + ); + }, [ketcher, isInitialized]); const onMiewInit = useCallback( (miew: MiewAsType) => { @@ -163,7 +171,7 @@ const MiewDialog = ({ key="apply" onClick={exportCML} className={classes.applyButton} - disabled={!isInitialized} + disabled={isDisabled} data-testid="miew-modal-button" > Apply diff --git a/packages/ketcher-standalone/src/infrastructure/services/struct/indigoWorker.types.ts b/packages/ketcher-standalone/src/infrastructure/services/struct/indigoWorker.types.ts index aac28fe4d5..3717ef3dbd 100644 --- a/packages/ketcher-standalone/src/infrastructure/services/struct/indigoWorker.types.ts +++ b/packages/ketcher-standalone/src/infrastructure/services/struct/indigoWorker.types.ts @@ -68,6 +68,7 @@ export enum SupportedFormat { SEQUENCE = 'sequence', IDT = 'idt', HELM = 'helm', + RDF = 'rdf', } export interface WithStruct { diff --git a/packages/ketcher-standalone/src/infrastructure/services/struct/standaloneStructService.ts b/packages/ketcher-standalone/src/infrastructure/services/struct/standaloneStructService.ts index 39fec01798..25a20d21f8 100644 --- a/packages/ketcher-standalone/src/infrastructure/services/struct/standaloneStructService.ts +++ b/packages/ketcher-standalone/src/infrastructure/services/struct/standaloneStructService.ts @@ -150,6 +150,9 @@ function convertMimeTypeToOutputFormat( format = SupportedFormat.HELM; break; } + case ChemicalMimeType.RDF: + format = SupportedFormat.RDF; + break; case ChemicalMimeType.UNKNOWN: default: { throw new Error('Unsupported chemical mime type');