[Fix] Ketcher submission now recognized (#213)

This will hack the ketcher submission to work again (see #207).
The problem seems to be that the iframe loads slower than the script tag so the reference is not available on page load.

Registering from within the code to poll until ketcher is ready is a bit messy.
Tracked the introduced dept in #212.

Reviewed-on: enviPath/enviPy#213
Co-authored-by: Tobias O <tobias.olenyi@envipath.com>
Co-committed-by: Tobias O <tobias.olenyi@envipath.com>
This commit is contained in:
2025-11-13 23:27:29 +13:00
committed by jebus
parent e60052b05c
commit d584791ee8
2 changed files with 90 additions and 10 deletions

View File

@ -258,6 +258,31 @@
<script language="javascript"> <script language="javascript">
var currentPackage = "{{ meta.current_package.url }}"; var currentPackage = "{{ meta.current_package.url }}";
// Helper function to safely get Ketcher instance from iframe
function getKetcherInstance(iframeId) {
const ketcherFrame = document.getElementById(iframeId);
if (!ketcherFrame) {
console.error("Ketcher iframe not found:", iframeId);
return null;
}
try {
if (
"contentWindow" in ketcherFrame &&
ketcherFrame.contentWindow.ketcher
) {
return ketcherFrame.contentWindow.ketcher;
}
} catch (err) {
console.error(
"Cannot access Ketcher iframe - possible CORS issue:",
err,
);
}
return null;
}
// Discourse API integration is now handled by discourse-api.js // Discourse API integration is now handled by discourse-api.js
// Function to render Discourse topics into cards // Function to render Discourse topics into cards
@ -361,11 +386,17 @@
}, 300); }, 300);
// Transfer SMILES from Ketcher to text input if available // Transfer SMILES from Ketcher to text input if available
if (window.indexKetcher && window.indexKetcher.getSmiles) { const ketcher = getKetcherInstance("index-ketcher");
const smiles = window.indexKetcher.getSmiles(); if (ketcher && ketcher.getSmiles) {
try {
const smiles = ketcher.getSmiles();
if (smiles && smiles.trim() !== "") { if (smiles && smiles.trim() !== "") {
$("#index-form-text-input").val(smiles); $("#index-form-text-input").val(smiles);
} }
} catch (err) {
console.error("Failed to sync Ketcher to text input:", err);
// Non-critical error, just log it
}
} }
} }
} }
@ -433,13 +464,32 @@
var textSmiles = ""; var textSmiles = "";
// Check if we're in Ketcher mode and extract SMILES // Check if we're in Ketcher mode and extract SMILES
if ($('input[type="checkbox"]').is(":checked") && window.indexKetcher) { if ($('input[type="checkbox"]').is(":checked")) {
textSmiles = window.indexKetcher.getSmiles().trim(); // Use the robust getter function
const ketcher = getKetcherInstance("index-ketcher");
if (ketcher && ketcher.getSmiles) {
try {
textSmiles = ketcher.getSmiles().trim();
} catch (err) {
console.error("Failed to get SMILES from Ketcher:", err);
alert(
"Unable to extract structure from the drawing editor. Please try again or switch to SMILES input mode.",
);
return;
}
} else {
console.warn("Ketcher not available, possibly still loading");
alert(
"The drawing editor is still loading. Please wait a moment and try again.",
);
return;
}
} else { } else {
textSmiles = $("#index-form-text-input").val().trim(); textSmiles = $("#index-form-text-input").val().trim();
} }
if (textSmiles === "") { if (textSmiles === "") {
alert("Please enter a SMILES string or draw a structure.");
return; return;
} }

View File

@ -138,6 +138,25 @@
</div> </div>
{# prettier-ignore-start #} {# prettier-ignore-start #}
<script> <script>
// Helper function to safely get Ketcher instance from iframe
function getKetcherInstance(iframeId) {
const ketcherFrame = document.getElementById(iframeId);
if (!ketcherFrame) {
console.error("Ketcher iframe not found:", iframeId);
return null;
}
try {
if ('contentWindow' in ketcherFrame && ketcherFrame.contentWindow.ketcher) {
return ketcherFrame.contentWindow.ketcher;
}
} catch (err) {
console.error("Cannot access Ketcher iframe - possible CORS issue:", err);
}
return null;
}
function predictKetcherToTextInput() { function predictKetcherToTextInput() {
$("#predict-smiles").val(this.ketcher.getSmiles()); $("#predict-smiles").val(this.ketcher.getSmiles());
} }
@ -172,11 +191,22 @@
let smiles = $("#predict-smiles").val().trim(); let smiles = $("#predict-smiles").val().trim();
// If SMILES input is empty, try to get from Ketcher // If SMILES input is empty, try to get from Ketcher
if (!smiles && window.predictKetcher) { if (!smiles) {
smiles = window.predictKetcher.getSmiles().trim(); const ketcher = getKetcherInstance('predict-ketcher');
if (ketcher && ketcher.getSmiles) {
try {
smiles = ketcher.getSmiles().trim();
if (smiles) { if (smiles) {
$("#predict-smiles").val(smiles); $("#predict-smiles").val(smiles);
} }
} catch (err) {
console.error("Failed to get SMILES from Ketcher:", err);
alert("Unable to extract structure from the drawing editor. Please enter a SMILES string instead.");
button.prop("disabled", false);
button.text("Predict");
return;
}
}
} }
// Basic validation // Basic validation