wip
This commit is contained in:
@@ -1,51 +1,5 @@
|
|||||||
{
|
{
|
||||||
"annotations": [
|
"annotations": [
|
||||||
{
|
|
||||||
"annotation_id": "2179b968-abff-40de-a8c9-369f0990fb8a",
|
|
||||||
"symbol": "ETH/USDT",
|
|
||||||
"timeframe": "1s",
|
|
||||||
"entry": {
|
|
||||||
"timestamp": "2025-10-22 21:30:07",
|
|
||||||
"price": 3721.91,
|
|
||||||
"index": 250
|
|
||||||
},
|
|
||||||
"exit": {
|
|
||||||
"timestamp": "2025-10-22 21:33:35",
|
|
||||||
"price": 3742.8,
|
|
||||||
"index": 458
|
|
||||||
},
|
|
||||||
"direction": "LONG",
|
|
||||||
"profit_loss_pct": 0.5612709603402642,
|
|
||||||
"notes": "",
|
|
||||||
"created_at": "2025-10-23T00:35:40.358277",
|
|
||||||
"market_context": {
|
|
||||||
"entry_state": {},
|
|
||||||
"exit_state": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"annotation_id": "d1944f94-33d8-4ebd-a690-1a8f788c7757",
|
|
||||||
"symbol": "ETH/USDT",
|
|
||||||
"timeframe": "1s",
|
|
||||||
"entry": {
|
|
||||||
"timestamp": "2025-10-22 21:33:54",
|
|
||||||
"price": 3744.1,
|
|
||||||
"index": 477
|
|
||||||
},
|
|
||||||
"exit": {
|
|
||||||
"timestamp": "2025-10-22 21:34:33",
|
|
||||||
"price": 3737.13,
|
|
||||||
"index": 498
|
|
||||||
},
|
|
||||||
"direction": "SHORT",
|
|
||||||
"profit_loss_pct": 0.1861595577041158,
|
|
||||||
"notes": "",
|
|
||||||
"created_at": "2025-10-23T16:52:17.692407",
|
|
||||||
"market_context": {
|
|
||||||
"entry_state": {},
|
|
||||||
"exit_state": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"annotation_id": "967f91f4-5f01-4608-86af-4a006d55bd3c",
|
"annotation_id": "967f91f4-5f01-4608-86af-4a006d55bd3c",
|
||||||
"symbol": "ETH/USDT",
|
"symbol": "ETH/USDT",
|
||||||
@@ -91,10 +45,33 @@
|
|||||||
"entry_state": {},
|
"entry_state": {},
|
||||||
"exit_state": {}
|
"exit_state": {}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"annotation_id": "ee34388a-fcad-4c7e-8a0a-2e8d205d5357",
|
||||||
|
"symbol": "ETH/USDT",
|
||||||
|
"timeframe": "1m",
|
||||||
|
"entry": {
|
||||||
|
"timestamp": "2025-10-24 04:06",
|
||||||
|
"price": 3895.67,
|
||||||
|
"index": 18
|
||||||
|
},
|
||||||
|
"exit": {
|
||||||
|
"timestamp": "2025-10-24 05:24",
|
||||||
|
"price": 3965,
|
||||||
|
"index": 36
|
||||||
|
},
|
||||||
|
"direction": "LONG",
|
||||||
|
"profit_loss_pct": 1.7796681957147276,
|
||||||
|
"notes": "",
|
||||||
|
"created_at": "2025-10-24T13:55:31.843201",
|
||||||
|
"market_context": {
|
||||||
|
"entry_state": {},
|
||||||
|
"exit_state": {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"metadata": {
|
"metadata": {
|
||||||
"total_annotations": 4,
|
"total_annotations": 5,
|
||||||
"last_updated": "2025-10-24T12:56:59.390345"
|
"last_updated": "2025-10-24T13:55:31.843201"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -305,14 +305,19 @@ class ChartManager {
|
|||||||
|
|
||||||
// Add click handler for annotations
|
// Add click handler for annotations
|
||||||
plotElement.on('plotly_clickannotation', (eventData) => {
|
plotElement.on('plotly_clickannotation', (eventData) => {
|
||||||
console.log('Annotation clicked:', eventData);
|
console.log('=== plotly_clickannotation event fired ===');
|
||||||
|
console.log('Event data:', eventData);
|
||||||
|
console.log('Annotation:', eventData.annotation);
|
||||||
|
|
||||||
const annotationName = eventData.annotation.name;
|
const annotationName = eventData.annotation.name;
|
||||||
|
console.log('Annotation name:', annotationName);
|
||||||
|
|
||||||
if (annotationName) {
|
if (annotationName) {
|
||||||
const parts = annotationName.split('_');
|
const parts = annotationName.split('_');
|
||||||
const action = parts[0]; // 'entry', 'exit', or 'delete'
|
const action = parts[0]; // 'entry', 'exit', or 'delete'
|
||||||
const annotationId = parts[1];
|
const annotationId = parts[1];
|
||||||
|
|
||||||
console.log(`Annotation action: ${action}, ID: ${annotationId}`);
|
console.log(`Parsed - Action: ${action}, ID: ${annotationId}`);
|
||||||
|
|
||||||
if (action === 'delete') {
|
if (action === 'delete') {
|
||||||
this.handleAnnotationClick(annotationId, 'delete');
|
this.handleAnnotationClick(annotationId, 'delete');
|
||||||
@@ -694,15 +699,27 @@ class ChartManager {
|
|||||||
* Handle annotation click for editing/deleting
|
* Handle annotation click for editing/deleting
|
||||||
*/
|
*/
|
||||||
handleAnnotationClick(annotationId, action) {
|
handleAnnotationClick(annotationId, action) {
|
||||||
console.log(`Annotation ${action}:`, annotationId);
|
console.log(`=== handleAnnotationClick called ===`);
|
||||||
|
console.log(` Action: ${action}`);
|
||||||
|
console.log(` Annotation ID: ${annotationId}`);
|
||||||
|
console.log(` window.deleteAnnotation type: ${typeof window.deleteAnnotation}`);
|
||||||
|
|
||||||
if (action === 'delete') {
|
if (action === 'delete') {
|
||||||
|
console.log('Delete action confirmed, showing confirm dialog...');
|
||||||
if (confirm('Delete this annotation?')) {
|
if (confirm('Delete this annotation?')) {
|
||||||
|
console.log('User confirmed deletion');
|
||||||
if (window.deleteAnnotation) {
|
if (window.deleteAnnotation) {
|
||||||
|
console.log('Calling window.deleteAnnotation...');
|
||||||
window.deleteAnnotation(annotationId);
|
window.deleteAnnotation(annotationId);
|
||||||
|
} else {
|
||||||
|
console.error('window.deleteAnnotation is not available!');
|
||||||
|
alert('Delete function not available. Please refresh the page.');
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
console.log('User cancelled deletion');
|
||||||
}
|
}
|
||||||
} else if (action === 'edit') {
|
} else if (action === 'edit') {
|
||||||
|
console.log('Edit action');
|
||||||
if (window.appState && window.appState.chartManager) {
|
if (window.appState && window.appState.chartManager) {
|
||||||
window.appState.chartManager.editAnnotation(annotationId);
|
window.appState.chartManager.editAnnotation(annotationId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -369,6 +369,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function setupGlobalFunctions() {
|
function setupGlobalFunctions() {
|
||||||
|
console.log('=== setupGlobalFunctions called ===');
|
||||||
|
console.log('deleteAnnotation function exists:', typeof deleteAnnotation);
|
||||||
|
console.log('highlightAnnotation function exists:', typeof highlightAnnotation);
|
||||||
|
|
||||||
// Make functions globally available
|
// Make functions globally available
|
||||||
window.showError = showError;
|
window.showError = showError;
|
||||||
window.showSuccess = showSuccess;
|
window.showSuccess = showSuccess;
|
||||||
@@ -382,6 +386,14 @@
|
|||||||
console.log(' - window.renderAnnotationsList:', typeof window.renderAnnotationsList);
|
console.log(' - window.renderAnnotationsList:', typeof window.renderAnnotationsList);
|
||||||
console.log(' - window.showError:', typeof window.showError);
|
console.log(' - window.showError:', typeof window.showError);
|
||||||
console.log(' - window.showSuccess:', typeof window.showSuccess);
|
console.log(' - window.showSuccess:', typeof window.showSuccess);
|
||||||
|
|
||||||
|
// Test call
|
||||||
|
console.log('Testing window.deleteAnnotation availability...');
|
||||||
|
if (typeof window.deleteAnnotation === 'function') {
|
||||||
|
console.log('✓ window.deleteAnnotation is ready');
|
||||||
|
} else {
|
||||||
|
console.error('✗ window.deleteAnnotation is NOT a function!');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderAnnotationsList(annotations) {
|
function renderAnnotationsList(annotations) {
|
||||||
|
|||||||
@@ -74,11 +74,11 @@
|
|||||||
<!-- jQuery (for convenience) -->
|
<!-- jQuery (for convenience) -->
|
||||||
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
|
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
|
||||||
|
|
||||||
<!-- Custom JavaScript -->
|
<!-- Custom JavaScript with cache busting -->
|
||||||
<script src="{{ url_for('static', filename='js/chart_manager.js') }}"></script>
|
<script src="{{ url_for('static', filename='js/chart_manager.js') }}?v={{ range(1, 10000) | random }}"></script>
|
||||||
<script src="{{ url_for('static', filename='js/annotation_manager.js') }}"></script>
|
<script src="{{ url_for('static', filename='js/annotation_manager.js') }}?v={{ range(1, 10000) | random }}"></script>
|
||||||
<script src="{{ url_for('static', filename='js/time_navigator.js') }}"></script>
|
<script src="{{ url_for('static', filename='js/time_navigator.js') }}?v={{ range(1, 10000) | random }}"></script>
|
||||||
<script src="{{ url_for('static', filename='js/training_controller.js') }}"></script>
|
<script src="{{ url_for('static', filename='js/training_controller.js') }}?v={{ range(1, 10000) | random }}"></script>
|
||||||
|
|
||||||
{% block extra_js %}{% endblock %}
|
{% block extra_js %}{% endblock %}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user