forked from enviPath/enviPy
Compare commits
8 Commits
refactor/h
...
d584791ee8
| Author | SHA1 | Date | |
|---|---|---|---|
| d584791ee8 | |||
| e60052b05c | |||
| 3ff8d938d6 | |||
| a7f48c2cf9 | |||
| 39faab3d11 | |||
| 4e80cd63cd | |||
| 6592f0a68e | |||
| 21d30a923f |
@ -1,5 +1,6 @@
|
|||||||
{% extends "framework.html" %}
|
{% extends "framework.html" %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
|
{% load envipytags %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="panel-group" id="reviewListAccordion">
|
<div class="panel-group" id="reviewListAccordion">
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
|
|||||||
@ -151,11 +151,6 @@
|
|||||||
>Package</a
|
>Package</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="{{ meta.server_url }}/search" id="searchLink"
|
|
||||||
>Search</a
|
|
||||||
>
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ meta.server_url }}/model" id="modelLink"
|
<a href="{{ meta.server_url }}/model" id="modelLink"
|
||||||
>Modelling</a
|
>Modelling</a
|
||||||
|
|||||||
@ -113,7 +113,7 @@
|
|||||||
|
|
||||||
{# License - inside paper if present #}
|
{# License - inside paper if present #}
|
||||||
{% if meta.url_contains_package and meta.current_package.license %}
|
{% if meta.url_contains_package and meta.current_package.license %}
|
||||||
<div class="collapse-arrow bg-base-200 collapse m-8">
|
<div class="collapse-arrow bg-base-200 collapse p-8">
|
||||||
<input type="checkbox" checked />
|
<input type="checkbox" checked />
|
||||||
<div class="collapse-title text-xl font-medium">License</div>
|
<div class="collapse-title text-xl font-medium">License</div>
|
||||||
<div class="collapse-content">
|
<div class="collapse-content">
|
||||||
|
|||||||
@ -27,7 +27,7 @@
|
|||||||
class="dropdown-content menu bg-base-100 rounded-box z-1 w-52 p-2 shadow-sm"
|
class="dropdown-content menu bg-base-100 rounded-box z-1 w-52 p-2 shadow-sm"
|
||||||
>
|
>
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ meta.server_url }}/Package" id="packageLink">Package</a>
|
<a href="{{ meta.server_url }}/package" id="packageLink">Package</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ meta.server_url }}/pathway" id="pathwayLink">Pathway</a>
|
<a href="{{ meta.server_url }}/pathway" id="pathwayLink">Pathway</a>
|
||||||
|
|||||||
@ -119,7 +119,9 @@
|
|||||||
>Ibuprofen</a
|
>Ibuprofen</a
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
<a class="absolute top-0 left-[calc(100%-5.4rem)]" href="#"
|
<a
|
||||||
|
class="absolute top-0 left-[calc(100%-5.4rem)]"
|
||||||
|
href="/predict"
|
||||||
>Advanced</a
|
>Advanced</a
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
@ -256,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
|
||||||
@ -359,10 +386,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 +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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -26,6 +26,7 @@
|
|||||||
placeholder="Name"
|
placeholder="Name"
|
||||||
id="name"
|
id="name"
|
||||||
class="input input-md w-full"
|
class="input input-md w-full"
|
||||||
|
autofocus
|
||||||
/>
|
/>
|
||||||
<span>Name</span>
|
<span>Name</span>
|
||||||
</label>
|
</label>
|
||||||
@ -137,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());
|
||||||
}
|
}
|
||||||
@ -171,10 +191,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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -3,12 +3,31 @@
|
|||||||
{% block title %}enviPath - Sign In{% endblock %}
|
{% block title %}enviPath - Sign In{% endblock %}
|
||||||
|
|
||||||
{% block extra_styles %}
|
{% block extra_styles %}
|
||||||
/* Tab styling */ .tab-content { display: none; } .tab-content.active {
|
<style>
|
||||||
display: block; } input[type="radio"].tab-radio { display: none; } .tab-label
|
/* Tab styling */
|
||||||
{ cursor: pointer; padding: 0.75rem 1.5rem; border-bottom: 2px solid
|
.tab-content {
|
||||||
transparent; transition: all 0.3s ease; } .tab-label:hover { background-color:
|
display: none;
|
||||||
rgba(0, 0, 0, 0.05); } input[type="radio"].tab-radio:checked + .tab-label {
|
}
|
||||||
border-bottom-color: #3b82f6; font-weight: 600; }
|
.tab-content.active {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
input[type="radio"].tab-radio {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.tab-label {
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0.75rem 1.5rem;
|
||||||
|
border-bottom: 2px solid transparent;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
.tab-label:hover {
|
||||||
|
background-color: rgba(0, 0, 0, 0.05);
|
||||||
|
}
|
||||||
|
input[type="radio"].tab-radio:checked + .tab-label {
|
||||||
|
border-bottom-color: #3b82f6;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|||||||
@ -18,6 +18,8 @@
|
|||||||
rel="stylesheet"
|
rel="stylesheet"
|
||||||
type="text/css"
|
type="text/css"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
{% block extra_styles %}{% endblock %}
|
||||||
</head>
|
</head>
|
||||||
<body class="bg-base-100">
|
<body class="bg-base-100">
|
||||||
<div class="flex h-screen">
|
<div class="flex h-screen">
|
||||||
|
|||||||
Reference in New Issue
Block a user