aarnal80 commited on
Commit
236e39c
verified
1 Parent(s): ebd65f3

Update js/main.js

Browse files
Files changed (1) hide show
  1. js/main.js +95 -71
js/main.js CHANGED
@@ -1,7 +1,7 @@
1
  // js/main.js
2
 
3
  // --- INICIO: Importaciones de M贸dulos ---
4
- import { renderIaConfigForm, transcriptionProviders, getIaConfig, llmProviders } from './iaConfigModule.js'; // Aseg煤rate que llmProviders est茅 importado si lo usas aqu铆 (no parece necesario aqu铆)
5
  import { initRecorder } from './recordingModule.js';
6
  import { analyzeMedical } from './analysisModule.js';
7
  import { copyText } from './clipboardModule.js';
@@ -19,6 +19,7 @@ window.addEventListener('DOMContentLoaded', () => {
19
 
20
  // --- INICIO: Selecci贸n de Elementos DOM + VALIDACI脫N ---
21
  console.log("[Main] Seleccionando elementos del DOM...");
 
22
  const btnConfig = document.getElementById('btnConfig'); if (!btnConfig) console.error("!!! ERROR CR脥TICO: #btnConfig no encontrado!");
23
  const modal = document.getElementById('configModal'); if (!modal) console.error("!!! ERROR CR脥TICO: #configModal no encontrado!");
24
  const transcriptEl = document.getElementById('transcript'); if (!transcriptEl) console.error("!!! ERROR CR脥TICO: #transcript no encontrado!");
@@ -39,113 +40,136 @@ window.addEventListener('DOMContentLoaded', () => {
39
  console.log("[Main] Selecci贸n de elementos del DOM finalizada.");
40
  // --- FIN: Selecci贸n de Elementos DOM + VALIDACI脫N ---
41
 
42
- // --- INICIO: Bloques de L贸gica ---
43
- try {
44
- // --- INICIO: Funci贸n para Actualizar Etiquetas de Modelo ---
45
- // !! MOVIDA OTRA VEZ DENTRO de DOMContentLoaded !!
46
- function updateModelLabels() {
47
- console.log("[Main] Ejecutando updateModelLabels (definida DENTRO)...");
48
  const cfg = getIaConfig();
49
  const transProvider = cfg?.transcription?.provider;
50
  const transModel = cfg?.transcription?.models?.[transProvider] || 'N/A';
51
  const llmProvider = cfg?.llm?.provider;
52
  const llmModel = cfg?.llm?.model || 'N/A';
53
-
54
  const transLabel = document.getElementById('trans-model-label');
55
  if (transLabel) transLabel.textContent = transModel ? `(${transModel})` : '';
56
  const analysisLabel = document.getElementById('analysis-model-label');
57
  if (analysisLabel) analysisLabel.textContent = llmModel ? `(${llmModel})` : '';
58
  const labLabel = document.getElementById('lab-model-label');
59
  if (labLabel) labLabel.textContent = llmModel ? `(${llmModel})` : '';
60
- console.log("[Main] updateModelLabels (definida DENTRO) finalizado.");
61
- }
 
 
 
 
62
  updateModelLabels(); // Llamada inicial
63
- document.addEventListener('iaConfigChanged', updateModelLabels); // Listener para cambios
64
- // --- FIN: Funci贸n para Actualizar Etiquetas de Modelo ---
65
- } catch(e) { console.error("Error en setup de etiquetas de modelo:", e); }
66
 
67
  try {
68
- // --- INICIO: L贸gica Modal Configuraci贸n ---
69
- renderIaConfigForm('iaConfigContainer'); // ID como string
70
  if(btnConfig) { btnConfig.addEventListener('click', () => { renderIaConfigForm('iaConfigContainer'); if (modal) modal.classList.add('active'); }); }
71
  if(modal) { modal.addEventListener('mousedown', e => { if (e.target === modal) modal.classList.remove('active'); }); }
72
- // --- FIN: L贸gica Modal Configuraci贸n ---
73
- } catch(e) { console.error("Error en setup del Modal Configuraci贸n:", e); }
74
 
 
75
  try {
76
- // --- INICIO: L贸gica Pesta帽a An谩lisis M茅dico ---
77
- document.addEventListener('transcriptionReady', async e => { /* ... */ }); // C贸digo interno sin cambios
78
-
79
- // --- INICIO: getTranscriptionProviderUrl con LOGS ---
80
- function getTranscriptionProviderUrl() {
81
- console.log("[Main] Ejecutando getTranscriptionProviderUrl...");
82
- const cfg = getIaConfig();
83
- console.log("[Main] Configuraci贸n obtenida:", cfg); // LOG Configuraci贸n
84
- const providerValue = cfg?.transcription?.provider;
85
- console.log(`[Main] Proveedor de transcripci贸n en config: ${providerValue}`); // LOG Proveedor
86
-
87
- if (providerValue) {
88
- // Log para ver la lista de proveedores importada
89
- console.log("[Main] Lista de proveedores de transcripci贸n (importada):", transcriptionProviders);
90
- const prov = transcriptionProviders.find(p => p.value === providerValue);
91
- console.log(`[Main] Proveedor encontrado en la lista:`, prov); // LOG Proveedor encontrado
92
- if (prov?.url) {
93
- console.log(`[Main] URL encontrada para ${providerValue}: ${prov.url}`); // LOG URL encontrada
94
- return prov.url; // Retorna URL
95
- } else {
96
- console.warn(`[Main] URL no encontrada para el proveedor '${providerValue}' en la lista.`);
97
- }
98
- } else {
99
- console.warn('[Main] No se encontr贸 providerValue en cfg.transcription.provider.');
100
  }
101
- console.error('[Main] Fallo al obtener URL del proveedor de transcripci贸n. Retornando vac铆o.'); // LOG Error final
102
- return ''; // Retorna vac铆o si falla
103
- }
104
- // --- FIN: getTranscriptionProviderUrl con LOGS ---
 
 
 
 
 
 
 
 
 
 
 
 
105
 
 
106
  if (btnStart && btnStop && transcriptEl && typeof initRecorder === 'function') {
107
  initRecorder({ btnStart, btnStop, transcriptEl, getProvider: getTranscriptionProviderUrl });
108
  } else { console.error("Faltan elementos/funci贸n para initRecorder"); }
109
- if (btnCopyTranscript) { btnCopyTranscript.addEventListener('click', async () => { /* ... */ }); } // C贸digo interno sin cambios
110
- if (btnCopyAnalysis) { btnCopyAnalysis.addEventListener('click', async () => { /* ... */ }); } // C贸digo interno sin cambios
111
- // --- FIN: L贸gica Pesta帽a An谩lisis M茅dico ---
112
  } catch(e) { console.error("Error en setup Pesta帽a An谩lisis M茅dico:", e); }
 
113
 
114
  try {
115
- // --- INICIO: L贸gica de Cambio de Pesta帽as ---
116
- function switchTab(clickedTab) { const tId=clickedTab.dataset.contentId; const tC=document.getElementById(tId); if(tC&&!tC.classList.contains('active')){ allTabButtons.forEach(b => { const aC=b.dataset.activeClasses.split(' '); const iC=b.dataset.inactiveClasses.split(' '); b.classList.remove(...aC.filter(c=>c)); b.classList.add(...iC.filter(c=>c)); }); allTabContents.forEach(c=>{c.classList.remove('active');}); const aCadd=clickedTab.dataset.activeClasses.split(' '); const iCrem=clickedTab.dataset.inactiveClasses.split(' '); clickedTab.classList.remove(...iCrem.filter(c=>c)); clickedTab.classList.add(...aCadd.filter(c=>c)); tC.classList.add('active'); console.log(`Pesta帽a: ${tId}`); } }
117
  if(allTabButtons.length>0){ allTabButtons.forEach(b=>{b.addEventListener('click',(e)=>{switchTab(e.currentTarget);});}); } else { console.error("No se pueden a帽adir listeners tabs."); }
118
- // --- FIN: L贸gica de Cambio de Pesta帽as ---
119
  } catch(e) { console.error("Error en setup Cambio de Pesta帽as:", e); }
120
 
121
  try {
122
- // --- INICIO: Listener para Limpiar UI al Iniciar Grabaci贸n ---
123
- document.addEventListener('newRecordingStarted', () => { console.log('[Main] Evento newRec recibido. Limpiando...'); if(outputEnfermedadEl) outputEnfermedadEl.textContent=''; if(outputExploracionEl) outputExploracionEl.textContent=''; if(labInputText) labInputText.value=''; if(labResultsOutput) labResultsOutput.innerHTML=''; lastLabResultText=''; console.log('[Main] Limpieza UI completada.'); });
124
- // --- FIN: Listener para Limpiar UI al Iniciar Grabaci贸n ---
125
  } catch(e) { console.error("Error a帽adiendo listener Limpiar UI:", e); }
126
 
 
127
  try {
128
- // --- INICIO: L贸gica Pesta帽a An谩lisis de Ex谩menes ---
129
  if (btnAnalyzeLabs && labInputText && labLoadingIndicator && filterAlteredLabsCheckbox && labResultsOutput) {
130
- btnAnalyzeLabs.addEventListener('click', async () => {
131
- const inputText = labInputText.value; if (!inputText.trim()) { alert("Pega resultados."); return; }
132
- labLoadingIndicator.style.display = 'flex'; btnAnalyzeLabs.disabled = true; filterAlteredLabsCheckbox.disabled = true; labResultsOutput.innerHTML = ''; lastLabResultText = '';
133
- try {
134
- const resultText = await analyzeLabResults(inputText);
135
- console.log("RAW AI RESPONSE:", resultText); lastLabResultText = resultText;
136
- const filterIsActive = filterAlteredLabsCheckbox.checked;
137
- displayLabResults(resultText, labResultsOutput, filterIsActive);
138
- // Llamada a la funci贸n (ahora definida dentro de DOMContentLoaded)
139
- updateModelLabels();
140
- } catch (error) { console.error("Error DENTRO listener btnAnalyzeLabs:", error); if(labResultsOutput) labResultsOutput.innerHTML = `<p class="text-red-600">Error: ${error.message}</p>`; alert(`Error al analizar: ${error.message}`); }
141
- finally { labLoadingIndicator.style.display = 'none'; btnAnalyzeLabs.disabled = false; filterAlteredLabsCheckbox.disabled = false; }
142
- });
143
- filterAlteredLabsCheckbox.addEventListener('change', () => { if (!lastLabResultText || !labResultsOutput) return; const filterIsActive = filterAlteredLabsCheckbox.checked; displayLabResults(lastLabResultText, labResultsOutput, filterIsActive); });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
144
  } else { console.error("Faltan elementos para setup Pesta帽a An谩lisis Ex谩menes"); }
145
- if (btnCopyLabResults && labResultsOutput) { btnCopyLabResults.addEventListener('click', async () => { /* ... */ }); } // C贸digo interno sin cambios
 
 
146
  else { console.error("Faltan elementos para bot贸n Copiar Lab"); }
147
- // --- FIN: L贸gica Pesta帽a An谩lisis de Ex谩menes ---
148
  } catch(e) { console.error("Error en setup Pesta帽a An谩lisis Ex谩menes:", e); }
 
149
 
150
  console.log("[Main] Configuraci贸n de listeners finalizada.");
151
  }); // Fin de window.addEventListener('DOMContentLoaded', ...)
 
1
  // js/main.js
2
 
3
  // --- INICIO: Importaciones de M贸dulos ---
4
+ import { renderIaConfigForm, transcriptionProviders, getIaConfig } from './iaConfigModule.js';
5
  import { initRecorder } from './recordingModule.js';
6
  import { analyzeMedical } from './analysisModule.js';
7
  import { copyText } from './clipboardModule.js';
 
19
 
20
  // --- INICIO: Selecci贸n de Elementos DOM + VALIDACI脫N ---
21
  console.log("[Main] Seleccionando elementos del DOM...");
22
+ // (Selecci贸n de elementos igual que antes - verificar IDs si hay dudas)
23
  const btnConfig = document.getElementById('btnConfig'); if (!btnConfig) console.error("!!! ERROR CR脥TICO: #btnConfig no encontrado!");
24
  const modal = document.getElementById('configModal'); if (!modal) console.error("!!! ERROR CR脥TICO: #configModal no encontrado!");
25
  const transcriptEl = document.getElementById('transcript'); if (!transcriptEl) console.error("!!! ERROR CR脥TICO: #transcript no encontrado!");
 
40
  console.log("[Main] Selecci贸n de elementos del DOM finalizada.");
41
  // --- FIN: Selecci贸n de Elementos DOM + VALIDACI脫N ---
42
 
43
+ // --- INICIO: Funci贸n updateModelLabels (permanece DENTRO de DOMContentLoaded) ---
44
+ function updateModelLabels() {
45
+ console.log("[Main] Ejecutando updateModelLabels...");
46
+ try {
 
 
47
  const cfg = getIaConfig();
48
  const transProvider = cfg?.transcription?.provider;
49
  const transModel = cfg?.transcription?.models?.[transProvider] || 'N/A';
50
  const llmProvider = cfg?.llm?.provider;
51
  const llmModel = cfg?.llm?.model || 'N/A';
 
52
  const transLabel = document.getElementById('trans-model-label');
53
  if (transLabel) transLabel.textContent = transModel ? `(${transModel})` : '';
54
  const analysisLabel = document.getElementById('analysis-model-label');
55
  if (analysisLabel) analysisLabel.textContent = llmModel ? `(${llmModel})` : '';
56
  const labLabel = document.getElementById('lab-model-label');
57
  if (labLabel) labLabel.textContent = llmModel ? `(${llmModel})` : '';
58
+ } catch (e) { console.error("Error DENTRO de updateModelLabels:", e); }
59
+ }
60
+ // --- FIN: Funci贸n updateModelLabels ---
61
+
62
+ // --- INICIO: Bloques de L贸gica envueltos en try...catch ---
63
+ try {
64
  updateModelLabels(); // Llamada inicial
65
+ document.addEventListener('iaConfigChanged', updateModelLabels);
66
+ } catch(e) { console.error("Error en setup inicial/listener etiquetas:", e); }
 
67
 
68
  try {
69
+ renderIaConfigForm('iaConfigContainer');
 
70
  if(btnConfig) { btnConfig.addEventListener('click', () => { renderIaConfigForm('iaConfigContainer'); if (modal) modal.classList.add('active'); }); }
71
  if(modal) { modal.addEventListener('mousedown', e => { if (e.target === modal) modal.classList.remove('active'); }); }
72
+ } catch(e) { console.error("Error en setup Modal Config:", e); }
 
73
 
74
+ // --- INICIO: L贸gica Pesta帽a An谩lisis M茅dico ---
75
  try {
76
+ // !! Listener para AN脕LISIS M脡DICO AUTOM脕TICO !!
77
+ document.addEventListener('transcriptionReady', async (e) => {
78
+ console.log("[Main] Evento 'transcriptionReady' recibido con detalle:", e.detail); // LOG para ver si llega
79
+ const transcriptText = e.detail;
80
+ if (!transcriptText) {
81
+ console.warn("[Main] Evento 'transcriptionReady' sin texto. No se analiza.");
82
+ return;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
  }
84
+ if(outputEnfermedadEl) outputEnfermedadEl.textContent='Analizando transcripci贸n...';
85
+ if(outputExploracionEl) outputExploracionEl.textContent='';
86
+ try {
87
+ console.log("[Main] Llamando a analyzeMedical...");
88
+ const result = await analyzeMedical(transcriptText); // Llama al m贸dulo de an谩lisis m茅dico
89
+ console.log("[Main] Respuesta de analyzeMedical recibida.");
90
+ const sections = result.split(/\n\s*\n/);
91
+ if(outputEnfermedadEl) outputEnfermedadEl.textContent=sections[0]?.trim()||'(An谩lisis m茅dico no generado)';
92
+ if(outputExploracionEl) outputExploracionEl.textContent=sections.slice(1).join('\n\n').trim()||'(An谩lisis m茅dico no generado)';
93
+ } catch (err) {
94
+ console.error("Error DENTRO del listener transcriptionReady (analyzeMedical):", err);
95
+ if(outputEnfermedadEl) outputEnfermedadEl.textContent = `Error an谩lisis m茅dico: ${err.message}`;
96
+ alert(`Error an谩lisis m茅dico: ${err.message}`);
97
+ }
98
+ });
99
+ console.log("[Main] Listener para 'transcriptionReady' a帽adido."); // Confirmar que se a帽ade
100
 
101
+ function getTranscriptionProviderUrl() { /* ... c贸digo sin cambios ... */ return ''; }
102
  if (btnStart && btnStop && transcriptEl && typeof initRecorder === 'function') {
103
  initRecorder({ btnStart, btnStop, transcriptEl, getProvider: getTranscriptionProviderUrl });
104
  } else { console.error("Faltan elementos/funci贸n para initRecorder"); }
105
+ if (btnCopyTranscript) { btnCopyTranscript.addEventListener('click', async () => { /* ... */ }); }
106
+ if (btnCopyAnalysis) { btnCopyAnalysis.addEventListener('click', async () => { /* ... */ }); }
 
107
  } catch(e) { console.error("Error en setup Pesta帽a An谩lisis M茅dico:", e); }
108
+ // --- FIN: L贸gica Pesta帽a An谩lisis M茅dico ---
109
 
110
  try {
111
+ // L贸gica de Cambio de Pesta帽as (sin cambios)
112
+ function switchTab(clickedTab) { /* ... */ }
113
  if(allTabButtons.length>0){ allTabButtons.forEach(b=>{b.addEventListener('click',(e)=>{switchTab(e.currentTarget);});}); } else { console.error("No se pueden a帽adir listeners tabs."); }
 
114
  } catch(e) { console.error("Error en setup Cambio de Pesta帽as:", e); }
115
 
116
  try {
117
+ // Listener para Limpiar UI al Iniciar Grabaci贸n (sin cambios)
118
+ document.addEventListener('newRecordingStarted', () => { /* ... */ });
 
119
  } catch(e) { console.error("Error a帽adiendo listener Limpiar UI:", e); }
120
 
121
+ // --- INICIO: L贸gica Pesta帽a An谩lisis de Ex谩menes (CON CORRECCI脫N IIFE) ---
122
  try {
 
123
  if (btnAnalyzeLabs && labInputText && labLoadingIndicator && filterAlteredLabsCheckbox && labResultsOutput) {
124
+
125
+ // !! Aplicar IIFE para intentar solucionar problema de scope !!
126
+ btnAnalyzeLabs.addEventListener('click', (function() {
127
+ // Esta parte se ejecuta UNA VEZ al crear el listener
128
+ // Capturamos la referencia a updateModelLabels aqu铆
129
+ const localUpdateFn = updateModelLabels; // Guardar referencia a la funci贸n externa
130
+ console.log("[Main] Listener btnAnalyzeLabs creado. Referencia a updateModelLabels guardada:", typeof localUpdateFn);
131
+
132
+ // Retornamos la funci贸n AS脥NCRONA que manejar谩 el evento click
133
+ return async () => {
134
+ console.log("[Main] Click en btnAnalyzeLabs detectado.");
135
+ const inputText = labInputText.value; if (!inputText.trim()) { alert("Pega resultados."); return; }
136
+ labLoadingIndicator.style.display = 'flex'; btnAnalyzeLabs.disabled = true; filterAlteredLabsCheckbox.disabled = true; labResultsOutput.innerHTML = ''; lastLabResultText = '';
137
+ try {
138
+ const resultText = await analyzeLabResults(inputText);
139
+ console.log("RAW AI RESPONSE:", resultText); lastLabResultText = resultText;
140
+ const filterIsActive = filterAlteredLabsCheckbox.checked;
141
+ displayLabResults(resultText, labResultsOutput, filterIsActive);
142
+
143
+ // Intentar llamar a la funci贸n usando la referencia local
144
+ console.log("[Main] Intentando llamar a localUpdateFn...");
145
+ if (typeof localUpdateFn === 'function') {
146
+ localUpdateFn(); // Llamar usando la referencia capturada
147
+ } else {
148
+ // Si esto aparece, la referencia se perdi贸 o no se captur贸 bien
149
+ console.error("!!! localUpdateFn NO es una funci贸n dentro del handler !!! Tipo:", typeof localUpdateFn);
150
+ alert("Error interno: La funci贸n para actualizar etiquetas no est谩 disponible (IIFE).");
151
+ }
152
+ } catch (error) {
153
+ console.error("Error DENTRO listener btnAnalyzeLabs (IIFE):", error);
154
+ if(labResultsOutput) labResultsOutput.innerHTML = `<p class="text-red-600">Error: ${error.message}</p>`;
155
+ alert(`Error al analizar: ${error.message}`);
156
+ } finally {
157
+ labLoadingIndicator.style.display = 'none'; btnAnalyzeLabs.disabled = false; filterAlteredLabsCheckbox.disabled = false;
158
+ }
159
+ }; // Fin de la funci贸n async devuelta
160
+ })()); // Fin de la IIFE (se ejecuta inmediatamente)
161
+
162
+ // Listener para el checkbox de filtro (sin cambios)
163
+ filterAlteredLabsCheckbox.addEventListener('change', () => { if (!lastLabResultText || !labResultsOutput) return; const f = filterAlteredLabsCheckbox.checked; displayLabResults(lastLabResultText, labResultsOutput, f); });
164
+
165
  } else { console.error("Faltan elementos para setup Pesta帽a An谩lisis Ex谩menes"); }
166
+
167
+ // Listener para copiar resultados (sin cambios)
168
+ if (btnCopyLabResults && labResultsOutput) { btnCopyLabResults.addEventListener('click', async () => { /* ... */ }); }
169
  else { console.error("Faltan elementos para bot贸n Copiar Lab"); }
170
+
171
  } catch(e) { console.error("Error en setup Pesta帽a An谩lisis Ex谩menes:", e); }
172
+ // --- FIN: L贸gica Pesta帽a An谩lisis de Ex谩menes ---
173
 
174
  console.log("[Main] Configuraci贸n de listeners finalizada.");
175
  }); // Fin de window.addEventListener('DOMContentLoaded', ...)