forked from enviPath/enviPy
[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:
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user