This commit is contained in:
Dobromir Popov
2025-10-24 14:20:40 +03:00
parent b970c4ca4d
commit d4ed894a92
4 changed files with 62 additions and 56 deletions

View File

@@ -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"
} }
} }

View File

@@ -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);
} }

View File

@@ -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) {

View File

@@ -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 %}