fix: more defensive ketcher reference

This commit is contained in:
2025-11-13 20:47:20 +13:00
parent 39faab3d11
commit 343af31387
2 changed files with 90 additions and 10 deletions

View File

@ -256,6 +256,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
@ -359,10 +384,16 @@
}, 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) {
if (smiles && smiles.trim() !== "") { try {
$("#index-form-text-input").val(smiles); const smiles = ketcher.getSmiles();
if (smiles && smiles.trim() !== "") {
$("#index-form-text-input").val(smiles);
}
} catch (err) {
console.error("Failed to sync Ketcher to text input:", err);
// Non-critical error, just log it
} }
} }
} }
@ -431,13 +462,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

@ -137,6 +137,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());
} }
@ -171,10 +190,21 @@
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 (smiles) { if (ketcher && ketcher.getSmiles) {
$("#predict-smiles").val(smiles); try {
smiles = ketcher.getSmiles().trim();
if (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;
}
} }
} }